目录

Linux 服务器出现大量 TIME_WAIT 状态的连接

在高并发短连接的 TCP 服务器上,当服务器处理完请求后立刻主动正常关闭连接。这个场景下会出现大量 socket 处于 TIME_WAIT 状态。如果客户端的并发量持续很高,此时部分客户端就会显示连接不上。

高并发可以让服务器在短时间范围内同时占用大量端口,而端口有个 0~65535 的范围,并不是很多,刨除系统和其他服务要用的,剩下的就更少了。

在这个场景中,短连接表示 “业务处理 + 传输数据的时间 远远小于 TIMEWAIT 超时的时间” 的连接。Linux 默认的 TIME_WAIT 时长一般是 60 秒。

查看默认 timewait 时长

cat /proc/sys/net/ipv4/tcp_fin_timeout

查看连接状态统计

netstat -an | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

优化内核参数

vim /etc/sysctl.conf

#追加内容
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30

释义

开启 SYN Cookies。当出现 SYN 等待队列溢出时,启用 cookies 来处理,可防范少量 SYN 攻击,默认为 0,表示关闭。
net.ipv4.tcp_syncookies = 1

开启重用。允许将 TIME-WAIT sockets 重新用于新的 TCP 连接,默认为 0,表示关闭。
net.ipv4.tcp_tw_reuse = 1

开启 TCP 连接中 TIME-WAIT sockets 的快速回收,默认为 0,表示关闭。
net.ipv4.tcp_tw_recycle = 1

修改系統默认的 TIMEOUT 时间(FIN_WAIT_2 状态的时长)
net.ipv4.tcp_fin_timeout

REF

https://www.cnblogs.com/apanly/p/12431902.html
https://zhuanlan.zhihu.com/p/79507132