Linux 内核网络参数调优指南
详解 Linux 内核网络参数调优,核心调整 net.core.somaxconn、net.ipv4.tcp_max_syn_backlog、net.ipv4.tcp_tw_reuse 等,覆盖 sysctl 查询/临时生效/持久化,并给出生产建议与实测回显。
Linux 内核网络参数调优指南
目标:针对高并发网络服务对 Linux 内核的套接字与 TCP 协议栈参数进行调优,通过调整
net.core.somaxconn=65535、net.ipv4.tcp_max_syn_backlog=65535、net.ipv4.tcp_tw_reuse=1等核心参数,提升连接队列容量与连接复用效率。本文所有命令均在 Ubuntu 22.04(内核 6.8.0-generic)真实环境实测。
环境信息
- 操作系统:Ubuntu 22.04.5 LTS
- 内核:6.8.0-138-generic(x86_64)
- CPU:6 核;内存:16 GB
- 相关参数默认值:
net.core.somaxconn=4096、net.ipv4.tcp_max_syn_backlog=1024、net.ipv4.tcp_tw_reuse=2
前置条件
- 需拥有 root 权限(
sudo或直接 root)。 - 网络参数修改是全局性的,影响所有运行中的网络服务,强烈建议先在测试机验证。
参数查看方式
内核网络参数集中在 /proc/sys/net 目录,可用 sysctl 命令查看。参数即一个可读写的内核变量文件。
# 查看单个参数
sysctl net.core.somaxconn
# 输出: net.core.somaxconn = 4096
# 查看多个参数
sysctl net.core.somaxconn net.ipv4.tcp_max_syn_backlog net.ipv4.tcp_tw_reuse
# net.core.somaxconn = 4096
# net.ipv4.tcp_max_syn_backlog = 1024
# net.ipv4.tcp_tw_reuse = 2
# 查看某一类参数
sysctl -a | grep -E "net.core.somaxconn|tcp_tw_reuse"
sysctl 常用子命令说明
| 命令 | 说明 |
|---|---|
sysctl 参数名 | 读取单个参数值 |
sysctl -a | 列出全部参数 |
sysctl -w 参数=值 | 临时写入参数(立即生效,重启失效) |
sysctl -p | 从 /etc/sysctl.conf 加载配置 |
sysctl --system | 从 systemd 管理的所有 sysctl 配置目录加载 |
💡 说明:
sysctl -w与直接写入/proc/sys/net/...等价,只是命令封装。
参数总览
| 参数 | 作用 | 默认值 | 建议值 |
|---|---|---|---|
net.core.somaxconn | 全连接队列(accept 队列)最大长度,背压上限 | 4096 | 65535 |
net.ipv4.tcp_max_syn_backlog | 半连接队列(SYN 队列)最大长度 | 1024 | 65535 |
net.ipv4.tcp_tw_reuse | TIME_WAIT 状态连接复用 | 2(Ubuntu 默认) | 1 |
net.ipv4.tcp_fin_timeout | TCP 连接 FIN 等待超时(socket 层) | 60 | 30 |
net.ipv4.tcp_keepalive_time | TCP keepalive 空闲探测时间 | 7200 | 建议 600 |
net.ipv4.tcp_syn_retries | SYN 重传次数 | 6 | 2 |
net.ipv4.tcp_mtu_probing | MTU 探测(应对 TCP 分片) | 0 | 1 |
1. net.core.somaxconn 全连接队列容量
作用:指定 listen() 系统调用中 backlog 参数的绝对上限。应用调用 listen(fd, N) 时,N 取内核已建立未 accept() 的连接队列长度上限。Nginx、Redis、MySQL、Node.js 等多会将其设为较大值。
# 临时生效
sysctl -w net.core.somaxconn=65535
# 输出: net.core.somaxconn = 65535
⚠️ 注意:
net.core.somaxconn若调小,会强制压缩应用层的 backlog 请求;应用层也应把 listen backlog 设得足够大(见《Nginx 并发优化》listen指令)。
2. net.ipv4.tcp_max_syn_backlog 半连接队列
作用:尚未完成三次握手的 SYN 半连接队列长度上限。在高并发未确认攻击或大规模 SYN 突发时,该队列决定服务端能同时"在途"处理多少建连请求。
sysctl -w net.ipv4.tcp_max_syn_backlog=65535
若同时开启 net.ipv4.tcp_syncookies=1(默认开启),可显著缓解 SYN 队列溢出,此时该值上限受 net.ipv4.tcp_max_syn_backlog 与 net.ipv4.tcp_syncookies 综合影响。
3. net.ipv4.tcp_tw_reuse TIME_WAIT 复用
作用:允许将处于 TIME_WAIT 状态的连接用于新连接。TIME_WAIT 是主动关闭方关闭后保留 2MSL(默认 60s)的状态,大量短连接会导致端口与内存短暂占用。
# Ubuntu 22.04 实测默认已是 2(表示同时启用 reuse + recycle),建议显式置 1
sysctl -w net.ipv4.tcp_tw_reuse=1
⚠️ 注意:
tcp_tw_reuse只对客户端发起连接时有效(复用 TIME_WAIT 作为新连接),对服务端被动接收不生效;服务端大量 TIME_WAIT 应使用长连接或 SO_REUSEADDR 优化。
4. 生产建议集合
将以下内容写入 /etc/sysctl.d/99-network-tuning.conf,实现持久化(重启仍生效):
# 99-network-tuning.conf —— 网络协议栈调优
# 全连接队列容量
net.core.somaxconn = 65535
# 半连接(SYN)队列容量
net.ipv4.tcp_max_syn_backlog = 65535
# 及时复用 TIME_WAIT 连接
net.ipv4.tcp_tw_reuse = 1
# 文件描述符上限(配合高并发 socket 服务)
net.core.file_max = 1048576
# 增大本地端口范围,缓解大量出站连接耗尽端口
net.ipv4.ip_local_port_range = 1024 65535
应用配置并验证:
sysctl -p /etc/sysctl.d/99-network-tuning.conf
# 验证
sysctl net.core.somaxconn net.ipv4.tcp_max_syn_backlog net.ipv4.tcp_tw_reuse
5. 常见问题
Q:修改后重启系统恢复默认怎么办?
A:sysctl -w 是临时生效,必须写入 /etc/sysctl.d/*.conf 并 sysctl --system 加载才持久。
Q:不同发行版默认值为何不同?
A:发行版基于各自内核配置与 workload 决策默认值(如 Ubuntu tcp_tw_reuse 默认 2,RHEL 默认 0)。应以 sysctl 参数 读取值为准。
Q:调大队列就一定能提升吞吐吗? A:不一定。队列容量只是"允许积压",真正吞吐取决于 CPU 网卡轮询、协议栈处理能力;盲目调大可能导致内存占用与延迟上升。
卸载方式
删除 /etc/sysctl.d/99-network-tuning.conf 或注释对应行,再 sysctl --system 恢复默认。
参考链接
- Linux man 手册:
man sysctl、man sysctl.conf - 内核文档:
/usr/share/doc/linuxTCP 相关参数说明