温馨提示×

Linux backlog为何高

小樊
37
2026-08-02 04:03:05
栏目: 智能运维

在 Linux 系统中,backlog 高(一般指连接队列、请求队列积压)通常出现在网络、I/O 或应用服务场景中。下面从常见含义、原因、排查方法三个层面系统说明。


一、backlog 是什么?

在 Linux 中,“backlog”通常指的是等待处理的请求队列长度,常见场景有:

  1. TCP 监听队列 backlog

    • listen(fd, backlog)
    • 包括:
      • 半连接队列(SYN_RECV)
      • 全连接队列(ESTABLISHED 但应用未 accept)
  2. 应用层队列

    • Nginx / Redis / MySQL 等自身维护的请求 backlog
  3. 内核队列 / 子系统队列

    • netfilter
    • socket 缓冲区
    • 磁盘 I/O 队列

二、最常见原因(重点)

1️⃣ TCP backlog 满了(最常见)

表现

  • 新连接建立慢
  • 客户端 connect timeout
  • SYN 丢包
  • 服务端 accept() 不及时

原因

原因 说明
应用 accept() 业务线程阻塞或不足
backlog 设置太小 listen(fd, 128)
半连接攻击 SYN Flood
CPU 打满 无法及时处理
应用重启 / hang 住 accept 没人调用

查看方式

ss -lnt

Recv-Q

LISTEN 0 128 0.0.0.0:80

如果:

LISTEN 0 1024 0.0.0.0:80

Recv-Q 接近 backlog → 满了


2️⃣ 应用处理能力不足

  • 工作线程太少
  • 请求阻塞(DB、锁、RPC)
  • 单线程模型(Redis、老架构)

✅ 解决:

  • 增加 worker 数量
  • 异步化
  • 降低单请求耗时

3️⃣ SYN Flood / 网络攻击

表现

  • 半连接非常多
  • 正常连接失败
netstat -ant | grep SYN_RECV | wc -l

内核参数检查

sysctl net.ipv4.tcp_max_syn_backlog
sysctl net.ipv4.tcp_syncookies

✅ 建议:

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 8192

4️⃣ backlog 配置过小

示例

listen(fd, 128);

而系统允许的最大值受:

sysctl net.core.somaxconn

✅ 推荐调整:

net.core.somaxconn = 4096

5️⃣ TIME_WAIT / 端口耗尽(间接导致 backlog 高)

  • 高并发短连接
  • 客户端端口不够
  • 连接复用时失败

查看:

ss -ant | grep TIME_WAIT | wc -l

建议:

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30

三、排查步骤(实战)

1️⃣ 看监听队列

ss -lnt

2️⃣ 看连接状态

ss -ant | awk '{print $1}' | sort | uniq -c | sort -n

3️⃣ 看 CPU 和负载

top
vmstat 1

4️⃣ 看进程是否在 accept

strace -p <pid> -e accept

四、典型组合解释

现象 原因
Recv-Q 高 应用 accept 不及时
SYN_RECV 多 半连接队列满 / SYN Flood
CPU 正常但 backlog 高 应用阻塞
瞬时高峰后恢复 backlog 设置太小

五、如何降低 backlog?

✅ 正确方向不是“降低 backlog”,而是:

  • 提高处理能力
  • 合理增大 backlog
  • 防止异常堆积

六、一句话总结

Linux backlog 高,本质是“请求到达速度 > 系统处理速度”,通常是应用 accept 慢、线程不足、backlog 配置过小或网络攻击导致。

如果你能提供:

  • TCP / Nginx / Redis / MySQL
  • ss -lnt 输出
  • 是否高并发短连接

我可以帮你精准定位是哪一类 backlog 问题

0