温馨提示×

怎么监控Linux backlog

小樊
40
2026-08-28 13:33:08
栏目: 智能运维

在 Linux 里,“backlog” 不同场景含义不一样,监控方式也不同。下面按最常见的几种 backlog给你一个实用速查表,你可以直接对照用。


一、TCP / Socket backlog(最常见)

1️⃣ 什么是 TCP backlog

  • listen(fd, backlog) 里的 backlog
  • 分两部分(内核 2.2+):
    • SYN queue(半连接)
    • Accept queue(全连接,已完成三次握手)

主要关注 Accept queue 是否溢出


2️⃣ 查看当前 TCP backlog 情况(推荐)

✅ 使用 ss

ss -lnt

重点看:

Recv-Q
Send-Q

LISTEN 状态

  • Recv-Q当前 Accept queue 长度
  • Send-Qbacklog 上限

✅ 例子:

LISTEN 0 128 0.0.0.0:80

表示:

  • backlog = 128
  • 当前 Accept queue = 0

⚠️ 如果 Recv-Q == Send-Q,说明 backlog 满了


3️⃣ 查看是否有 backlog 溢出(丢包)

netstat -s | grep -i listen

关注:

times the listen queue of a socket overflowed

或:

grep -i overflow /proc/net/snmp

只要数值在增长,就说明 backlog 不够


4️⃣ 动态查看(推荐)

watch -n1 'ss -lnt | grep LISTEN'

二、SYN backlog(半连接队列)

查看 SYN 队列溢出

netstat -s | grep -i syn

关注:

SYNs to LISTEN sockets dropped

三、内核参数相关(backlog 上限)

查看系统级 backlog 限制

sysctl net.core.somaxconn
sysctl net.ipv4.tcp_max_syn_backlog

常见默认值:

  • somaxconn = 128
  • tcp_max_syn_backlog = 1024

✅ 可调优:

sysctl -w net.core.somaxconn=4096

四、应用层 backlog(开发角度)

  • Java / Go / C 等程序中:
listen(fd, backlog)

⚠️ 注意:

  • 实际生效的是:
min(backlog, net.core.somaxconn)

五、Systemd / Docker backlog(容易被忽略)

Systemd socket

systemctl show your.socket | grep Backlog

Docker

docker inspect <container> | grep -i backlog

六、backlog 满了的典型现象

  • accept() 变慢
  • 客户端连接超时
  • ss -lnt 中 Recv-Q == Send-Q
  • netstat -s 中 overflow 增加
  • 短连接服务 QPS 抖动

七、推荐监控方案(生产可用)

1️⃣ Prometheus + Node Exporter

关注:

  • node_netstat_ListenOverflows
  • node_sockstat_sockets_inuse

2️⃣ 实时监控脚本

ss -lnt | awk '
NR>1 {
  if ($2 >= $3) {
    print "⚠️ Backlog FULL:", $4
  }
}'

八、backlog ≠ 性能瓶颈(重要)

❌ backlog 大 ≠ 性能好
✅ backlog 只是 临时缓冲

真因通常是:

  • accept()
  • 应用处理能力不足
  • 线程/协程不够

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

  • Nginx / Redis / Java / Go / MySQL 哪种服务?
  • 短连接还是长连接
  • 压测场景还是线上故障

我可以直接给你 针对性调优方案 + 监控命令组合

0