通过 "netstat -anp | grep TIME_WAIT | wc -l"
发现大量的TIME_WAIT 的连接,可以通过调整系统内核参数来解决:
打开 sysctl.conf 文件,修改以下几个参数:
[root@web01 ~]# vim /etc/sysctl.conf
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_fin_timeout = 30
相关查看命令:
netstat -n | awk ‘/^tcp/ {++state[$NF]} END {for(key in state) print key,”\t”,state[key]}’
会得到类似下面的结果,具体数字会有所不同:
LAST_ACK 3
SYN_RECV 1
CLOSE_WAIT 7
ESTABLISHED 149
SYN_SENT 1
TIME_WAIT 1477
[root@web01 ~]# sysctl -a | grep time | grep wait
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
执行命令"netstat -na"查看到的相关TCP状态解释:
LISTEN: 侦听来自远方的TCP端口的连接请求;
SYN-SENT: 在发送连接请求后等待匹配的连接请求;
SYN-RECEIVED: 在收到和发送一个连接请求后等待对方对连接请求的确认;
ESTABLISHED: 代表一个打开的连接;
FIN-WAIT-1: 等待远程TCP连接中断请求, 或先前的连接中断请求的确认;
FIN-WAIT-2: 从远程TCP等待连接中断请求;
CLOSE-WAIT: 等待从本地用户发来的连接中断请求;
CLOSING: 等待远程TCP对连接中断的确认;
LAST-ACK: 等待原来的发向远程TCP的连接中断请求的确认;
TIME-WAIT: 等待足够的时间以确保远程TCP接收到连接中断请求的确认;
CLOSE: 没有任何连接状态;
示例线上压测的值:
net.ipv4.tcp_keepalive_probes=5
net.ipv4.tcp_keepalive_time=1200
net.ipv4.tcp_keepalive_intvl=30
net.ipv4.tcp_max_tw_buckets=5000
net.ipv4.ip_local_port_range = 1024 65535 // 区间值必须大于net.ipv4.tcp_max_tw_buckets
查看当前系统打开的文件数量
代码如下:
lsof | wc -l
watch "lsof | wc -l"
查看某一进程的打开文件数量
代码如下:
lsof -p pid | wc -l
lsof -p 1234 | wc -l
修改文件连接数,需要修改 /etc/security/limits.conf
supervisor的配置也会影响最小文件数
重启supervisor:
systemctl list-units | grep super
systemctl restart supervisord.service