linux

Linux backlog如何定期检查

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

Linux backlog 定期检查与告警

一 关键指标与含义

二 命令行快速巡检

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

#!/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

四 长期监控与可视化

五 参数优化与维护要点

0
看了该问题的人还看了