TCPSocket
いくつかのリモート ベンチマーク ボックスに対して、できるだけ多くの s を開こうとしています。たとえば、それぞれ 100 のスレッド/接続を持つ 64 のフォークを開始しています ( TCPSocket.new
)
非常に優れたマシン(32コア、64 GB RAMなど)を使用する以外に、同時に〜500〜600を超える「確立済み」接続を開くことができないことに混乱します。もちろん、sysctl設定も確認しましたは問題ありません (ulimit -n は 100000 です)。
次を使用して接続を確認しています:
netstat -an | awk '/^tcp/ {print $NF}' | sort | uniq -c | sort -rn
そして、これは私に次のようなものを与えます:
513 ESTABLISHED
21 LISTEN
2 CLOSE_WAIT
さて、この問題がハードウェア/レイテンシー/OS によるものであるとは思えません。また、リモート ベンチマーク ボックスとして使用しているクラウドの数を増やそうとしましたが、確立された接続が増えなかったので、クライアントの問題であると確信しています。
さらに、私が確立した 500 ~ 600 の接続が「ハング」するようです。クライアントのフォーク/スレッドの量を大幅に減らしていることを除いて、サーバーにデータが到着していないようです。
Ruby の観点から見たボトルネックはありますか?
私は MRI 1.8.7 を使用しています (もうサポートされていないことはわかっています)。
編集:これは epoll/poll/select に関連している可能性がありますか?
編集 2: 65353 のような別の FD_SETSIZE で Ruby MRI 1.8.7 を再構築することは可能ですか? これで問題は解決しますか?