温馨提示×

centos backlog监控方法介绍

小樊
45
2026-01-02 06:13:35
栏目: 智能运维

CentOS Backlog 监控方法

一 概念与关键指标

  • backlog 在 Linux 网络栈中对应两类队列:
    • 半连接队列(SYN 队列):存放收到 SYN 尚未完成三次握手的连接。
    • 全连接队列(Accept 队列):存放已完成三次握手、等待进程 accept() 的连接。
  • 全连接队列的实际上限并非应用 listen(backlog) 的设定值,而是取 min(应用 backlog, net.core.somaxconn);内核统计中常用 Recv-Q 近似观察队列使用情况(LISTEN 行 Recv-Q 接近该监听套接字的当前排队连接数)。半连接队列受 net.ipv4.tcp_max_syn_backlog 等影响。若队列溢出,内核可能丢弃新 SYN 或采取溢出策略(如 tcp_abort_on_overflow)。

二 命令行快速监控

  • 查看系统与内核参数上限
    • 当前全连接队列上限:cat /proc/sys/net/core/somaxconn
    • 半连接队列上限:cat /proc/sys/net/ipv4/tcp_max_syn_backlog
  • 查看监听套接字与队列使用情况
    • 简洁查看:ss -tnlp | column -t(关注 Recv-Q 与 Send-Q,LISTEN 行的 Recv-Q 近似队列当前长度)
    • 统计汇总:ss -s
    • 协议层统计:netstat -s | grep -i listen(可观察 listen 相关计数变化)
  • 抓包定位握手阶段问题
    • 观察 SYN/ACK 重传与队列溢出迹象:tcpdump -ni any ‘tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn or tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-ack’
  • 提示:若发现 Recv-Q 长期接近 somaxconn,说明全连接队列经常打满,需要结合应用与内核参数进一步排查与优化。

三 脚本化巡检与阈值告警

  • 目标:定期采集关键指标(somaxconn、当前 LISTEN 套接字 Recv-Q、SYN 统计),当接近阈值时告警。
  • 示例 Bash 脚本(可放入 cron 每 15 秒执行一次):
#!/usr/bin/env bash
set -o pipefail

# 阈值(可按业务调整)
WARN_FULL=0.7
CRIT_FULL=0.9
SOMAXCONN=$(cat /proc/sys/net/core/somaxconn 2>/dev/null || echo 128)
SYN_MAX=$(cat /proc/sys/net/ipv4/tcp_max_syn_backlog 2>/dev/null || echo 128)

# 获取所有 LISTEN 套接字中 Recv-Q 的最大值(近似全连接队列使用)
max_recvq=0
while read -r proto _ _ _ _ state recvq _; do
  [[ "$state" == "LISTEN" ]] || continue
  if (( recvq > max_recvq )); then
    max_recvq=$recvq
  fi
done < <(ss -tnlH 2>/dev/null)

# 计算使用率
usage=0
if (( SOMAXCONN > 0 )); then
  usage=$(awk "BEGIN{printf \"%.2f\", $max_recvq/$SOMAXCONN}")
fi

# 获取 ListenOverflows(全连接队列溢出计数)
overflow=0
if line=$(netstat -s 2>/dev/null | grep -i 'listen overflows'); then
  overflow=$(echo "$line" | awk '{print $1}' | tr -d ',')
fi

# 获取 SYN 相关计数(半连接压力观测)
syn_recv=0
if line=$(netstat -s 2>/dev/null | grep -i 'SYNs received'); then
  syn_recv=$(echo "$line" | awk '{print $1}' | tr -d ',')
fi

# 阈值判断与告警
msg=""
if (( $(awk "BEGIN{exit !($usage >= $CRIT_FULL)}") )); then
  msg="CRIT backlog usage=${usage} (max_recvq=${max_recvq}, somaxconn=${SOMAXCONN}) overflow=${overflow} syn_recv=${syn_recv}"
elif (( $(awk "BEGIN{exit !($usage >= $WARN_FULL)}") )); then
  msg="WARN backlog usage=${usage} (max_recvq=${max_recvq}, somaxconn=${SOMAXCONN}) overflow=${overflow} syn_recv=${syn_recv}"
fi

if [[ -n "$msg" ]]; then
  echo "$(date '+%F %T') $msg" | mail -s "Backlog Alert on $(hostname)" admin@example.com
fi
  • 说明:该脚本聚焦“全连接队列使用率 + ListenOverflows + SYN 接收计数”的组合信号,能更早识别连接拥塞与溢出风险。

四 可视化与长期告警

  • Prometheus + Alertmanager
    • 采集:使用 node_exporter 的 textfile 收集器或 Categraf/Telegraf 的 exec 插件定期执行上面的脚本,输出指标(如 node_backlog_usage、node_backlog_overflow、node_syn_recv)。
    • 告警规则示例:
groups:
- name: backlog
  rules:
  - alert: HighBacklogUsage
    expr: node_backlog_usage > 0.8
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "High backlog usage on {{ $labels.instance }}"
      description: "Current usage {{ $value | humanizePercentage }}, max_recvq={{ $labels.max_recvq }}, somaxconn={{ $labels.somaxconn }}"
  - alert: BacklogOverflow
    expr: increase(node_backlog_overflow[5m]) > 0
    labels:
      severity: critical
    annotations:
      summary: "Backlog overflow detected on {{ $labels.instance }}"
  • 传统监控平台
    • Zabbix/Nagios/Monit 可通过 UserParameter/脚本采集上述指标并设置阈值与通知。

五 排障与优化要点

  • 关联指标定位根因
    • Recv-Q 长期接近 somaxconnListenOverflows 增长,多为应用 accept() 不及时或处理能力不足;先排查应用并发/线程/GC/阻塞,再考虑调优内核与架构(如启用多 worker、SO_REUSEPORT、连接保活与超时优化)。
    • SYN 计数高且重传明显,可能是半连接队列或后端处理能力不足;结合 netstat -s | grep -i ‘SYN|retrans’ 与抓包观察,必要时适度提高 net.ipv4.tcp_max_syn_backlog 并检查是否遭受 SYN Flood。
  • 内核参数与生效方式
    • 临时调整:echo 2048 > /proc/sys/net/core/somaxconn
    • 永久生效:在 /etc/sysctl.conf 添加 net.core.somaxconn=2048 后执行 sysctl -p
  • 注意区分内核日志中的 “audit: backlog limit exceeded”
    • 这是 auditd 审计子系统的环形缓冲告警,和网络套接字 backlog 不同;可通过 auditctl -b 8192 调大缓冲并写入规则文件持久化。

0