← 返回博客列表

Linux 高并发场景下的 TCP 内核参数调优指南

在默认配置下,Linux 内核的网络栈参数主要基于通用低负载场景设计。当服务器面临高并发 HTTP/HTTPS 请求、大流量网关代理(如 Nginx、HAProxy)或高频 RPC 调用时,默认参数往往会导致连接队列溢出、TIME_WAIT 状态连接堆积以及套接字缓冲区瓶颈,进而在业务层抛出 Connection reset by peer 或 Cannot assign requested address 错误。

本文从 TCP 建连队列、套接字资源回收、缓冲区管理及文件描述符限制四个维度,深入分析高并发场景下的内核调优策略。

一、TCP 连接队列调优(解决建连瓶颈)

TCP 三次握手过程中存在两个队列:半连接队列(SYN Queue)和全连接队列(Accept Queue)。如果这两个队列爆满,新连接请求会被直接丢弃。

1.1 全连接队列:net.core.somaxconn 与 backlogged

net.core.somaxconn 限制了单个 Listen 套接字全连接队列的最大长度。默认值通常为 128,在高并发下极易被占满。

# 查看当前全连接队列状态
ss -lnt

# 参数调优:提升监听队列上限
sysctl -w net.core.somaxconn=65535
sysctl -w net.ipv4.tcp_max_syn_backlog=65535
注意:调整 net.core.somaxconn 后,必须同步更新应用程序(如 Nginx 配置文件中的 listen ... backlog=65535;),否则生效值仍受限于应用层的设置。

1.2 溢出丢弃策略:net.ipv4.tcp_abort_on_overflow

当全连接队列爆满时,默认策略(0)是丢弃客户端的 ACK 报文,让客户端重传。如果希望在队列爆满时立即向客户端发送 RST 报文以快速失败,可设为 1:

sysctl -w net.ipv4.tcp_abort_on_overflow=0

二、TIME_WAIT 与短连接回收调优

在 HTTP 短连接高频交替场景中,主动关闭连接方会进入长达 2MSL(通常为 60 秒)的 TIME_WAIT 状态,耗尽客户端源端口及系统套接字内存。

2.1 复用 TIME_WAIT 套接字:tcp_tw_reuse

允许将处于 TIME_WAIT 状态的套接字用于新的出站 TCP 连接(仅对 Outgoing 连接有效,须开启时间戳 tcp_timestamps=1):

sysctl -w net.ipv4.tcp_timestamps=1
sysctl -w net.ipv4.tcp_tw_reuse=1

2.2 控制 TIME_WAIT 总数上限:tcp_max_tw_buckets

限制系统同时保持 TIME_WAIT 套接字的最大数量。超出部分会被直接销毁并打印警告:

sysctl -w net.ipv4.tcp_max_tw_buckets=262144

三、TCP 内存与缓冲区(RMEM / WMEM)调优

在高吞吐量网络环境下,合理增大 TCP 读写缓冲区可以有效提升单连接的传输效率并减少 CPU 中断处理频率。

3.1 系统级与 TCP 级缓冲区设置

# 读缓冲区上限与默认值(min, default, max)
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_max=16777216

# TCP 读缓冲区自适应(单位:页,4KB)
sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"

# TCP 写缓冲区自适应
sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"

# 开启窗口缩放功能以支持大于 64KB 的滑动窗口
sysctl -w net.ipv4.tcp_window_scaling=1

四、文件描述符与端口资源限制(System Limits)

在 Linux 体系中,“一切皆文件”。每个 TCP Socket 均占用一个文件描述符(FD)。除了内核参数,应用层句柄数同样需要同步放开。

4.1 全局与单进程 FD 限制

# 系统全局最大文件描述符数
sysctl -w fs.file-max=2097152

# 可用临时端口范围扩展(避免源端口耗尽)
sysctl -w net.ipv4.ip_local_port_range="1024 65535"

4.2 修改 limits.conf(用户级资源限制)

编辑 /etc/security/limits.conf 配置文件:

* soft nofile 1048576
* hard nofile 1048576
* soft nproc  1048576
* hard nproc  1048576

五、生产环境推荐 sysctl.conf 完整配置模版

将以下参数追加至 /etc/sysctl.conf 中,并执行 sysctl -p 立即生效:

# /etc/sysctl.conf 针对高并发网络服务的完整调优清单

# 文件句柄限制
fs.file-max = 2097152

# 全连接与半连接队列
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.core.netdev_max_backlog = 65535

# 端口范围扩展
net.ipv4.ip_local_port_range = 1024 65535

# TIME_WAIT 回收与上限
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_tw_buckets = 262144
net.ipv4.tcp_fin_timeout = 15

# 缓冲区优化
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_window_scaling = 1

# 保活探测策略(快速释放死连接)
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3

六、总结与验证命令

参数应用后,可通过系统内置的网络运维工具观察排查连接瓶颈:

  • ss -s: 查看当前套接字占用概览(建立数、TIME_WAIT 数、CLOSED 数)。
  • netstat -s | grep -i listen: 检查是否存在连接队列溢出(overflows / drops)。
  • dmesg -T | grep -i "SYN flooding": 检查内核日志是否有半连接队列满警告。