【问题标题】:Thousands of TIME_WAIT despite SO_LINGER, shutdown etc尽管有 SO_LINGER、关闭等,但仍有数千个 TIME_WAIT
【发布时间】:2011-01-08 00:48:05
【问题描述】:

我正在开发一个同时连接到多个 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。

谢谢, 詹姆斯·哈蒂格

【问题讨论】:

    标签: php sockets


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2017-07-06
        • 1970-01-01
        • 1970-01-01
        • 2019-07-09
        • 1970-01-01
        • 2015-12-26
        • 1970-01-01
        • 2018-12-09
        • 1970-01-01
        相关资源
        最近更新 更多