time_wait过多的优化
对于处理并发量较高的Server,统计会发现本机tcp的time_wait状态的连接非常多
netstat -nat | awk '{++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 24413
established) 1
SYN_SENT 1
FIN_WAIT1 1
State 1
ESTABLISHED 15
LAST_ACK 1
LISTEN 7
该time_wait的默认值为2*MSL,MSL即max segment lifetime,是一个tcp包的最大生存时间
MSL值在Linux上好像默认是30秒,所以从time_wait状态变化到CLOSED大约需要60s时间
另外一方面,本机可用的发起连接的socket端口是有限的,可通过以下命令查看
cat /proc/sys/net/ipv4/ip_local_port_range
32768 61000
也即大约只有2万多个端口可用,如果处于 time_wait状态的连接很多
很有可能会影响本机向外发起的连接(比如说nginx的proxy服务器),出现端口不够用的情况
可以通过以下参数去减少time_wait的连接
vi /etc/sysctl.conf
#开启time_wait状态的socket重用
net.ipv4.tcp_tw_reuse = 1
#开启time_wait状态的socket快速回收
net.ipv4.tcp_tw_recycle = 1
/sbin/sysctl -p
或者直接修改time_wait的等待时间
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
更多的Linux内核优化可参见
这个好,正好用得上