stream_socket_client错误码111

chaz6chez

我自己实现了基于TCP的的jsonRpc2.0服务端和客户端;
服务端基于workerman实现,客户端使用stream_socket_client实现;

客户端每一次发送和接收一次消息会立即调用fclose关闭连接;

现在出现了一个情况,几乎每一次客户端请求到服务端达到15998次请求以后就会连接不上,报111错误;在停止请求2分钟左右后又可以重新请求,但依然是15998左右会被阻止;不停止请求的情况下2分钟左右也会陆陆续续有少量请求进来;

单一的客户端到单一的服务器;一对一;请求短时间内达到15998次左右,QPS在500-1500浮动;

2632 1 0
1个回答

walkor

客户端侧发起的每个连接都会占用本地一个端口,连接关闭后这个端口会有一个time_wait时间,在这个期间这个端口默认是无法被使用的。因为本地端口是有限的,所以在快速创建大量短连接时本地端口被timewait占用光后就会出现无法创建新的连接问题。

解决办法:
你可以打开 /etc/sysctl.conf
添加如下配置

net.ipv4.tcp_tw_reuse = 1

运行sysctl -p 试下。

如果不行再加如下配置

net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_timestamps = 1

运行sysctl -p

以上配置都是用于快速回收端口用的。

注意:如果开启 net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_timestamps = 1 可能会导致在NAT网络里的客户端连接当前服务器超时丢包的情况。

  • chaz6chez 2021-02-02

    好的,感谢!
    之前一直在服务端来做这些配置的处理,所以一直是会请求失败。
    后面想了一下,是客户端主动关闭的,服务端是close_wait,客户端才是time_wait,哈哈哈,我的我的,低级失误了,感谢~

年代过于久远,无法发表回答
🔝