人人都会AI编程

21.4 网络内核参数调优

更新时间:2026-07-12

Linux 内核的网络栈提供了大量可调参数,它们控制着 TCP/IP 协议的行为、内存使用、连接状态和性能表现。合理的调优能让服务器在千兆网络下承载数十万并发连接,或在广域网高延迟场景中保持较高的吞吐。调优的前提是理解参数含义,基于实际负载调整,避免盲目照搬

1. 如何查看和修改参数

所有网络相关内核参数都在 /proc/sys/net/ 下以文件形式暴露,常用的集中路径为 /proc/sys/net/core//proc/sys/net/ipv4//proc/sys/net/ipv6/。使用 sysctl 命令可以统一管理:

sysctl -a | grep net.core    # 查看所有 net.core 参数
sysctl net.ipv4.tcp_rmem    # 查看某个参数的值

临时修改(重启后失效):

sysctl -w net.ipv4.tcp_fastopen=3

永久修改需写入 /etc/sysctl.conf/etc/sysctl.d/ 下的配置文件,然后执行 sysctl -p 使其生效。

2. TCP 缓冲区与窗口大小

  • net.core.rmem_defaultnet.core.wmem_default:接收和发送缓冲区的默认大小。
  • net.core.rmem_maxnet.core.wmem_max:单个 socket 缓冲区能够设置的最大值。
  • net.ipv4.tcp_rmemnet.ipv4.tcp_wmem:三个数值组成的向量(min, default, max),单位为字节。内核会根据连接情况在最小和最大值之间自动调整缓冲区,以实现流量控制和吞吐优化。

对于高带宽长延迟的网络(如跨国专线),可以适当增大最大值,以充分利用带宽:

sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_max=16777216
sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"

注意:增大缓冲区会占用更多内存,每个 TCP 连接都可能按需使用,因此需根据总连接数合理设置。

3. 连接数与 TIME-WAIT 处理

高并发 Web 服务器或代理服务器经常面临端口耗尽问题,这与 TIME-WAIT 状态的套接字囤积有关。

  • net.ipv4.tcp_tw_reuse:从安全角度出发,允许将处于 TIME-WAIT 状态的套接字用于新的 TCP 连接(需双方支持时间戳,默认已支持)。对客户端角色有用。注意:核心里已移除了 tcp_tw_recycle(在 Linux 4.12+ 中弃用),因为它会破坏 NAT 网络连接。
  • net.ipv4.ip_local_port_range:定义一个连接主动打开时可用的临时端口范围。范围太小会导致端口耗尽。通常调整为 1024 65535(需注意避免冲突已知服务端口)。
  • net.ipv4.tcp_max_tw_buckets:系统允许的最大 TIME-WAIT 套接字数量,超过此数时新产生的 TIME-WAIT 会被立即清除并打印警告。高并发场景可适当提高到 200000 以上,但终究应优化服务减少短连接。

例如,一个作为反向代理的服务器通常这样设置:

sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.ip_local_port_range="1024 65000"
sysctl -w net.ipv4.tcp_max_tw_buckets=500000

4. TCP 连接建立与队列

服务器面对瞬时高并发连接请求时,内核的监听队列可能出现溢出,导致客户端收到 SYN/ACK 丢失或 RST。

  • net.core.somaxconn:全连接队列(已完成三次握手、等待 accept() 处理的连接)的最大长度。许多应用(如 Nginx)的 backlog 会受此值截断,默认 128 往往不足,建议设为 4096 或更高。
  • net.ipv4.tcp_max_syn_backlog:半连接队列(收到 SYN 但尚未完成三次握手的连接)的最大数量。遭受 SYN 洪水攻击时此队列可能瞬间满额,适当提高并配合 SYN Cookies 使用。
  • net.ipv4.tcp_syncookies:设置为 1 时,当半连接队列溢出,内核使用 SYN Cookie 方式无状态响应 SYN 请求,有效抵御 SYN Flood 攻击,同时保证合法连接不丢失。一般建议开启,除非有特殊理由。
sysctl -w net.core.somaxconn=4096
sysctl -w net.ipv4.tcp_max_syn_backlog=8192
sysctl -w net.ipv4.tcp_syncookies=1

5. TCP 长连接与 Keep-Alive

