我自己实现了基于TCP的的jsonRpc2.0服务端和客户端;
服务端基于workerman实现,客户端使用stream_socket_client实现;
客户端每一次发送和接收一次消息会立即调用fclose关闭连接;
现在出现了一个情况,几乎每一次客户端请求到服务端达到15998次请求以后就会连接不上,报111错误;在停止请求2分钟左右后又可以重新请求,但依然是15998左右会被阻止;不停止请求的情况下2分钟左右也会陆陆续续有少量请求进来;
单一的客户端到单一的服务器;一对一;请求短时间内达到15998次左右,QPS在500-1500浮动;
客户端侧发起的每个连接都会占用本地一个端口,连接关闭后这个端口会有一个time_wait时间,在这个期间这个端口默认是无法被使用的。因为本地端口是有限的,所以在快速创建大量短连接时本地端口被timewait占用光后就会出现无法创建新的连接问题。
解决办法:
你可以打开
/etc/sysctl.conf
添加如下配置
运行
sysctl -p
试下。如果不行再加如下配置
运行
sysctl -p
以上配置都是用于快速回收端口用的。
注意:如果开启
net.ipv4.tcp_tw_recycle = 1
和net.ipv4.tcp_timestamps = 1
可能会导致在NAT网络里的客户端连接当前服务器超时丢包的情况。好的,感谢!
之前一直在服务端来做这些配置的处理,所以一直是会请求失败。
后面想了一下,是客户端主动关闭的,服务端是close_wait,客户端才是time_wait,哈哈哈,我的我的,低级失误了,感谢~