ブログ | NGINX

NGINX リリース 1.9.1 のソケット シャーディング

NGINX-F5 水平黒タイプ RGB の一部
アンドリュー・ハッチングス サムネイル
アンドリュー・ハッチングス
2015 年 5 月 26 日公開

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 コンテンツにリダイレクトされます。"