up指标频繁假0值本质是本机网卡丢包导致prometheus抓取超时,表现为局部up=0但远端服务正常;需通过本地ping、ethtool、netstat及scrape_duration分析确认ring buffer溢出、中断不均或驱动异常,并结合scrape_timeout调优与内核参数加固治理。

Up指标频繁出现假0值,本质是Prometheus抓取目标时网络层未收到响应,但根源未必在远端——若本机网卡丢包,会导致所有或部分target的up{...} == 0误报,形成“全链路健康、局部指标失真”的干扰现象。这类问题隐蔽性强,容易被误判为下游服务异常或配置错误。
确认是否为本机网卡丢包而非远程故障
先排除远端干扰,聚焦Prometheus所在节点自身网络状态:
- 执行
ping -c 100 localhost和ping -c 100 127.0.0.1,观察是否有本地环回丢包——有则说明内核协议栈或网卡驱动异常 - 用
ethtool eth0(替换为实际网卡名)检查Link detected、Speed、Duplex是否正常,重点关注rx_errors、tx_errors、rx_fifo_errors、tx_fifo_errors是否持续增长 - 运行
netstat -s | grep -A 5 -B 5 "packet receive errors",查看UDP/TCP接收错误统计,特别是receive errors和fifo overruns - 对比
up{job="node_exporter"}与up{job="prometheus"}是否同步归零——若后者也波动,基本锁定本机网络环节
排查Ring Buffer溢出与中断瓶颈
Linux网卡Ring Buffer过小或CPU中断处理不及时,会导致数据包在驱动层被静默丢弃,Prometheus收不到HTTP响应,表现为超时或up=0:
- 用
ethtool -g eth0查看当前Rx/Tx Ring Buffer大小;生产环境建议调至最大(如ethtool -G eth0 rx 4096 tx 4096) - 检查软中断分布:
cat /proc/softirqs | grep -i "NET_RX",观察各CPU核心的NET_RX计数是否严重不均;若某核远高于其他,说明RSS(接收侧缩放)未生效或绑定异常 - 确认网卡是否启用多队列:
ls /sys/class/net/eth0/device/msi_irqs/,若有多个IRQ编号,再用cat /proc/interrupts | grep eth0验证中断是否分散到不同CPU
验证抓取行为与网络延迟的耦合关系
Prometheus的up指标依赖HTTP请求完成,而网卡丢包常在高负载下加剧,需做压力关联分析:
- 查询
histogram_quantile(0.99, rate(scrape_duration_seconds_bucket[5m])) by (job),看高百分位耗时是否随网卡rx_dropped上升而跳变 - 在
/targets页面筛选状态为DOWN的目标,记录其instance地址,然后在Prometheus主机上对该地址执行curl -o /dev/null -s -w "%{http_code}\n" http://<instance>:9100/metrics --max-time 5</instance>,重复20次,统计失败率;若失败率显著高于up指标归零频率,说明是传输层丢包而非应用层拒绝 - 启用
scrape_timeout略高于网络RTT(如设为8s),并开启sample_limit防单次采集过大压垮网卡缓冲区
临时规避与长期加固
定位后需兼顾快速恢复与根因治理:
- 短期:调整
scrape_interval错峰(如从15s改为17s),降低定时抓取的并发冲击;关闭非关键job的honor_labels减少label匹配开销 - 长期:升级网卡驱动与固件;将Prometheus部署在专用网卡(如绑定bond0)并禁用无关服务;在宿主机启用
net.core.netdev_max_backlog和net.core.rmem_default调优 - 补充监控:在Prometheus自监控中加入
node_network_receive_errs_total和node_network_transmit_drop_total告警,实现丢包主动发现










