先ごろ、WebSocket接続の負荷分散におけるNGINXのスケーラビリティをテストしました。50,000件のアクティブなWebSocket接続がある場合でも、NGINXに必要なメモリは1 Gb未満、CPU容量は1コア未満でした。また、通信量が非常に多い接続で高い負荷をかけた場合も、メモリ使用量は安定しており、その増加率はメッセージサイズの増加率を下回りました。実際の環境でのパフォーマンスはアプリケーションの特性によって異なりますが、これらのテスト結果は、NGINXが使用すると見込まれるリソース量の目安となります。
テスト環境
このテストでは、以下のマシンを使用しました。
- 負荷ジェネレーター – thor(6コアXeon EX5645 @ 2.40 GHz、48 GB RAM)
- NGINX – バージョン1.7.0、x86_64、6コアXeon E5645(2.40 GHz、48 GB RAM)上で6ワーカーを実行
- WebSocketバックエンド – 4コアXeon E5-2660 0(2.20 GHz)、8 GB RAM上のNode.jsエコーサーバー
テスト
2種類のテストを実施しました。
最初の一連のテストでは、長時間維持され、ほとんどアイドル状態にある接続をシミュレートしました。接続数は1,000~50,000、メッセージサイズは10~4,096バイト、メッセージの送信間隔は0.1~10秒(低頻度と見なした範囲)で変化させました。
結果から、WebSocket接続に必要な総メモリ量は接続数に応じて変化し、接続あたりのメモリ使用量は一定であることがわかります。メモリ使用率は、メッセージのサイズや送信間隔の影響を受けません。CPU使用率は基本的に接続数に応じて増加しますが、接続数が50,000の場合でも、CPUコア1基分をすべて使用することはありませんでした。ここに示すCPU使用率は、全コアのCPU使用率を合計し、1コア相当に正規化した値です。以下のグラフは、この一連のテストの結果を示しています。




2番目の一連のテストでは、存続時間は短いものの、アクティビティが非常に多い接続をシミュレートしました。同時接続数は500で一定とし、接続あたりのメッセージ数は50、メッセージ間の遅延はなしとしました。メッセージサイズは1~4,096バイトでした。
結果から、同時接続数が一定の場合、総メモリ使用量と接続あたりのメモリ使用量はいずれもメッセージサイズに左右されるものの、変動は小さく、増加率は15%未満で、メッセージサイズに対して線形を下回ることがわかります。




まとめ
これらのテストでは、WebSocketサーバーをプロキシする際に、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グループの負荷を直接分散できるため、クラウドでの負荷分散がさらに柔軟になります