最大同時Socket.IO接続


123

この質問は以前に尋ねられましたが、最近ではなく、明確な答えはありません。

Socket.ioを使用して、別のサーバーを追加する必要がある前に維持できる同時接続の最大数はありますか?

誰かが大規模にWebSocket(特に、Socket.io)を使用しているアクティブな本番環境を知っていますか?最大接続に最適なセットアップの種類を本当に知りたいですか?

WebsocketはTCPの上に構築されているので、私の理解では、接続間でポートが共有されない限り、64Kのポート制限によってバインドされます。しかし、Grettyを使用した512K接続のレポートも見ました。だから私は知りません。


3
Trelloは大規模なソケットを使用します(具体的には、socket.io)。
ジェームズ

10,000の接続キャップがあるため、TrelloはSocket.ioコードを変更する必要があり、サーバーを追加する前に「何千」もの接続を維持することができました。それでも、他のサーバーシステムの512Kとの間に大きな隔たりがあります。
アンドリュー14

1
その記事は何歳ですか?Trelloは最近、毎月100万人を超えるアクティブユーザーに達しているので、現在、10,000を超えるアクティブソケットを実行していると思います。TrelloはRedis使用してスケーラビリティのためにsocket.ioの上に座っています
James

2
現在、Trelloには400万人以上のユーザーがいるようですが、確かにそれを多数のサーバーで実行していますよね?これにより、元の質問に戻ります。サーバー(または他の誰か)の実際のサーバーあたりの最大同時ユーザー数はいくつですか?また、使用しているサーバーやコンテナの種類を知っておくとよいでしょう。そして、彼らはまだ彼ら自身のフォークを実行していますか、それとも彼らはオリジン/マスターに戻っていますか?私がこの質問をする唯一の目的は、私の会社が(当時)おそらく120,000の同時接続用にSocket.ioアプリケーションを維持する余裕があるかどうかを判断することでした。
アンドリュー

1
ポート制限については、それが問題にならない理由の説明はこちらで説明していると思います。基本的に、システムで使用される唯一のポートは、リスニングしているポートです。ソケットは接続ごとに作成され、それらはファイル記述子を使用しますが、ボックスのポートは使用しません。
ポールリンチ

回答:


77

この記事は途中で役立つかもしれません:http : //drewww.github.io/socket.io-benchmarking/

私は同じ質問を考えていたので、接続が失敗し始めた(または遅れた)ときを確認するための小さなテスト(XHRポーリングを使用)を書きました。(私の場合)ソケットが約1400〜1800の同時接続で動作し始めたことがわかりました。

これは私が作った短い要点で、私が使用したテストに似ていますhttps : //gist.github.com/jmyrland/5535279


7
私はこれが古いトピックであることを理解していますが、私の答えに対する質問を検索したときに最初にそれを見つけ、最終的にこれが役立つことがわかりましたrtcamp.com/tutorials/linux/increase-open-files-limitプロセスあたりのオープンファイル制限は、デフォルトのソフト制限は1024、ハード制限は4096です。開いているすべてのTCPポートがファイルを表すため、ライブラリが最大になる前にマシンが許可するオープンソケットの数を決定するときに、これらの制限を考慮することが重要です。
DeeperID 2015

2
@JAM Webソケットが約1400〜1800接続で動作していた理由を発見したことはありますか?同じ問題が発生しており、ファイル制限が100,000に設定されているので、それは問題ではありません。どんな助けでも大歓迎です。ありがとうございました。
Seth

@seth:これを最後に確認してからしばらく経ちましたが、これが結論だったと思います:XHRポーリングは(他のトランスポート方式と比較して)リソースを使いすぎました。WebSocketを使用すると、同時接続の数が多くなりました。
JAM

@JAM回答ありがとうございます。socket.ioではなくwsモジュールを使用して同じ問題が発生しているため、wsモジュールでポーリングするXHRはありません。これがトラブルシューティングの問題です。検索は続行されます。
Seth

これは良い明確な答えです。また、ケースバイケースなので正しいです。個人的には、pplが独自のベンチマークまたは接続シミュレータを作成することをお勧めします。他の誰かのテストは良いかもしれませんが、実際の環境を表すものではありません...さまざまな現実世界の障害を抱えるクライアントをいくつでも処理できるクライアントシミュレータがあれば、大きな変更後にベンチマークを行うことができます。あなたが行くようにあなたのシミュレータを更新します。ユーザーチャットインターフェイスの操作は、ユーザーのブラウザーなどを監視する場合とは異なります。Pythonはシミュレーターをスクリプト化するのに非常に便利です...
Angry 84

16

AWSでsocket.ioを使用しようとしましたが、最大で約600の接続を安定させることができます。

そして、それは、socket.ioが最初に長いポーリングを使用し、後でwebsocketにアップグレードしたためであることがわかりました。

websocketのみを使用するように構成を設定した後、約9000の接続を維持できます。

この構成をクライアント側で設定します。

const socket = require('socket.io-client')
const conn = socket(host, { upgrade: false, transports: ['websocket'] })

2
EC2を使用しましたか、どの種類のインスタンスですか?t2.micro、t2.nano?
bvdb

2
WebSocketを強制したときの応答性の違いに気づきましたか?
Lauren

インスタンスのサイズを知っていますか?また、将来の誰もが一部の古いブラウザがWebSocketをサポートしていないことを知っているので、アップグレードが重要な場合があります。
Ryan Soderberg、

サーバーがサポートする接続の量をテストするにはどうすればよいですか?9000接続をどのように測定しましたか?提案してください..
好奇心旺盛な開発者

15

この男は、単一のNode.jsサーバーで100万を超える同時接続を確立することに成功したようです。

http://blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/

彼が使用していたポートの数は正確にはわかりません。


13
socket.ioではなく、websocketでもそうではありません。男は長いポーリングを使用しているようでしたが、これはリソースの消費が少ないと思います。
Tim 333

6

+ 300k同時接続の場合:

これらの変数を次のように設定します/etc/sysctl.conf

fs.file-max = 10000000 
fs.nr_open = 10000000

また、これらの変数を次のように変更します/etc/security/limits.conf

* soft nofile 10000000
* hard nofile 10000000
root soft nofile 10000000
root hard nofile 10000000

最後に、TCPバッファもで増やします/etc/sysctl.conf

net.ipv4.tcp_mem = 786432 1697152 1945728
net.ipv4.tcp_rmem = 4096 4096 16777216
net.ipv4.tcp_wmem = 4096 4096 16777216

詳細については、https://www.linangran.com/?p = 547を参照してください。


変更が機能しているかどうかを確認するにはどうすればよいですか?
好奇心旺盛な開発者
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.