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),但这可能是一个红色的鲱鱼.
这可能发生什么?
经过一些更多的分析:结果发现客户端有问题,在尝试下一个连接之前没有正确关闭先前的连接.负载平衡列表开头的服务器是旧的连接.