nginx の 1.9.1 リリースでは、so_reuseport ソケット オプションの使用を許可する新機能が導入されています。このオプションは、dragonfly bsd や linux (カーネル バージョン 3.9 以降) を含む多くのオペレーティング システムの新しいバージョンで利用できます。このソケット オプションを使用すると、複数のソケットが同じ IP とポートの組み合わせでリッスンできるようになります。カーネルは、これらのソケット間で受信接続の負荷を分散できます。 (nginx Plus の顧客の場合、この機能は年末までにリリースされるバージョン 7 に追加される予定です)
so_reuseport オプションには多くの実用的なアプリケーションの可能性があります。他のサービスもこれを使用して、実行中にローリング アップグレードを単純に実装できます (nginx はすでにローリング アップグレードをサポートしています)。 nginx の場合、このオプションを有効にすると、特定のシナリオでロックの競合が軽減され、パフォーマンスが向上します。
次の図で説明されているように、so_reuseport オプションが有効な場合、別のリッスン ソケットがアクセスされた接続をワーカー プロセスに通知し、各ワーカー スレッドが接続の取得を試みます。
so_reuseport オプションが有効な場合、IP アドレスとポート バインディング接続ごとに複数のソケット リスナーが存在し、各ワーカー プロセスに 1 つを割り当てることができます。システム カーネルは、どの有効なソケット リスナー (そして暗黙的にどのワーカー プロセスに対して) が接続を取得するかを決定します。これにより、新しい接続を取得する際のワーカー プロセス間のロックの競合 (翻訳者注: 相互に排他的なリソース ロックの取得を要求するワーカー プロセス間の競合) が減少し、マルチコア システムのパフォーマンスが向上します。ただし、これは、ワーカー プロセスがブロッキング操作に陥った場合、そのブロッキングは接続を受け入れたワーカー プロセスに影響するだけでなく、カーネルによって割り当てられるようにスケジュールされたワーカー プロセスにも接続要求を送信させることになることも意味します。ブロックされてしまう。
共有ソケットのセットアップ
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 倍であり、レイテンシとレイテンシの標準偏差も減少しています。
latency (ms) latency stdev (ms) cpuload
accept_mutex off 15.59 26.48 10reuseport 12.35 3.15 0.3
これらのパフォーマンス テストでは、接続リクエストの速度は非常に高速ですが、リクエストに多くの処理は必要ありません。他の基本的なテストでは、アプリケーション トラフィックがこのシナリオに適合する場合、再利用ポートでもパフォーマンスが大幅に向上する可能性があることを指摘する必要があります。 (reuseport パラメーターは、電子メールなどのメール コンテキストの listen ディレクティブでは使用できません。電子メールのトラフィックはこのシナリオに間違いなく一致しないためです。) 大規模に直接適用するのではなく、最初にテストすることをお勧めします。
以上がNginxサーバーのソケットセグメンテーションとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。