温馨提示×

Linux dropped如何监控和预警

小樊
36
2025-12-31 13:05:47
栏目: 智能运维

Linux dropped 监控与预警实战

一、先明确 dropped 的来源与含义

  • 常见来源与含义如下(不同工具命名略有差异,需结合上下文判断):
    • 网卡层:ifconfig/ip -s、ethtool -S 中的 RX/TX dropped、rx_dropped、tx_dropped、RX-OVR、RX-DRP、RX-ERR。其中 RX-OVR 多指网卡 Ring Buffer 溢出,RX-DRP 多为内核处理不及时导致的丢弃,RX-ERR 偏向物理链路错误(CRC、帧格式等)。
    • 协议栈/队列层:netstat -s、ss -s 中的 retransmitted、fast retransmits、TCPDSACKRecv 等重传类指标,反映网络拥塞或链路质量导致的丢包/重传。
    • 软中断/CPU 层:/proc/net/softnet_statdropped 字段,表示因 backlog 队列溢出被丢弃的数据包,常与软中断不均衡、CPU 饱和相关。
    • 中间策略层:tc qdiscpolicer/netem 等策略会主动丢包,这类丢弃通常不在网卡 RX/TX 计数中体现,需单独核查。
    • 路径层:ping/mtr 的丢包率用于端到端连通性验证,可快速判断是否为外部路径问题。

二、快速落地监控方案

  • 命令行巡检(适合临时排查与基线建立)
    • 网卡与驱动状态:ip -s link show、ethtool eth0、ethtool -S eth0、ethtool -i eth0(关注 Link detected、Speed/Duplex、errors、dropped、rx_no_buffer_count 等)。
    • 协议栈与套接字:netstat -s、ss -itme(关注 retrans、rto、cwnd、ssthresh、backlog 等)。
    • 软中断与 CPU:cat /proc/interrupts、cat /proc/softirqs、watch -n 1 “cat /proc/net/softnet_stat”(观察 NET_RX 软中断与 softnet_stat 的 dropped 增长)。
    • 队列与策略:tc qdisc show dev eth0、tc -s qdisc show(确认是否存在 policer/netem 等策略导致的丢包)。
    • 端到端路径:ping -c 100 目标、mtr -n --report --report-cycles 100 目标(定位是否为路径中间节点丢包)。
  • 可视化与长期采集(适合生产环境)
    • 采集与可视化:部署 Prometheus + node_exporter + nicstat_exporter/grafana,或 Zabbix 自定义脚本采集 ifconfig/ip/ethtool 指标,绘制 dropped、errors、retrans 趋势面板。
    • 日志与告警:用 Alertmanager 或 Zabbix 触发器对关键指标设置阈值告警(如 dropped 在 5 分钟 内增长超过阈值、或重传率异常升高)。

三、预警规则与阈值建议

  • 网卡层
    • 告警:ifconfig/ip -s 的 RX/TX dropped5 分钟 增量超过 N(按带宽与业务容忍度设定,如 0.1% 或绝对阈值);ethtool -S 的 rx_no_buffer_count 持续增长。
    • 处置要点:检查 Ring Buffer 大小(ethtool -g),必要时适度调大;排查 中断亲和与多队列(RSS/RPS/XPS)是否均衡;结合软中断分布确认 CPU 瓶颈。
  • 协议栈/套接字
    • 告警:netstat -s/ss -s 中的 retransmitted、fast retransmits5 分钟 内突增;TCP 重传率(retrans/s)超过基线 2–3σ
    • 处置要点:结合 rto、cwnd、ssthresh 判断拥塞;核查对端健康、链路质量与窗口限制。
  • 软中断/CPU
    • 告警:/proc/net/softnet_statdropped 持续增长,且 NET_RX 软中断集中在少数核;CPU 软中断占用长期高于 70%
    • 处置要点:优化 RPS/XPS、中断亲和与队列分布;必要时扩容 CPU 或优化应用收包路径。
  • 队列/策略
    • 告警:tc -s qdisc 显示 policer/netem 等策略导致的丢包计数增长。
    • 处置要点:确认是否为业务需要;非必要时移除或调整策略参数。
  • 路径层
    • 告警:ping/mtr 报告的 丢包率 超过 1–2% 或抖动异常。
    • 处置要点:联动网络侧排查中间链路与对端设备健康。

四、一键巡检与告警脚本示例

  • 网卡 dropped 增量告警(Shell,适配 Linux)
    • 思路:记录上一次 RX/TX dropped,计算 5 分钟 增量,超过阈值则告警(日志+邮件)。
    • 示例(可按需改造为 systemd 服务或纳入 Zabbix Agent):
      #!/usr/bin/env bash
      IFACE="eth0"
      THRESHOLD=10          # 5分钟增量阈值(packets)
      LOG="/var/log/drop_warn.log"
      TMP="/tmp/ifstat_${IFACE}.prev"
      
      now=$(date '+%F %T')
      read rx1 tx1 < <(ip -s -json link show dev "$IFACE" | \
        jq -r '[.stats.rx.dropped, .stats.tx.dropped] | @tsv')
      
      if [[ -f "$TMP" ]]; then
        read rx0 tx0 < "$TMP"
        drx=$((rx1 - rx0)); dtx=$((tx1 - tx0))
        if (( drx > THRESHOLD || dtx > THRESHOLD )); then
          echo "[$now] WARN $IFACE dropped RX+TX: $drx+$dtx" >> "$LOG"
          # 可替换为实际告警方式:curl 调用 webhook / mailx / sendmail
          echo "Subject: $IFACE dropped $drx+$dtx" | mailx -s "Net dropped alert" ops@example.com
        fi
      fi
      echo "$rx1 $tx1" > "$TMP"
      
  • 端到端丢包监控(ping + 阈值告警)
    • 思路:对关键目标持续 ping,统计丢包率,超过阈值即告警(可配合邮件或企业微信/钉钉机器人)。
    • 参考实现思路与阈值判断可借鉴常见 ping 丢包报警脚本 的做法,将丢包率与收发包统计结合,周期性执行并告警。

五、定位与优化要点

  • 先软后硬、由外到内:先看 ping/mtr 判断是否为路径问题;再查 网卡/驱动队列/软中断;最后回到 协议栈与应用
  • 关注 Ring Buffer 与中断分布:ethtool -g/-G 调整 RX/TX ring;/proc/interrupts 与 RPS/XPS 均衡软硬中断;必要时优化 RSS 哈希 与队列数。
  • 不要忽略中间策略:tc qdisc show 确认是否有 policer/netem 等策略导致丢包;清理或调整策略后再评估指标。
  • 结合重传与窗口:ss -itme、netstat -s 观察 retrans、rto、cwnd、ssthresh,区分拥塞丢包与链路丢包。
  • 硬件与驱动健康:dmesg/日志检查 firmware crash、DMA timeout、ECC 错误 等;必要时升级驱动/固件并更换故障硬件。

0