对于需要长期空闲但保持连接的服务(如数据库连接、WebSocket、SSH),合理配置 TCP Keep-Alive 可及时释放死连接,释放资源。

  • net.ipv4.tcp_keepalive_time:连接空闲多少秒后开始发送 Keep-Alive 探测。默认 7200 秒(2 小时)过长,可缩短为 600 或 1800。
  • net.ipv4.tcp_keepalive_intvl:两次探测之间的间隔,默认 75 秒。
  • net.ipv4.tcp_keepalive_probes:发送多少个探测包无响应后判定连接失效,默认 9 次。

例如,将空闲时间设为 300 秒(5 分钟),间隔 10 秒,探测 3 次:

sysctl -w net.ipv4.tcp_keepalive_time=300
sysctl -w net.ipv4.tcp_keepalive_intvl=10
sysctl -w net.ipv4.tcp_keepalive_probes=3

6. 拥塞控制算法与特性

  • net.ipv4.tcp_congestion_control:查看或设置当前使用的拥塞控制算法。现代 Linux 默认通常为 cubic,对于数据中心或无线环境可考虑 bbr(Bottleneck Bandwidth and RTT)。bbr 需要内核支持(Linux 4.9+),开启后能显著提升高丢包链路吞吐:
  sysctl -w net.ipv4.tcp_congestion_control=bbr
  
  • net.ipv4.tcp_window_scaling:TCP 窗口缩放选项,默认开启,允许大于 64KB 的窗口,高带宽环境下必须保持开启(设为 1)。
  • net.ipv4.tcp_fastopen:TCP 快速打开,允许在 SYN 包中携带数据,减少连接建立的 RTT。客户端和服务器都应启用。设 3 代表同时启用客户端和服务端功能:
  sysctl -w net.ipv4.tcp_fastopen=3
  

7. 文件描述符限制(与网络相关)

虽非内核 IP 参数,但高并发必须调整进程可打开文件数的限制(每个 socket 是一个文件描述符)。修改 /etc/security/limits.conf 或使用 ulimit -n 1000000 临时设置。系统全局文件描述符上限通过 fs.file-max 控制:

sysctl -w fs.file-max=2000000

8. 安全与防御性参数

  • net.ipv4.tcp_synack_retries:服务器回复 SYN/ACK 的重试次数,默认 5,表示在第一个 SYN/ACK 发出后等待 3s、6s、12s... 共 5 次,可在内网环境适当降低为 2 或 3 以加速释放半连接资源。
  • net.ipv4.ip_forward:IP 转发开关,当主机作为路由器或容器网关时必须开启(设为 1),否则设为 0 避免安全隐患。
  • net.ipv4.icmp_echo_ignore_all:设为 1 可以忽略所有 ICMP Echo 请求(ping),减少探测风险。
  • rp_filter:反向路径过滤,防止 IP 地址欺骗,用于多宿主主机时需视情况调整。建议严格模式(设为 1),但 VPN/负载均衡可能需关闭。

9. 调优流程与验证

  1. 评估现状:通过 ss -s 查看当前 TCP 连接统计,nstat -anetstat -s 查看协议计数器,发现是否存在大量 TIME-WAIT、连接失败、包重传等异常。
  2. 逐步修改:每次只调整少量参数,并在测试环境中观察效果,再上线生产环境。
  3. 监控资源:加大缓冲区、连接队列等会消耗更多内存,务必结合 free -h/proc/meminfo 监控内存使用,避免 OOM。
  4. 持久化:将确认有效的参数写入 /etc/sysctl.d/99-custom.conf,并使用版本控制和配置管理工具(如 Ansible)同步到所有节点。

真实场景举例:一台反向代理服务器,需要处理 10 万并发连接,长连接占大部分,采用如下核心设置(仅示例,需根据实际硬件调整):

# /etc/sysctl.d/99-proxy.conf
net.core.somaxconn = 8192
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 3
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_congestion_control = bbr
net.ipv4.tcp_fastopen = 3
fs.file-max = 2000000

切记:内核调优不是万能的魔法,它只应在明确识别到系统瓶颈并理解参数作用后实施。结合应用层优化(如合理使用连接池、HTTP keep-alive、CDN)、网络硬件和架构设计,才能构建真正高性能的服务。