Linux系统中出现大量TIME_WAIT状态的连接通常是由于TCP连接关闭后,系统需要等待一段时间(通常为2倍的最大报文段寿命,约为2分钟)以确保延迟到达的数据包不会干扰后续的新连接。这种情况在高并发短连接的场景下尤其常见,因为每个连接在关闭后都会进入TIME_WAIT状态

原因分析

高并发短连接

在短时间内建立和关闭大量连接,导致TIME_WAIT状态的连接迅速累积

端口资源限制

Linux系统的默认端口范围有限,高并发场景下可能导致端口耗尽

TCP参数配置

默认的TIME_WAIT超时时间较长,可能导致端口资源长时间被占用

解决方法

调整TCP参数

  • 缩短TIME_WAIT超时时间:通过设置net.ipv4.tcp_tw_timeout来减少TIME_WAIT状态的持续时间
  • 启用TCP端口复用:设置net.ipv4.tcp_tw_reusenet.ipv4.tcp_tw_recycle

增加可用端口范围

修改net.ipv4.ip_local_port_range以增加可用的端口数

优化应用程序

使用长连接或连接池技术减少频繁的连接建立和关闭

负载均衡

使用负载均衡器将流量分散到多个服务器,减轻单个服务器的负载

案例

当前所有80端口的请求总数

netstat -nat|grep -i "80"|wc -l命令

netstat -an会打印系统当前网络链接状态,而grep -i “80″是用来提取与80端口有关的连接的, wc -l进行连接数统计

当前所有80端口的已建立连接的总数

netstat -na|grep ESTABLISHED|wc -l命令

netstat -an会打印系统当前网络链接状态,而grep ESTABLISHED 提取出已建立连接的信息。 然后wc -l统计

编辑/etc/sysctl.conf文件

net.ipv4.tcp_fin_timeout = 30

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.ip_local_port_range = 1024    65000

net.ipv4.tcp_max_syn_backlog = 8192

net.ipv4.tcp_syn_retries = 1

说明:

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.ip_local_port_range 表示用于向外连接的端口范围

net.ipv4.tcp_max_syn_backlog  表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数

net.ipv4.tcp_syn_retries 对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃

检查服务器的TCP状态

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

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