Linux系统优化-TCP连接的快速回收-提升并发能力
痛点:TIME WAIT一多,端口资源就被耗光了,尤其在短连接场景下,TIME WAIT能轻松上好几千,端口很快就用完了
核心参数优化
对于短连接场景,通过 /etc/sysctl.d/ 目录下的配置文件进行调优是最佳实践,这比直接修改 /etc/sysctl.conf 更清晰,也便于管理和回滚
1.创建一个专用的配置文件,例如 /etc/sysctl.d/99-tcp-tuning.conf,并填入以下内容
sudo tee /etc/sysctl.d/99-tcp-tuning.conf <<'EOF'
# 允许 TIME_WAIT socket 复用于出站连接
net.ipv4.tcp_tw_reuse = 1
# 缩短 FIN_WAIT_2 超时
net.ipv4.tcp_fin_timeout = 30
# 扩大 TIME_WAIT bucket 上限,避免内核丢弃并告警
net.ipv4.tcp_max_tw_buckets = 262144
# 时间戳是 tcp_tw_reuse 生效的前提,确保开启
net.ipv4.tcp_timestamps = 1
# 增大连接队列
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
EOF
sudo sysctl --system
2.修改后,执行以下命令使其快速生效:
sudo sysctl --system
关键参数解读与配置依据
net.ipv4.tcp_tw_reuse = 1
此参数允许在协议安全的前提下,将 TIME_WAIT 状态的 socket 用于出站的新连接。这意味着它主要对作为客户端(如反向代理、API 网关)的服务器有帮助,可以减少主动关闭连接时产生的 TIME_WAIT 堆积。它不能用于本机作为服务端时接收新的入站连接。
net.ipv4.tcp_fin_timeout = 30
此参数控制的是 FIN_WAIT_2 状态的超时时间,而非 TIME_WAIT。将其从默认的 60 秒缩短到 30 秒(甚至 15 秒),可以加速那些已经半关闭连接的回收过程,间接减轻 TIME_WAIT 的压力。
net.ipv4.tcp_max_tw_buckets
这是一个安全阀。当 TIME_WAIT 状态的 socket 数量超过此值时,内核会开始销毁它们并记录警告。默认值通常足够,但在极端高并发短连接场景下,可以适当调高(如 262144 或更高),以避免内核频繁丢弃 socket 并产生日志噪音。需要监控 dmesg 中的 TCP: time wait bucket table overflow 警告来调整此值。

浙公网安备 33010602011771号