NGINX 1.9.1では、SO_REUSEPORTソケットオプションを使用できる新機能が導入されました。このオプションは、DragonFly BSDやLinux(カーネルバージョン3.9以降)を含む、多くのオペレーティングシステムの新しいバージョンで利用できます。このソケットオプションにより、複数のソケットが同じIPアドレスとポートの組み合わせで接続を待ち受けることができます。カーネルは、受信接続をこれらのソケット間で負荷分散します。
編集者注 – NGINX Plusユーザー向けには、この機能はNGINX Plus Release 7(R7)以降でサポートされています。このリリースのすべての新機能の概要については、ブログ記事「NGINX Plus R7の発表」をご覧ください。
The SO_REUSEPORTソケットオプションには、実環境でさまざまな用途に活用できる可能性があります。他のサービスでは、実行ファイルのローリングアップグレードを容易にするために使用できます(NGINXはすでに別の方法でローリングアップグレードをサポートしています)。NGINXでは、このソケットオプションを有効にすると、ロック競合が軽減され、特定のシナリオでパフォーマンスが向上する可能性があります。
図に示すように、SO_REUSEPORTオプションが有効になっていない場合、単一のリスニングソケットがワーカーに着信接続を通知し、各ワーカーが接続の受け入れを試みます。

With the SO_REUSEPORTオプションを有効にすると、IPアドレスとポートの組み合わせごとに、各ワーカープロセスに対応する複数のソケットリスナーが作成されます。カーネルは、使用可能なソケットリスナーのうち、どれが接続を受け取るか(したがって、どのワーカーが接続を受け取るか)を決定します。これにより、新しい接続を受け入れるワーカー間のロック競合が軽減され、マルチコアシステムのパフォーマンスが向上する可能性があります。ただし、ブロッキング処理によってワーカーが停止すると、その影響はワーカーがすでに受け入れた接続だけでなく、停止後にカーネルがそのワーカーに割り当てた接続要求にも及ぶ可能性があります。

ソケットシャーディングの設定
To enable the SO_REUSEPORTソケットオプションを有効にするには、次の例のように、HTTPまたはTCP(reuseportモジュール)トラフィック用のlistenディレクティブに、新しいstreamパラメーターを追加します。
http { server {
listen 80 reuseport;
server_name localhost;
# ...
}
}
stream {
server {
listen 12345 reuseport;
# ...
}
}Including the reuseportパラメーターを指定すると、ミューテックスはreuseportと機能が重複するため、そのソケットのaccept_mutexディレクティブも無効になります。reuseportを設定しないポートがある場合は、accept_mutexを設定する価値があります。
パフォーマンスのベンチマーク:reuseport
36コアのAWSインスタンス上で、4つのNGINXワーカーを使用してwrkベンチマークを実行しました。ネットワークの影響を排除するため、クライアントとNGINXの両方をlocalhostで実行し、さらにNGINXがファイルではなく文字列「OK」を返すようにしました。比較したNGINX構成は、デフォルト(「accept_mutex on」と同等)、「accept_mutex off」を設定した構成、「reuseport」を設定した構成の3つです。図に示すように、「reuseport」を使用すると、1秒あたりのリクエスト数が2~3倍に増加し、レイテンシーとその標準偏差の両方が低下します。

また、クライアントとNGINXを別々のホストで実行し、NGINXがHTMLファイルを返す構成でも、関連するベンチマークを実施しました。次の表に示すように、reuseportを使用した場合、レイテンシーの低下は前回のベンチマークと同程度で、標準偏差はさらに大幅に減少しました(約10分の1)。表には示していないその他の結果も良好でした。reuseportを使用すると、負荷はワーカープロセス間で均等に分散されました。デフォルトの条件(accept_mutex onと同等)では、一部のワーカーにより高い割合の負荷がかかり、accept_mutex offでは、すべてのワーカーが高負荷になりました。
レイテンシ(ms) レイテンシの標準偏差(ms) CPU負荷デフォルト 15.65 26.59 0.3accept_mutex off 15.59 26.48 10reuseport 12.35 3.15 0.3
これらのベンチマークでは、接続リクエストの頻度は高いものの、リクエストに大規模な処理は必要ありません。その他の予備テストでも、reuseportは、このプロファイルに一致するトラフィックで最も高いパフォーマンス向上効果を示すことがわかっています。(たとえば、メールトラフィックは明らかにこのプロファイルに一致しないため、reuseportパラメーターはmailコンテキストのlistenディレクティブでは使用できません。)一律に適用するのではなく、reuseportをテストし、NGINX環境でパフォーマンスが向上するかどうかを確認することを推奨します。NGINXのパフォーマンステストに関するヒントについては、nginx.conf 2014でのKonstantin Pavlovの講演をご覧ください。
謝辞
IntelのYingqi Lu氏とSepherosa Ziehau氏は、それぞれNGINXプロジェクトに対し、SO_REUSEPORTソケットオプションを利用可能にするソリューションを提供してくださいました。両氏に感謝いたします。NGINXチームは、双方のアイデアを組み合わせ、理想的と考えるソリューションを作り上げました。
関連するブログ記事
チュートリアル:NGINXを使用してアプリケーション向けにOpenTelemetryを構成する
OpenTelemetryを使用してNGINXサーバーの状態と健全性をより明確に把握することで、問題のトラブルシューティングを行い、Webアプリケーションのパフォーマンスを向上できます。
AkitaのNGINX Plus認定モジュールでAPIエンドポイントの問題を特定・修正
Akita SoftwareのAPIオブザーバビリティ向け新しいNGINX Plus Certified Moduleを活用して、APIエンドポイントの問題をより迅速に特定し、修正できます。
JavaプロジェクトをスキャフォールディングしてKubernetesネイティブアプリを構築する方法
Red HatのシニアプリンシパルデベロッパーアドボケイトであるDaniel Oh氏が、Javaプロジェクトをゼロから構築するためのひな形を作成し、Kubernetesネイティブアプリケーションとしてビルドする方法を解説します。
F5 NGINXaaS for Azureのご紹介:Microsoft Azureでネイティブに利用できるSaaS型ロードバランシング
NGINXaaS for Azureは、NGINX PlusをAzureネイティブのSaaSとして利用できるサービスです。NGINXの設定を容易にリフト&シフトできるため、クラウド導入とモダンアプリの展開を加速できます。

SELinuxでNGINXおよびNGINX Plusを使用する
Red Hat Enterprise Linux(RHEL)および関連ディストリビューションでSecurity-Enhanced Linux(SELinux)を有効にすると、デフォルト設定によりNGINXとNGINX Plusの一部の操作が制限されます。この記事では、すべての機能を利用できるようにSELinuxの設定を変更する方法について説明します。
NGINX PlusによるAWS Auto Scalingグループの負荷分散
新しいnginx-asg-sync統合ソフトウェアにより、NGINX PlusはAWS Auto Scalingグループの負荷を直接分散できるため、クラウドでの負荷分散がさらに柔軟になります