100 万の Websocket 接続を処理する方法 (Nginx/HAProxy/Amazon/Google)

100 万の Websocket 接続を処理する方法 (Nginx/HAProxy/Amazon/Google)

nginxまたはハプロキシターゲットに推奨されるセットアップ10万同時 Websocket 接続? 私の考えでは、単一の nginx では、同時接続と同様にこのようなトラフィックを処理することはできません。 nginx/haproxy へのトラフィックはどのように分割する必要がありますか (DNS レベルまたは利用可能な Amazon/Google オプション)? 単一の nginx で処理できる同時 Websocket の数はどれくらいですか?

Google 検索と SO 投稿から関連情報を収集しようとしました。

答え1

haproxy ロード バランサーの背後で、さらに高い負荷でチャット サーバーを実行している人もいます。私にプライベートな電子メール (統計ページのコピー付き) で報告された最高負荷は、プロセスあたり約 30 万接続 (したがって 60 万ソケット) でした。Linux では、デフォルトではプロセスは 100 万ファイル記述子に制限されます (したがって 50 万エンドツーエンド接続) が、/proc で調整できることに注意してください。

このような負荷で考慮すべき最も重要なことは、必要な RAM の量です。カーネル側のソケット バッファは、常に方向ごとに少なくとも 4kB を必要とするため、エンドツーエンド接続ごとに最低 16kB が必要です。HAProxy 1.5 以前では、接続ごとに 2 つのバッファがあります (例: Websocket には 4kB のバッファで十分です)。1.6 はこれらのバッファなしで実行でき、まれにデータがある接続にのみ割り当てられます。したがって、少なくとも 100 万の接続ごとに 16 GB の RAM、または古いバージョンでは約 24 GB の RAM が必要です。レイテンシを減らすために、SMP マシン上の複数のプロセスにこれを分散する価値があるかもしれません。100 万の接続を確立するだけでも、100k 接続/秒で 10 秒かかる場合があることに注意してください。これらの接続はすべて、それぞれ数バイトの作業を引き起こし、100 万のアクティブな接続を処理すると、間違いなく重要な作業とシステムの高負荷を引き起こします。

関連情報