Page

【网络】出现大量TIME_WAIT的原因以及解决方法

1057Anson21-01-29



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

image.png


查看网络状态:

netstat -ant|awk '/^tcp/ {++S[$NF]} END {for(a in S) print (a,S[a])}'

image.png


来自anson博客 

http://www.tp0.top

2021-01-29 22:41:50