问题现象
Linux系统服务器中FIN_WAIT2状态的TCP链接过多。
原因分析
- 在HTTP服务中,Server由于某种原因会主动关闭连接,例如KEEPALIVE超时的情况下。作为主动关闭连接的Server就会进入FIN_WAIT2状态。
- 在TCP/IP协议栈中,存在半连接的概念,FIN_WAIT2状态不算超时,如果Client不关闭,FIN_WAIT2状态将保持到系统重启,越来越多的FIN_WAIT2状态会致使内核Crash。
- 建议调小
net.ipv4.tcp_fin_timeout
参数的值,以便加快系统关闭处于FIN_WAIT2
状态的TCP连接。
解决方法
- 执行
vi /etc/sysctl.conf
命令,修改或增加以下内容。net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_max_syn_backlog = 8192 net.ipv4.tcp_max_tw_buckets = 5000
- 执行
sysctl -p
命令,使配置生效。
注意:由于FIN_WAIT2
状态的TCP连接会进入TIME_WAIT
状态,请查看