node-exporter metrics访问超慢

1) 先做精细分解(DNS/握手/首字节/下载)

URL=http://172.16.130.38:9200/metrics

# 不打印到终端,避免终端输出本身拖慢;输出详细时间
curl -s -o /dev/null -w \
'namelookup: %{time_namelookup}s\nconnect: %{time_connect}s\nappconnect: %{time_appconnect}s\npretransfer: %{time_pretransfer}s\nTTFB: %{time_starttransfer}s\nTOTAL: %{time_total}s\nsize: %{size_download} bytes\nspeed: %{speed_download} B/s\n' \
"$URL"
  • TTFB 大(比如 20s,TOTAL≈TTFB):服务端生成/读盘/GC/阻塞。
  • TTFB 小但 TOTAL 大:下载阶段慢(payload 太大/网络吞吐或丢包问题)。
  • connect 慢:握手或三次握手重传/防火墙检查/队列满。

再看体量:

# 看响应大小和行数
curl -s "$URL" | wc -c
curl -s "$URL" | wc -l

如果 payload 很大,试试压缩:

curl -H 'Accept-Encoding: gzip' -s -o /dev/null -w 'TOTAL:%{time_total}s size:%{size_download}\n' "$URL"

压缩后明显变快,就是数据量过大/网络带宽瓶颈。

2) 对比同端口的“轻请求”

# 用首页或一个很小的端点对比(确认端口/框架没问题)
time curl -s -o /dev/null http://172.16.130.38:9200/
  • 如果 / 很快、只有 /metrics 慢 → 生成/采集指标本身耗时。

3) 网络快速体检(两端都能做就更好)

客户端侧:

# 看是否有重传
sar -n TCP,ETCP 1 5 | egrep 'retran|active|passive'
ss -ti dst 172.16.130.38
# MTU/路径探测(若你网络里有隧道/VXLAN/IPv6)
tracepath -n 172.16.130.38 | head
ping -c 5 172.16.130.38

网卡/驱动统计:

# 按实际接口替换
ethtool -S eth0 | egrep 'rx_(drop|err)|tx_(drop|err)'

若看到明显 重传/丢包/队列丢弃,是网络层问题(MTU 不一致、队列/拥塞、拥塞窗口很小等)。

4) 服务端定位(9200 进程在干嘛)

# 谁在监听 9200?拿到 PID
ss -lntp | grep ':9200'
ps -p <PID> -o pid,comm,pcpu,pmem,etime,args

# 刮一下当次请求期间的系统调用卡在哪(只在一次请求窗口内跑)
strace -ttT -p <PID> -e trace=read,write,stat,futex,openat,accept,poll,select 2>&1 | ts

常见根因与对应验证/缓解:

  • 导出器/服务生成 metrics 很重

    • 有些采集器会遍历很多对象(例如遍历大量文件、网卡、卷、进程),或做昂贵系统调用。
    • 验证:看 TTFB 是否大;在应用里临时关闭/精简部分采集器试试;或把昂贵指标做缓存(例如 5–15s 刷新一次),用 promhttp.HandlerForTimeout/自定义 gatherers(Go 应用)。
  • 进程被 cgroup 限速/CPU Throttling(容器里很常见)

    • 验证:cat /sys/fs/cgroup/cpu.stat(或容器内路径),看 nr_throttled/throttled_time 是否飙升。
    • 解决:适度放宽 CPU 配额/去掉 cpu.cfs_quota_us,或提升请求超时。
  • GC/磁盘阻塞(Go/Java 服务常见)

    • 验证:抓一次请求时的 top -H -p <PID>iostat -x 1 5、服务 GC 日志/go_gc_duration_seconds
    • 解决:减小每次收集的工作量;避免在 /metrics 里即时做 I/O;升级依赖或修复慢 collector。
  • 连接积压/线程池满

    • 验证:服务端 ss -lntbacklog,应用线程池/协程数与队列是否打满。
    • 解决:增大 backlog/线程池、接入层限流。
  • payload 过大(几十万条样本)

    • 验证:上面的 wc -c / wc -l
    • 解决:剔除高基数字段(例如把 pod_uidmountpoint 等高基数字段聚合/减少 label),打开 gzip。

一键小脚本(先在客户端跑)

把 URL 改成你的:

URL=http://172.16.130.38:9200/metrics
echo "=== plain ==="
curl -s -o /dev/null -w 'connect:%{time_connect}s TTFB:%{time_starttransfer}s TOTAL:%{time_total}s size:%{size_download} speed:%{speed_download}B/s\n' "$URL"
echo "=== gzip ==="
curl -H 'Accept-Encoding: gzip' -s -o /dev/null -w 'connect:%{time_connect}s TTFB:%{time_starttransfer}s TOTAL:%{time_total}s size:%{size_download} speed:%{speed_download}B/s\n' "$URL"
echo "=== count ==="
echo -n "bytes: "; curl -s "$URL" | wc -c
echo -n "lines: "; curl -s "$URL" | wc -l

怎么解读

  • TTFB≈20s → 服务端生成慢:聚焦应用/导出器/资源限速/GC。
  • TTFB 很小、TOTAL 很大 → 下载阶段慢:payload 大或网络丢包;开 gzip、减指标/label。
  • connect 慢 → 网络或连接栈;看丢包/重传/MTU/ACL。

跑完这几条的结果贴给我,我直接帮你判因并给出针对性的调整参数(要不要关掉/替换某些 collector、是否需要给容器松绑 CPU、是否启用 gzip/裁剪指标等)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值