ホームページ  >  記事  >  運用・保守  >  Nginxサーバーのソケットセグメンテーションとは何ですか

Nginxサーバーのソケットセグメンテーションとは何ですか

王林
王林転載
2023-05-17 20:19:10679ブラウズ

nginx の 1.9.1 リリースでは、so_reuseport ソケット オプションの使用を許可する新機能が導入されています。このオプションは、dragonfly bsd や linux (カーネル バージョン 3.9 以降) を含む多くのオペレーティング システムの新しいバージョンで利用できます。このソケット オプションを使用すると、複数のソケットが同じ IP とポートの組み合わせでリッスンできるようになります。カーネルは、これらのソケット間で受信接続の負荷を分散できます。 (nginx Plus の顧客の場合、この機能は年末までにリリースされるバージョン 7 に追加される予定です)

so_reuseport オプションには多くの実用的なアプリケーションの可能性があります。他のサービスもこれを使用して、実行中にローリング アップグレードを単純に実装できます (nginx はすでにローリング アップグレードをサポートしています)。 nginx の場合、このオプションを有効にすると、特定のシナリオでロックの競合が軽減され、パフォーマンスが向上します。

次の図で説明されているように、so_reuseport オプションが有効な場合、別のリッスン ソケットがアクセスされた接続をワーカー プロセスに通知し、各ワーカー スレッドが接続の取得を試みます。

Nginxサーバーのソケットセグメンテーションとは何ですか

so_reuseport オプションが有効な場合、IP アドレスとポート バインディング接続ごとに複数のソケット リスナーが存在し、各ワーカー プロセスに 1 つを割り当てることができます。システム カーネルは、どの有効なソケット リスナー (そして暗黙的にどのワーカー プロセスに対して) が接続を取得するかを決定します。これにより、新しい接続を取得する際のワーカー プロセス間のロックの競合 (翻訳者注: 相互に排他的なリソース ロックの取得を要求するワーカー プロセス間の競合) が減少し、マルチコア システムのパフォーマンスが向上します。ただし、これは、ワーカー プロセスがブロッキング操作に陥った場合、そのブロッキングは接続を受け入れたワーカー プロセスに影響するだけでなく、カーネルによって割り当てられるようにスケジュールされたワーカー プロセスにも接続要求を送信させることになることも意味します。ブロックされてしまう。

Nginxサーバーのソケットセグメンテーションとは何ですか

共有ソケットのセットアップ

so_reuseport ソケット オプションが機能するには、http または tcp である必要があります。 (ストリーム モード) 通信オプションの listen 項目は、次の例のように、最新の再利用ポート パラメーターを直接導入します。

コードをコピーします。 コードは次のとおりです。


http {
server { listen 80 reuseport;
}

reuseport パラメータを参照した後は、ミューテックス (mutex) が再利用ポートに対して冗長であるため、accept_mutex パラメータは参照されたソケットに対して無効になります。再利用ポートを使用しないポートの場合でも、accept_mutex を設定することが重要です。

Reuseport のベンチマーク パフォーマンス テスト

私は 36 コア AWS インスタンスでベンチマーク ツールを実行し、4 つの nginx ワーカー プロセスをテストしました。ネットワーク、クライアントと nginx の両方の影響を軽減するためにローカルで実行している場合、nginx はファイルの代わりに ok 文字列を返します。 3 つの nginx 設定、default (accept_mutex on に相当)、accept_mutex off、reuseport を比較しました。図に示されているように、reuseport の 1 秒あたりのリクエストは他のリクエストの 2 ~ 3 倍であり、レイテンシとレイテンシの標準偏差も減少しています。


別の関連するパフォーマンス テストを実行しました。クライアントと nginx は別のマシン上にあり、nginx は html ファイルを返しました。以下の表に示すように、再利用ポートを使用したレイテンシの削減は前のパフォーマンス テストと同様であり、レイテンシの標準偏差の削減がより顕著です (ほぼ 10 分の 1)。他の結果 (表には示されていません) も同様に有望です。再利用ポートを使用すると、負荷がワーカー プロセス間で均等に分散されます。デフォルトの条件 (accept_mutex がオンの場合と同等) では、一部のワーカーがより高い負荷の割合を受け取りますが、accept_mutex がオフの場合はすべてのワーカーがより高い負荷を受け取ります。

コードをコピーします。 コードは次のとおりです。


latency (ms) latency stdev (ms) cpuload

default 15.65 26.59 0.3

accept_mutex off 15.59 26.48 10Nginxサーバーのソケットセグメンテーションとは何ですかreuseport 12.35 3.15 0.3

これらのパフォーマンス テストでは、接続リクエストの速度は非常に高速ですが、リクエストに多くの処理は必要ありません。他の基本的なテストでは、アプリケーション トラフィックがこのシナリオに適合する場合、再利用ポートでもパフォーマンスが大幅に向上する可能性があることを指摘する必要があります。 (reuseport パラメーターは、電子メールなどのメール コンテキストの listen ディレクティブでは使用できません。電子メールのトラフィックはこのシナリオに間違いなく一致しないためです。) 大規模に直接適用するのではなく、最初にテストすることをお勧めします。

以上がNginxサーバーのソケットセグメンテーションとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。