必须采集/proc/net/softnet_stat和/proc/net/snmp等内核指标,通过node_exporter textfile collector转为Prometheus格式,再与Nginx活跃连接趋势协同分析,才能准确定位SYN洪泛、软中断丢包、backlog溢出等根因。

要让 Prometheus 采集 Nginx 关联的系统内核异常中断与丢包数据,不能只盯 Nginx 自身指标——因为连接堆积、SYN 洪泛、软中断丢包等关键问题,发生在内核网络栈层面,Nginx 的 vts 或 stub_status 完全感知不到。必须把 /proc/net/softnet_stat 和 /proc/net/snmp 这类内核指标纳入采集链路,并与 Nginx 活跃连接趋势做协同分析。
需要采集的核心内核指标
这些路径输出的是纯文本,需通过 node_exporter 的 textfile collector 或自定义 exporter 转为 Prometheus 格式:
- /proc/net/softnet_stat 第1列(drop):软中断处理队列溢出导致的丢包数,持续增长说明 CPU 处理不过来或网卡中断绑定不均
- /proc/net/snmp 中 TcpExt 行的 SyncookiesSent:内核启用 SYN Cookie 防护的次数,突增是 SYN 洪泛攻击或连接队列满的强信号
- /proc/net/snmp 中 Tcp 行的 PassiveOpens / AttemptFails:被动打开(accept)成功率,骤降可能因 backlog 溢出或进程阻塞
- /proc/sys/net/core/somaxconn 与 net.core.netdev_max_backlog:配置上限值,用于比对实际连接压力是否逼近瓶颈
如何让 Prometheus 看到这些数据
推荐用 node_exporter + textfile collector 方式,轻量、无侵入、不依赖额外服务:
- 写一个每 5 秒执行的 shell 脚本,读取上述 proc 文件,提取数值并写入
/var/lib/node_exporter/textfile_collector/nginx_kernel.prom - 脚本示例片段:
echo "kernel_softnet_drop_count $(awk '{print $1}' /proc/net/softnet_stat)" > /var/lib/node_exporter/textfile_collector/nginx_kernel.prom
echo "kernel_syncookies_sent $(grep -oP 'SyncookiesSent:\s*\K\d+' /proc/net/snmp 2>/dev/null || echo 0)" >> /var/lib/node_exporter/textfile_collector/nginx_kernel.prom - 确保 node_exporter 启动时带参数
--collector.textfile.directory=/var/lib/node_exporter/textfile_collector - Prometheus 抓取 node_exporter 默认端口(如
:9100/metrics)即可拿到这些指标
和 Nginx 指标联动分析的关键逻辑
单独看内核指标意义有限,必须结合 Nginx 实际连接状态才能定位根因:
- 当
nginx_vts_connections_active + nginx_vts_connections_waiting缓慢上升,但kernel_softnet_drop_count突增 → 怀疑网卡中断集中在单个 CPU,worker 进程抢不到调度资源 - 当
kernel_syncookies_sent每分钟增长 > 100 且nginx_vts_connections_waiting同步飙升 → 很可能是 SYN 洪泛或listen backlog设置过小 - 若
kernel_softnet_drop_count稳定非零,但nginx_up == 0(Prometheus 抓不到 Nginx metrics)→ 检查是否因软中断占满 CPU 导致 Nginx worker 完全无法响应
告警规则建议(Prometheus Rule)
避免孤立阈值,用组合条件降低误报:
-
rate(kernel_softnet_drop_count[1m]) > 5 and rate(nginx_vts_connections_active[1m]) > 10→ 软中断丢包加速,同时活跃连接明显增长,需人工介入 -
rate(kernel_syncookies_sent[1m]) > 10 and nginx_vts_connections_waiting > 200→ SYN Cookie 已触发且等待连接积压,立即检查防火墙或限流策略 -
nginx_vts_connections_waiting > 300 and (nginx_vts_connections_active + nginx_vts_connections_waiting) / ON(instance) group_left() node_filesystem_avail_bytes{mountpoint="/"} * 100 < 10→ 等待连接多,且磁盘空间不足,可能影响日志写入或临时文件分配


















