为什么我的Perl TCP服务器脚本会挂起许多TCP连接?

vir*_*tor 7 c sockets linux perl tcp

我接受TCP连接的服务器有一个奇怪的问题.即使通常有一些进程在等待,但在某些连接数量下它会挂起.

长版:

服务器是用Perl编写的,并$srv使用重用标志绑定套接字并监听== 5.然后,它将循环分配到10个进程中.$clt=$srv->accept(); do_processing($clt); $clt->shutdown(2);

用C语言编写的客户端也很简单 - 它发送一些行,然后接收所有可用的行,并且执行shutdown(sockfd, 2);没有任何异步,最后发送和接收队列都是空的(如报告所示netstat).

连接仅持续约20ms.所有客户端的行为方式相同,实现方式相同,等等.现在假设我接受X来自客户端1的连接和X来自客户端2的连接.进程仍然报告它们一直处于空闲状态.如果我X从客户端3 添加另一个连接,突然服务器进程在接受后立即开始挂起.他们之后做的第一个阻塞accept();while (<$clt>) ...- 但他们没有获得任何数据(在第一次尝试时已经).突然间,所有10个进程都处于此状态,并且不会停止等待.在strace,服务器进程似乎挂起read(),这是有道理的.

TIME_WAIT属于该服务器的状态中存在大量连接(问题开始显示时为~100),但这可能是一个红色的鲱鱼.

这可能发生什么?


经过一些更多的分析:结果发现客户端有问题,在尝试下一个连接之前没有正确关闭先前的连接.负载平衡列表开头的服务器是旧的连接.

Sno*_*are 0

它是否会激增,然后暂停很长时间(大约两分钟左右),然后再次激增?如果是这样,您可能没有将系统最大打开文件限制设置得足够高。