TIME_WAIT的作用:
TIME_WAIT 在连接主动关闭后会出现,是为了保证网络中迷失的数据包正常过期
大量TIME_WAIT 的原因
原因1:nginx对外没有设置keepalive
keepalive_timeout 60;
原因2:nginx跟fpm没有设置keepalive
http
{
upstream fastcgi_backend {
server 127.0.0.1:9000;
keepalive 60; // fpm连接数量
}
}
server
{
location ~ .*\.php$
{
fastcgi_pass fastcgi_backend;
fastcgi_keep_conn on;
}
}
原因3:nginx跟fpm在同一台服务器,但没有使用unix通信
若 nginx 与 fast-cgi 在同一台服务器上, 则使用 unix域 会更为高效, 同时避免了 TIME_WAIT 的问题.
原因4:redis没有使用长连接
$redis->pconnect(...)
原因5:内核配置没有优化( 打开系统的TIMEWAIT重用和快速回收)
vim /etc/sysctl.conf
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_tw_reuse = 1 // 开启重用,允许将TIME-WAIT sockets重新用于新的TCP连接
使配置生效
/sbin/sysctl -p
辅助排查:
netstat -an | grep TIME_WAIT | awk '{print $4}' | sort | uniq -c | sort -n -k1
查看网络状态:
netstat -ant|awk '/^tcp/ {++S[$NF]} END {for(a in S) print (a,S[a])}'
来自anson博客
2021-01-29 22:41:50