温馨提示×

如何优化Linux backlog

小樊
61
2026-07-18 07:42:39
栏目: 智能运维

优化 Linux 中的 backlog,通常指优化 网络 socket 的 backlog(半连接/全连接队列),目的是提升高并发场景下的连接处理能力,减少丢包和连接失败。下面从 原理 → 关键参数 → 优化步骤 → 常见场景 系统说明。


一、什么是 backlog

在 Linux 网络编程中,backlog 与 TCP 三次握手密切相关,主要涉及两个队列:

1️⃣ 半连接队列(SYN Queue)

  • 存放 未完成三次握手 的连接(SYN_RECV)
  • net.ipv4.tcp_max_syn_backlog 控制

2️⃣ 全连接队列(Accept Queue)

  • 存放 已完成三次握手、等待应用 accept() 的连接(ESTABLISHED)
  • min(backlog, net.core.somaxconn) 限制

listen(fd, backlog) 中的 backlog 不是最大值,而是和内核参数共同作用


二、核心参数说明(重点)

1️⃣ net.core.somaxconn

  • 全连接队列最大长度
  • 默认值通常较小(128 / 256)
cat /proc/sys/net/core/somaxconn

✅ 建议:

net.core.somaxconn = 65535

2️⃣ net.ipv4.tcp_max_syn_backlog

  • 半连接队列最大长度
  • 影响高并发 SYN 洪峰

✅ 建议:

net.ipv4.tcp_max_syn_backlog = 65535

3️⃣ net.ipv4.tcp_syncookies

  • 防止 SYN Flood 攻击
  • 半连接队列满时自动启用

✅ 建议:

net.ipv4.tcp_syncookies = 1

4️⃣ net.core.netdev_max_backlog

  • 网卡接收队列最大长度
  • 影响高流量场景

✅ 建议:

net.core.netdev_max_backlog = 65535

5️⃣ net.ipv4.tcp_abort_on_overflow

  • 全连接队列满时是否直接 RST

✅ 调试时可开启:

net.ipv4.tcp_abort_on_overflow = 1

⚠ 生产环境不建议长期开启


三、如何修改(永久生效)

方法 1:sysctl(推荐)

vim /etc/sysctl.conf

添加或修改:

net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_syncookies = 1
net.core.netdev_max_backlog = 65535

生效:

sysctl -p

四、应用层 backlog 设置

1️⃣ Nginx

listen 80 backlog=65535;

或:

listen 80 default backlog=65535;

2️⃣ Java(Netty / Tomcat)

serverSocket.bind(new InetSocketAddress(port), 65535);

Tomcat:

server.tomcat.accept-count=65535

3️⃣ Redis

tcp-backlog 65535

五、如何判断是否 backlog 不够

1️⃣ 查看丢包

netstat -s | grep -i listen

关注:

  • times the listen queue of a socket overflowed
  • SYNs to LISTEN sockets dropped

✅ 有数值说明 backlog 不够


2️⃣ ss 查看队列

ss -lnt

示例:

Recv-Q Send-Q Local Address:Port
128    128    0.0.0.0:80
  • Recv-QSend-Q → 队列满
  • 需要增大 backlog

六、常见优化场景

✅ 高并发 Web 服务

  • somaxconn + tcp_max_syn_backlog 调大
  • 应用 backlog 调大
  • 启用 syncookies

✅ 短连接密集型(API / RPC)

  • 重点优化 全连接队列
  • 减少 accept 延迟

✅ SYN Flood 攻击

  • 启用 syncookies
  • 限制半连接数量

七、注意事项(非常重要)

不能无限调大

  • 受内存、CPU、应用处理能力限制
  • 队列过大 ≠ 性能更好

✅ 调优顺序:

  1. 应用 accept 性能
  2. backlog 参数
  3. 内核参数
  4. 网络 / 硬件

八、推荐生产配置(通用)

net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_syncookies = 1
net.core.netdev_max_backlog = 65535

如果你愿意,可以告诉我:

  • 具体服务(Nginx / Redis / Java / Go)
  • 并发量级
  • 是否出现 connection refused / timeout

我可以给你一套 针对你业务的精确优化方案

0