NGINX 1.9.1のSO_REUSEPORTによるパフォーマンスの向上

NGINXバージョン1.9.1には、 SO_REUSEPORT



ソケットオプションを使用できる新しい機能があります。これは、DragonFly BSDやLinux(カーネル3.9以降)などの最新バージョンのオペレーティングシステムで使用できます。 このオプションを使用すると、同じアドレスとポートで複数のリスニングソケットを一度に開くことができます。 この場合、カーネルはそれらの間の着信接続を分散します。



(NGINX Plusでは、この機能はリリース7に登場し、今年後半にリリースされます。)



SO_REUSEPORT



は、さまざまな問題を解決するための多くの潜在的な用途があります。 そのため、一部のアプリケーションは実行可能コードをその場で更新するために使用できます(NGINXは、太古の昔から、異なるメカニズムを使用してこの可能性を常に持っていました)。 NGINXでは、このオプションを有効にすると、ロックのロックを減らすことでパフォーマンスが向上する場合があります。



図に示すように、 SO_REUSEPORT



ないSO_REUSEPORT



1つのリッスンソケットは多くのワーカープロセスに分割され、各ワーカープロセスはそこから新しい接続を受信しようとします。











SO_REUSEPORT



オプションを使用すると、各ワークフローに1つずつ、多くのリスニングソケットがあります。 オペレーティングシステムのカーネルは、新しい接続が取得されるのはどれであるかを分散します(したがって、どのワークプロセスが最終的にそれを受信します)。











これにより、マルチコアシステムは、複数のワークフローが同時に接続を受け入れる場合のブロッキングを削減できます。 ただし、これは、長い操作でワークフローの1つがブロックされると、既に処理中の接続だけでなく、キューでまだ​​待機している接続にも影響することを意味します。



構成



http



またはstream



モジュールでSO_REUSEPORT



を有効にするには、 reuseport



の例に示すように、 listen



ディレクティブのreuseport



パラメーターを指定するだけで十分です。

 http { server { listen 80 reuseport; server_name example.org; ... } } stream { server { listen 12345 reuseport; ... } }
      
      





このモードではミューテックスは必要ないため、 accept_mutex



を指定するaccept_mutex



、このソケットのreuseport



自動的に無効にaccept_mutex



ます。



reuseport



パフォーマンスのテスト



36の核AWSインスタンスで4つのNGINXワークフローを使用してwrkを使用して測定を実行しました 。 ネットワークのオーバーヘッドを最小限に抑えるために、クライアントとサーバーはループバックインターフェイスを介して機能し、NGINXはOK



文字列を返すように構成されました。 3つの構成を比較しました: accept_mutex on



(デフォルト)、c accept_mutex off



reuseport



。 図からわかるように、 reuseport



2〜3回含めると、1秒あたりのリクエスト数が増え、遅延と変動が減少します。











また、クライアントとサーバーが異なるマシンで実行されており、htmlファイルが要求されたときに測定が行われました。 表からわかるように、 reuseport



を使用すると、以前の測定と同様に遅延が減少し、その広がりはさらに小さくなります(ほぼ1桁)。 他のテストでも、このオプションを使用すると良い結果が得られます。 再利用reuseport



を使用してreuseport



負荷はワークフロー全体に均等に分散されました。 accept_mutex



ディレクティブをaccept_mutex



と、テストの開始時に不均衡が発生し、シャットダウンのイベントでは、すべてのワークプロセスがより多くのプロセッサー時間をaccept_mutex



た。



待ち時間(ミリ秒) レイテンシー標準偏差(ミリ秒) CPU負荷
デフォルト 15.65 26.59 0.3
accept_mutex off 15.59 26.48 10
再利用ポート 12.35 3.15 0.3


これらのテストでは、要求の頻度は非常に高く、複雑な処理は必要ありませんでした。 さまざまな観察から、負荷がこのパターンに一致する場合に、 reuseport



オプションの使用による最大の効果が得られることが確認されています。 したがって、メールトラフィックはこれらの条件を完全に満たさないため、 mail



モジュールでreuseport



オプションreuseport



使用できません。 全員が独自の測定を行って、 reuseport



効果があることを確認し、可能な限りオプションを盲目的にオンにしないことをお勧めします。 nginx.conf 2014カンファレンスのコンスタンチンパブロフによるスピーチから、NGINXのパフォーマンスをテストするためのヒントを見つけることができます。



謝辞



SO_REUSEPORT



でSO_REUSEPORTを動作させるための独自のソリューションを提案したSepherosa ZiehauとYingqi LuにSO_REUSEPORT



します。 NGINXチームは、私たちが理想と考える実装のために彼らのアイデアを使用しました。



All Articles