Linux node_exporter 使用与优化

4次阅读

node_exporter启动失败主因是权限与配置不当:需创建专用用户、正确配置systemd服务文件;采集器默认禁用需手动启用;监听地址应设为0.0.0.0:9100并放行防火墙;高负载下应精简采集器避免超时。

Linux node_exporter 使用与优化

node_exporter 启动失败:找不到 systemd 或权限被拒

常见现象是执行 ./node_exporter 直接报错 failed to open /proc/sys/kernel/osrelease: permission denied,或用 systemctl start node_exporter 提示 Unit node_exporter.service not found。根本原因不是二进制坏了,而是没按 linux 服务惯例配置运行身份和文件权限。

  • 不要用 root 直接跑(除非明确需要所有采集器),创建专用用户:useradd --no-create-home --shell /bin/false node_exporter
  • node_exporter 默认只读 /proc/sys,但某些采集器(如 textfilenetstat)需要额外路径可读,用 --path.procfs--path.sysfs 显式指定时注意挂载点实际路径
  • 如果 systemd 报找不到 service 文件,别急着重装,先检查是否漏了这步:cp contrib/systemd/node_exporter.service /etc/systemd/system/,再改里面 User=ExecStart= 路径

指标采集不全:collector.systemdcollector.ntp 显示 disabled

启动日志里看到类似 INFO disabled collector: systemd,不代表功能坏掉了,只是默认关闭——因为这些采集器要么依赖特定环境(如必须用 systemd),要么开销大(如 ntp 需要网络请求),node_exporter 不会盲目启用。

  • 启用前先确认依赖存在:systemctl list-unit-files | head -3 看有没有输出,没输出说明压根没跑 systemd;ntpq -p 能连上 NTP 服务器才值得开 collector.ntp
  • 开启方式统一用命令行参数,不是配置文件:--collector.systemd --collector.ntp;注意顺序无关,但重复加不会报错
  • collector.textfile 是例外:它永远启用,但只在 --collector.textfile.Directory 指定目录下扫描 .prom 文件,目录不存在或无读权限就静默跳过,不会报错

暴露端口被拒绝或 metrics 返回空:防火墙与 --web.listen-address 冲突

浏览器访问 http://localhost:9100/metrics 正常,但从其他机器 curl 却超时或连接被拒,大概率是监听地址绑死了 127.0.0.1,或者系统防火墙拦了 9100 端口。

  • 默认 --web.listen-address=":9100" 其实等价于 [::]:9100(IPv6 any),但很多老内核或 docker 容器里 IPv6 被禁用,结果监听失败却没报错,降级成只听 127.0.0.1:9100 —— 解决办法是显式写成 --web.listen-address="0.0.0.0:9100"
  • centos/RHEL 8+ 默认用 firewalld,得加规则:firewall-cmd --permanent --add-port=9100/tcp && firewall-cmd --reload
  • 如果跑在容器里,别只信 -p 9100:9100,还要确认容器内 netstat -tlnp | grep :9100 确实监听在 0.0.0.0 上,否则宿主机映射无效

高负载下 scrape 超时:CPU 和磁盘 I/O 采集拖慢整体响应

prometheuscontext deadline exceedednode_exporter 自身 CPU 占用飙高,特别是启用了 collector.diskstatscollector.Filesystem 时。这不是 bug,是设计使然:这些采集器要遍历整个 /sys/block//proc/mounts,设备越多越慢。

  • 优先关掉非必要采集器:--no-collector.diskstats --no-collector.filesystem,用 filesystem 就够查根分区,真要细粒度用 mount 命令临时查
  • collector.netdev 在网卡特别多的机器上也会卡,可限定只采关键接口--collector.netdev.device-blacklist="^(docker|veth|br-).*$"
  • 如果必须全量采集,把 --web.telemetry-path="/metrics" 改成带参数的路径(如 /metrics?collect[]=cpu&collect[]=meminfo),让 Prometheus 按需拉取,但要注意:这要求客户端支持 query 参数,且不能和 scrape_timeout 冲突

node_exporter 的麻烦不在安装,而在“哪些采集器该开、在哪开、开完会不会拖垮自己”——尤其当机器上有上百块磁盘或几十个 cgroup v2 子系统时,一个 --collector.systemd 就可能让单次 scrape 从 100ms 涨到 3s。

text=ZqhQzanResources