温馨提示×

Linux backlog如何定期检查

小樊
45
2025-11-15 13:11:41
栏目: 智能运维

Linux backlog 定期检查与告警

一 关键指标与含义

  • backlog 队列:指监听套接字的未完成连接队列(accept 队列)。应用调用 listen(…, backlog) 设置应用层队列上限;内核参数 net.core.somaxconn 是系统级上限;内核统计中的 TcpExt:ListenOverflowsTcpExt:ListenDrops 能反映队列溢出/丢弃情况,用于判断是否存在积压风险。相关内核项还包括 net.ipv4.tcp_max_syn_backlog(半连接 SYN 队列上限)与 net.core.netdev_max_backlog(网卡接收队列上限)。

二 命令行快速巡检

  • 查看监听套接字与队列上限
    • 列出所有监听套接字及其队列上限:ss -lnt
    • 查看 TCP 统计摘要(含 ListenOverflows/ListenDrops):netstat -s -p tcpss -s
  • 检查内核与网络关键参数
    • 系统级队列上限:cat /proc/sys/net/core/somaxconn
    • SYN 队列上限:cat /proc/sys/net/ipv4/tcp_max_syn_backlog
    • 网卡接收队列上限:cat /proc/sys/net/core/netdev_max_backlog
    • TCP 扩展统计(含溢出/丢弃):cat /proc/net/snmp | grep -E ‘TcpExt:ListenOverflows|TcpExt:ListenDrops’
  • 抓包侧证(间接判断)
    • 观察新连接请求是否大量出现重传/超时:sudo tcpdump -ni any ‘tcp[tcpflags] & (tcp-syn) != 0’ -c 1000

三 定时巡检脚本与阈值建议

  • 示例脚本(检查所有监听套接字的最大 backlog 与内核溢出计数,超过阈值告警)
    • 保存为 /usr/local/bin/check_backlog.sh,可执行:chmod +x /usr/local/bin/check_backlog.sh
    • 通过 crontab -e1 分钟执行:*/1 * * * * /usr/local/bin/check_backlog.sh
    • 阈值建议:应用 backlog 上限(ss Recv-Q 最大值)>800ListenOverflows1 分钟内增加 >0 触发告警(按业务并发与历史基线调整)。
#!/usr/bin/env bash
set -Eeuo pipefail

# 可配置阈值
WARN_BACKLOG=800
WARN_OVERFLOWS=0
INTERVAL=60  # 秒,用于计算增量

LOG_TAG="backlog-check"
ALERT_EMAIL="admin@example.com"

# 获取当前监听套接字的最大 Recv-Q(应用 backlog 使用量)
max_recvq=0
while IFS= read -r line; do
  # 例:0  128  127.0.0.1:80  0.0.0.0:*  users:(("nginx",pid=123,fd=6))
  recvq=$(echo "$line" | awk '{print $2}' | tr -d ' ')
  if [[ "$recvq" =~ ^[0-9]+$ ]] && (( recvq > max_recvq )); then
    max_recvq=$recvq
  fi
done < <(ss -lnt | tail -n +2)

# 获取 ListenOverflows 增量
prev_file="/tmp/backlog_listenoverflows.prev"
curr=$(grep -E 'TcpExt:ListenOverflows:' /proc/net/snmp 2>/dev/null | awk '{print $2}' || echo 0)
prev=$(cat "$prev_file" 2>/dev/null || echo 0)
echo "$curr" > "$prev_file"
overflows=$(( curr - prev ))

# 获取 somaxconn
somaxconn=$(cat /proc/sys/net/core/somaxconn 2>/dev/null || echo 0)

# 日志输出
{
  echo "$(date '+%F %T') [INFO] max_recvq=$max_recvq (somaxconn=$somaxconn) overflows_delta=$overflows interval=${INTERVAL}s"
} >> "/var/log/$LOG_TAG.log"

# 阈值判断与告警
if (( max_recvq > WARN_BACKLOG )) || (( overflows > WARN_OVERFLOWS )); then
  subject="[ALERT] Backlog high or overflow detected on $(hostname)"
  body="$(date '+%F %T')
max_recvq=$max_recvq (somaxconn=$somaxconn)
ListenOverflows delta=$overflows (interval=${INTERVAL}s)
ss -lnt output (head):
$(ss -lnt | head)"
  echo "$body" | mail -s "$subject" "$ALERT_EMAIL"
fi
  • 说明
    • 该脚本仅读取 /procss 的瞬时值,轻量且适合放入 cron 定时执行。
    • 如需更稳健的“队列使用率”,可用 ListenDrops/ListenOverflows 的速率(如每分钟增量)作为核心指标。

四 长期监控与可视化

  • Prometheus + Exporter 方案
    • 使用 node_exporter 采集 /proc/net/snmp 中的 TcpExt:ListenOverflows/ListenDrops 等指标,配合 Prometheus 记录随时间变化,并用 Alertmanager 配置阈值告警(如 1 分钟增量 > 0 或队列使用率超阈值)。
    • 若需直接采集应用层 backlog 使用量,可在应用或 Exporter 中解析 ss -lnt 输出并暴露为指标。
  • 传统监控平台
    • Zabbix/Nagios 可通过 UserParameter 执行 ss/netstat 命令或读取 /proc 文件,设置阈值与告警动作,形成周期性巡检与趋势报表。

五 参数优化与维护要点

  • 合理设置队列上限
    • 应用层 backlog 不宜过小(易拒绝新连接),也不宜过大(占用更多内核内存);通常设置为业务峰值并发的 1/2 ~ 2/3,并结合 net.core.somaxconn 调整。
  • 关键内核参数(按需评估后变更)
    • net.core.somaxconn:监听队列系统上限
    • net.ipv4.tcp_max_syn_backlog:半连接队列上限
    • net.core.netdev_max_backlog:网卡接收队列上限
    • 变更后需重启相关服务或应用以生效,并在变更窗口内加强观测。
  • 稳定性与安全性
    • 结合 日志轮转(logrotate)集中日志(rsyslog/ELK)安全策略(防火墙限速/清洗),避免 backlog 被恶意连接耗尽。
    • 优化应用(线程池、连接超时、accept 效率)与内核/网络栈参数,减少队列积压与丢包。

0