解决 Linux 大量 TIME_WAIT TCP 连线


HTTP 服务器在高负载时反应会变慢, 但检视系统的使用资源, 例如 CPU, 内存及 Load Average 则很正常, 当重新启动 HTTP 服务器后, 问题又暂时得以解决。用以下 netstat 检查连线的统计资料:

# netstat -nat | awk ‘{print $6}’ | sort | uniq -c | sort -n

会发现 ESTABLISHED 连线其实并不高, 但就积压了大量 TIME_WAIT 连线.

要解决这个题题, 可以修改 Linux 的变量, 先用 root 开启 /etc/sysctl.conf:

# vi /etc/sysctl.conf

加入以下 3 行:

net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1

在 vi 储存盘案及离开:

:wq

上面 3 行设定的解释分别是:

net.ipv4.tcp_fin_timeout:
保留 FIN_WAIT2 的时间, 默认值是 60, 单位是秒.

net.ipv4.tcp_tw_recycle:
TCP 连线中 TIME_WAIT sockets 的快速回收, 默认是关闭.

net.ipv4.tcp_tw_reuse = 1
允许将 TIME_WAIT sockets 在新的 TCP 连线重新使用, 默认是关闭.

修改 /etc/sysctl.conf 后, 下次开机时会自动使用新设定, 在不重新启动下立即读取 /etc/sysctl.conf 的变更, 执行以下指令:

# sysctl -p

新的设定可能不会立即反应在 netstat 指令里面, 需要等待已经存在的连线释放, 一般过了几分钟后, 可以再之执行 netstat 指令检视系统连线状态:

# netstat -nat | awk ‘{print $6}’ | sort | uniq -c | sort -n

Leave a Reply