1

我正在尝试向TCPSocket一些远程基准测试框打开尽可能多的 s 。例如,我开始了 64 个分叉,每个分叉有 100 个线程/连接 ( 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

现在,我真的怀疑这个问题是由于硬件/延迟/操作系统造成的。我还尝试增加用作远程基准测试盒的云的数量,但这并没有增加已建立的连接,所以我确定这一定是客户端问题。

此外,我建立的 500-600 个连接似乎只会“挂起”。似乎没有数据到达服务器,除了我大幅降低客户端上的分叉/线程数量。

从 Ruby 的角度来看,你们有没有看到任何瓶颈?

我正在使用 MRI 1.8.7(我知道它不再受支持)。

编辑:这可能与 epoll/poll/select 有关吗?

编辑 2:是否可以使用 65353 等不同的 FD_SETSIZE 重建 Ruby MRI 1.8.7?这能解决问题吗?

4

0 回答 0