客户端方面
在进行TCP短连接测试时
TCP客户端在段时间内向服务端建立大量的连接
在程序运行一段时间后出现 connection refusaued 错误。
这是由于客户端每建立一个TCP连接需要一个端口,即便客户端关闭了TCP连接完成了4次挥手,操作系统任然会保留一段时间的这个连接。
见 [1]
该问题可以通过配置Linux的端口重用参数来实现对处于 TIME_WAIT 状态下的端口的重用。
sudo echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
服务端方面
若服务端上出现了大量的 CLOSE_WAIT,那么将会导致文件打开上限进而导致 连接速度急剧下降。
原因是由于服务端在收到客户端连接关闭后没有关闭对应Socket的连接导致。
这时候请检查服务端是否在有在客户端连接关闭,但是服务端没有关闭这个连接的情况。
当客户端因为某种原因先于服务端发出了FIN信号,就会导致服务端被动关闭,若服务端不主动关闭socket发FIN给Client,此时服务端Socket会处于CLOSE_WAIT状态(而不是LAST_ACK状态)。通常来说,一个CLOSE_WAIT会维持至少2个小时的时间(系统默认超时时间的是7200秒,也就是2小时)。如果服务端程序因某个原因导致系统造成一堆CLOSE_WAIT消耗资源,那么通常是等不到释放那一刻,系统就已崩溃。 —— [4]
参考文献
[1]. golang 大量 TIME_WAIT . 明月几时有 . 2019-11 . https://zjj2wry.github.io/post/golang/time-wait/
[2]. linux . man . https://man7.org/linux/man-pages/man7/tcp.7.html
[3]. 博客园 . 高并发情况下Linux系统及kernel参数优化 . 详 . 2020-09 . https://www.cnblogs.com/txlsz/p/13683892.html
[4]. 博客园 . linux server 产生大量 Too many open files CLOSE_WAIT激增 . Bigben . 2017.06 . https://www.cnblogs.com/bigben0123/p/6932217.html
|