NGINX とは 1.9.1では、 SO_REUSEポート
socket オプションは、DragonFly BSD や Linux (カーネル バージョン 3.9 以降) を含む多くのオペレーティング システムの新しいバージョンで使用できます。 このソケット オプションを使用すると、複数のソケットが同じ IP アドレスとポートの組み合わせでリッスンできるようになります。 次に、カーネルはソケット間で着信接続の負荷を分散します。
エディター – NGINX Plus ユーザーの場合、この機能は NGINX Plus リリース 7 (R7) 以降でサポートされています。 このリリースのすべての新機能の概要については、ブログの「NGINX Plus R7 の発表」をご覧ください。
SO_REUSEPORT
ソケット オプションには、実際の用途で使用できる潜在的なアプリケーションが多数あります。 他のサービスでは、これを使用すれば実行可能ファイルのローリング アップグレードを簡単に実行できます (NGINX はすでにさまざまな手段でローリング アップグレードをサポートしています)。 NGINX の場合、このソケット オプションを有効にすると、ロックの競合が減り、特定のシナリオでパフォーマンスが向上します。
図に示すように、 SO_REUSEPORT
オプションが有効になっていない場合、単一のリスニング ソケットがワーカーに着信接続を通知し、各ワーカーは接続を取得しようとします。
SO_REUSEPORT
オプションを有効にすると、各 IP アドレスとポートの組み合わせに対して複数のソケット リスナーが、各ワーカー プロセスに 1 つずつ存在します。 カーネルは、どの利用可能なソケット リスナー (および暗黙的にどのワーカー) が接続を取得するかを決定します。 これにより、新しい接続を受け入れるワーカー間のロック競合が軽減され、マルチコア システムのパフォーマンスが向上します。 ただし、ワーカーがブロッキング操作によって停止した場合、そのブロックはワーカーがすでに受け入れた接続だけでなく、ワーカーがブロックされてからカーネルがワーカーに割り当てた接続要求にも影響することを意味します。
SO_REUSEPORT
ソケット オプションを有効にするには、次の例のように、HTTP または TCP (ストリームモジュール) トラフィックのlisten
ディレクティブに新しいreuseport
パラメータを含めます。
http { サーバー { listen 80 再利用ポート; server_name localhost; # ... } } stream { server { listen 12345 再利用レポート; # ... } }
Reuseport
パラメータを含めると、mutex がReuseport
と重複するため、ソケットのaccept_mutex
ディレクティブも無効になります。 再利用ポート
を設定していないポートがある場合でも、 accept_mutex を
設定する価値はあります。
再利用レポート
によるパフォーマンスのベンチマーク36 コアの AWS インスタンスで 4 つの NGINX ワーカーを使用してwrkベンチマークを実行しました。 ネットワークの影響を排除するために、クライアントと NGINX の両方をローカルホストで実行し、NGINX にファイルではなく文字列OK
を返すようにしました。 デフォルト ( accept_mutex on
に相当)、 accept_mutex off
、およびreuseport
の 3 つの NGINX 構成を比較しました。 図に示すように、 reuseport
により 1 秒あたりのリクエスト数が 2 ~ 3 倍増加し、レイテンシとレイテンシの標準偏差の両方が減少します。
また、クライアントと NGINX を別のホストで実行し、NGINX が HTML ファイルを返すという関連ベンチマークも実行しました。 次の表に示すように、 reuseport を
使用すると、レイテンシの減少は以前のベンチマークと同様であり、標準偏差はさらに劇的に減少しました (ほぼ 10 倍)。 その他の結果(表には示されていない)も有望なものでした。 Reuseport を
使用すると、負荷はワーカー プロセス全体に均等に分散されます。 デフォルトの条件 ( accept_mutex がオンの
場合と同等) では、一部のワーカーに高い負荷がかかり、 accept_mutex がオフの
場合はすべてのワーカーに高い負荷がかかりました。
レイテンシー(ミリ秒) | レイテンシ標準偏差 (ミリ秒) | CPU負荷 | |
---|---|---|---|
デフォルト | 15.65 | 26.59 | 0.3 |
accept_mutex オフ |
15.59 | 26.48 | 10 |
再利用レポート |
12.35 | 3.15 | 0.3 |
これらのベンチマークでは、接続要求のレートは高いですが、要求に大規模な処理は必要ありません。 その他の予備テストでも、トラフィックがこのプロファイルに一致する場合に、 reuseport によって
パフォーマンスが最も向上することが示されています。 (たとえば、メール トラフィックがプロファイルに確実に一致しないため、 reuseport
パラメータはメール
コンテキストのlisten
ディレクティブでは使用できません。) 再利用ポートを全面的に適用するのではなく、NGINX デプロイメントのパフォーマンスが向上するかどうかを判断するために再利用ポート
をテストすることをお勧めします。 NGINX パフォーマンスのテストに関するヒントについては、nginx.conf 2014 でのKonstantin Pavlov の講演をご覧ください。
SO_REUSEPORT
ソケット オプションの使用を可能にするソリューションを NGINX プロジェクトに提供してくれた Intel の Yingqi Lu 氏と Sepherosa Ziehau 氏に感謝します。 NGINX チームは、両方の貢献から得たアイデアを組み合わせて、理想的なソリューションを生み出しました。
「このブログ投稿には、入手できなくなった製品やサポートされなくなった製品が参照されている場合があります。 利用可能な F5 NGINX 製品およびソリューションに関する最新情報については、 NGINX 製品ファミリーをご覧ください。 NGINX は現在 F5 の一部です。 以前の NGINX.com リンクはすべて、F5.com の同様の NGINX コンテンツにリダイレクトされます。"