close_wait状态出现的原因是被动关闭方未关闭socket造成
当客户端因为某种原因先于服务端发出了FIN信号,就会导致服务端被动关闭,若服务端不主动关闭socket发FIN给Client,此时服务端Socket会处于CLOSE_WAIT状态(而不是LAST_ACK状态)。通常来说,一个CLOSE_WAIT会维持至少2个小时的时间(系统默认超时时间的是7200秒,也就是2小时)。如果服务端程序因某个原因导致系统造成一堆CLOSE_WAIT消耗资源,那么通常是等不到释放那一刻,系统就已崩溃。
先来介绍tcp keepalive的三个参数:
vi /etc/sysctl.conf
tcp_keepalive_time
tcp_keepalive_intvl
tcp_keepalive_probes
默认tcp_keepalive_time的值为7200 ,超时时间(开启keepalive的闲置时长);
默认tcp_keepalive_intvl的值为75 ,tcp检查间隔时间(keepalive探测包的发送间隔);
默认tcp_keepalive_probes的值为9 ,tcp检查次数(如果对方不予应答,探测包的发送次数);
cat /proc/sys/net/ipv4/tcp_keepalive_time
cat /proc/sys/net/ipv4/tcp_keepalive_intvl
cat /proc/sys/net/ipv4/tcp_keepalive_probes
所以要根据自身的业务来调整这三个参数:
三种方式:
1:
vim /etc/sysctl.conf
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 15
sysctl -p
2:
echo 600 > /proc/sys/net/ipv4/tcp_keepalive_time
echo 60 > /proc/sys/net/ipv4/tcp_keepalive_intvl
echo 5 > /proc/sys/net/ipv4/tcp_keepalive_probes
3:
sysctl -w net.ipv4.tcp_keepalive_time=600
sysctl -w net.ipv4.tcp_keepalive_probes=2
sysctl -w net.ipv4.tcp_keepalive_intvl=2