Node Exporter因/proc挂载点卡住(如stuck mount)导致/metrics接口超时,触发Prometheus context deadline exceeded错误;默认5秒超时机制可能被绕过,需通过strace、/proc/mounts检查及禁用filesystem收集器或过滤路径临时恢复,并升级至v1.7.0+加强熔断防护。

这个问题本质是Node Exporter在采集/proc相关指标时,因内核挂载点或文件系统状态异常,触发长时间阻塞(如“stuck mount”),导致HTTP /metrics 接口响应超时,最终被Prometheus判定为DOWN并报context deadline exceeded错误。
确认是否为/proc挂载点卡住
Node Exporter默认启用filesystem收集器,会遍历所有挂载点(包括/proc、/sys等伪文件系统)。当某个挂载点(尤其是/proc下子路径,如/proc/[pid]/fd)因进程僵死、NFS hang或内核bug无法完成statfs或readdir调用时,就会触发默认5秒的挂载超时机制,并标记为stuck。但若该挂载点恰好在/proc根下且未被及时跳过,可能造成整个/metrics请求阻塞更久。
验证方法:
- 登录运行Node Exporter的宿主机,执行:
strace -p $(pgrep node_exporter) -e trace=statfs,readdir,openat 2>&1 | head -20
观察是否有长时间无输出或反复失败的系统调用 - 检查
/proc/mounts中是否存在异常挂载项(如type nfs4但state=unmounted,或type proc后跟大量[pid]条目) - 运行
find /proc -maxdepth 2 -name "fd" -type d -exec ls -l {} \; 2>/dev/null | head -10,看是否卡在某进程的/proc/PID/fd目录
临时绕过问题挂载点
无需重启服务即可快速恢复采集,通过禁用或过滤特定收集器/挂载路径:
根据 package.json 中的 engines 字段自动检测 Node.js 版本需求,未安装 nvm 时自动安装并切换至对应版本。支持 Windows、macOS、Linux。适用于 Node.js 项目开发、版本切换和环境配置。
- 启动时添加参数屏蔽
filesystem收集器(最直接):./node_exporter --no-collector.filesystem - 保留filesystem但排除
/proc及其子树:./node_exporter --collector.filesystem.ignored-mount-points="^/(sys|proc|dev|run|var/lib/docker).*" - 若使用systemd,修改
Environment=OPTIONS=行后重载并重启:systemctl daemon-reload && systemctl restart node_exporter
定位具体卡住的进程或挂载
真正根治需找出源头进程:
- 查占用
/proc的长生命周期进程:ps aux --sort=-etime | head -10(按启动时间倒序,重点关注运行数天以上的进程) - 检查是否有僵尸进程残留句柄:
ls -l /proc/[0-9]*/fd/ 2>/dev/null | grep "(deleted)" | head -5 - 对疑似进程做详细追踪:
lsof -p PID或cat /proc/PID/status | grep -E "(State|Tgid|PPid)" - 若涉及NFS或远程挂载,检查
showmount -e server_ip及rpcinfo -p server_ip是否响应正常
长期防护与配置加固
避免同类问题反复发生:
- 升级Node Exporter至v1.7.0+,其
filesystem收集器已增强对stuck mount的自动熔断和日志标记能力 - 在Prometheus配置中为Node Exporter job设置合理超时:
scrape_timeout: 10s(默认是5s,略放宽可减少误判) - 添加告警规则,监控
node_exporter_collector_success{collector="filesystem"} == 0,早于整体up == 0发现采集异常 - 定期巡检
/proc/mounts与df -hT输出差异,识别“存在但不可读”的挂载点










