温馨提示×

Linux backlog满了怎么办

小樊
54
2026-08-28 13:30:07
栏目: 智能运维

在 Linux 中,“backlog 满了”不是一个单一问题,而是要看具体场景。下面按最常见的几种情况给你排查思路和解决办法。


一、最常见:TCP backlog 满了(监听队列满)

现象

  • 新建连接失败、超时
  • dmesg/var/log/messages 里可能出现:
    TCP: drop open request from ...
    TCP: Possible SYN flooding on port 80
    
  • ss -lt 看到 Recv-Q 很高

原因

  • 应用调用 listen(fd, backlog) 太小
  • 并发连接太多
  • 应用 accept 不够快

排查

ss -lt

示例:

LISTEN 0  128  0.0.0.0:80

如果 Recv-Q 接近 Send-Q,说明 backlog 满了。

解决办法

1️⃣ 调大应用层 backlog

  • Nginx
listen 80 backlog=2048;
  • Java
server.setBacklog(2048);
  • C / Go / Python
    修改 listen() 的 backlog 参数

2️⃣ 调大内核参数

sysctl -w net.core.somaxconn=4096
sysctl -w net.ipv4.tcp_max_syn_backlog=8192

永久生效:

cat >> /etc/sysctl.conf <<EOF
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 8192
EOF
sysctl -p

✅ 建议:
listen backlog ≤ somaxconn


二、SYN backlog 满了(SYN Flood / 半连接队列)

现象

  • 大量 SYN_RECV
  • 新连接很难建立
ss -s

解决

sysctl -w net.ipv4.tcp_syncookies=1

✅ 这是 Linux 防止 SYN Flood 的标准做法


三、磁盘 / 文件系统 backlog(inode / dentry)

现象

  • No space left on device
  • df 有空间,但 df -i 满了

排查

df -h
df -i

解决

  • 删除大量小文件
  • 清理日志
  • 调整 inode 数量(需重新格式化)

四、应用层队列 backlog(消息 / 任务)

常见场景

  • Kafka / Redis / MQ
  • 自定义线程池、任务队列

排查

  • 查看应用监控
  • 查看队列长度、拒绝次数

解决

  • 增加消费者
  • 增大队列长度
  • 限流、削峰

五、systemd / journal backlog

现象

  • journal 日志很大
  • journalctl -f 卡顿

解决

journalctl --vacuum-time=7d

或限制大小:

journalctl --vacuum-size=500M

六、快速定位 checklist ✅

你可以按顺序执行:

ss -lt
ss -s
dmesg | tail
df -h
df -i
sysctl net.core.somaxconn

七、如果你愿意,我可以直接帮你定位

请告诉我:

  1. 报错的完整信息
  2. 什么服务(Nginx / Java / 数据库 / 自研程序)
  3. 连接失败磁盘满还是 应用报错

我可以直接给你精确到参数的解决方案

0