我正在尝试向一些远程基准框打开尽可能多的TCPSocket
个。
例如,我正在启动64个分叉,每个分支有100个线程/连接(TCPSocket.new
)
除了使用非常好的机器(32核,64 GB RAM,......)之外,我无法同时打开超过~500-600“ESTABLISHED”连接。当然我也确保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? 这会解决问题吗?