尽管SO_LINGER,关闭等数以万计的TIME_WAIT

时间:2010-01-22 01:33:45

标签: php sockets

我正在开发一个可以同时连接到多个URL的网站(我们希望每分钟达到600个),无论我尝试什么,总有数千个TIME_WAIT仍然打开。我知道这些对于TCP连接至关重要,但它们正在使用所有可用的端口。 PHP没有SO_REUSEPORT,SO_REUSEADDR不适用于远程连接。这是代码的开头:

$s = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($s, SOL_SOCKET, SO_LINGER,array('l_linger'=>0, 'l_onoff'=>0)); //I have tried l_onoff=1 
socket_set_option($s, SOL_SOCKET, SO_RCVTIMEO,array('sec'=>0,'usec'=>500000));
socket_set_option($s, SOL_SOCKET, SO_SNDTIMEO,array('sec'=>0,'usec'=>500000));
socket_set_option($s, SOL_SOCKET, SO_KEEPALIVE,0);
socket_set_option($s, SOL_SOCKET, SO_REUSEADDR,1);
socket_set_nonblock($s);
socket_bind($s,$ip,0);
socket_connect($s,$host,$port);

$ s进入一个包含所有挂起写入的数组,在写入后我们调用socket_shutdown($ s,1);关闭套接字上的写入。然后读完后我们:

socket_shutdown($s,2); socket_close($s);

所有读取和写入都是在while循环中完成的,循环最多有12个并发连接,如果没有命中,则继续运行并继续向数组添加另一个URL。每个循环都调用socket_select,超时为0。

有没有人有任何建议?我想提高速度并减少netstat中出现的TIME_WAIT。

谢谢, 詹姆斯哈蒂格

2 个答案:

答案 0 :(得分:4)

您可以发送HTTP标头Connection: close以及您的请求,这会导致服务器在向您发送请求后发送TCP FIN。因为另一方发送第一个FIN,它将是另一方在TIME_WAIT中等待,而不是你。

答案 1 :(得分:1)

如果您想在Linux上减少TIME_WAIT,可以修改proc设置:

echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout

这会将超时更改为30秒。请注意TIME_WAIT是标准TCP / IP行为的一部分 - 除非您真的缺乏资源,否则我不会这么做。