node_exporter
node_exporter 是 Prometheus 生态中核心的主机监控采集器,通过暴露 metrics 接口提供服务器 CPU、内存、磁盘、网络等基础监控指标。其参数主要用于启用 / 禁用指标采集、配置采集规则、安全加固、网络配置等场景
一、安装使用
-
下载安装
bash[root@localhost prometheus]# tar xf node_exporter-1.10.2.linux-amd64.tar.gz [root@localhost prometheus]# mkdir /data/node_exporter -p [root@localhost prometheus]# mv node_exporter-1.10.2.linux-amd64/* /data/node_exporter/ [root@localhost prometheus]# chmod 777 /data/node_exporter/ -R [root@localhost prometheus]# cd /data/node_exporter/ [root@localhost node_exproter]# ll 总用量 22400 -rw-r--r-- 1 1001 1002 11357 10月 26 04:10 LICENSE -rwxr-xr-x 1 1001 1002 22919216 10月 26 04:06 node_exporter -rw-r--r-- 1 1001 1002 463 10月 26 04:10 NOTICE -
配置启动项 <-- 启动参数往下看
bashcat > /usr/lib/systemd/system/node-exporter.service << EOF [Unit] Description=Node Exporter After=network.target [Service] ExecStart=/data/node_exporter/node_exporter \ --collector.systemd \ --collector.systemd.unit-include="(ssh|prometheus).service" \ --collector.filesystem.ignored-fs-types="^(tmpfs|sysfs|proc|overlayfs|cgroup)$" \ --collector.netdev.ignored-devices="^(lo|docker0|cni0|flannel.*)$" ExecReload=/bin/kill -HUP \$MAINPID TimeoutStopSec=20s Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target EOF -
启动并检查
bash[root@localhost data]# systemctl restart node-exporter [root@localhost data]# systemctl status node-exporter Active: active (running) since 五 2025-11-07 02:28:54 CST; 4s ago └─4684 /data/node_exporter/node_exporter --collector.systemd --collector.systemd.unit-include="(ssh|prometheus).service" [root@localhost data]# ss -tnlp LISTEN 0 32768 [::]:9100 [::]:* users:(("node_exporter",pid=4684,fd=3))
二、参数说明
2.1、基础配置参数
-
参数
参数名称 说明 适用场景 --web.listen-address指定监听地址和端口,默认 0.0.0.0:9100避免端口冲突、限制内网访问 --web.telemetry-path自定义 metrics 暴露路径,默认 /metrics配合反向代理隐藏真实路径 --log.level设置日志级别,可选 debug/info/warn/error,默认info调试问题(debug)、生产环境减少日志(warn) --web.max-requests限制最大并发请求数,默认无限制 防止大量请求压垮 exporter --web.allow-origin限制跨域访问的域名 配合前端监控面板跨域请求 --web.config.file指定 TLS/HTTPS 和 Basic Auth 配置文件路径 生产环境安全加固(HTTPS + 身份认证) -
示例
bash# 1. --web.listen-address:修改监听端口或限制访问IP --web.listen-address=":9101" # 仅修改端口为9101,避免默认9100端口冲突 --web.listen-address="192.168.1.100:9100" # 仅允许内网IP 192.168.1.100监听,增强安全性 # 2. --web.telemetry-path:自定义指标暴露路径 --web.telemetry-path="/node/metrics" # 隐藏默认的/metrics路径,配合反向代理隐藏真实接口 # 3. --log.level:调整日志输出级别 --log.level="debug" # 调试场景启用,输出详细采集日志,用于排查指标采集失败问题 --log.level="warn" # 生产环境使用,仅输出警告和错误日志,减少磁盘日志占用 # 4. --web.max-requests:限制最大并发请求数 --web.max-requests=10 # 限制同时处理最多10个请求,避免高并发场景下exporter过载 # 5. --web.allow-origin:限制跨域访问域名 --web.allow-origin="https://prometheus.example.com" # 仅允许Prometheus前端域名跨域请求指标,防止非法跨域访问 # 6. --web.config.file:加载安全配置文件 --web.config.file="/etc/node_exporter/web-config.yml" # 加载TLS证书和Basic Auth配置,生产环境必配以保障指标安全
2.2、指标采集控制参数
-
参数
参数名称 说明 适用场景 --collector.<NAME>.enabled=true/false启用 / 禁用指定采集器( <NAME>为采集器名)按需开启 / 关闭指标,减少资源占用 --no-collector.<NAME>快速禁用采集器(等价于 --collector.<NAME>.enabled=false)批量禁用无用采集器,简化配置 --collector.filesystem.ignored-mount-points正则匹配需要忽略的文件系统挂载点 过滤虚拟目录、临时目录等无效挂载点指标 --collector.filesystem.ignored-fs-types正则匹配需要忽略的文件系统类型 忽略 tmpfs、sysfs 等虚拟文件系统指标 --collector.netdev.ignored-devices正则匹配需要忽略的网络设备 过滤回环网卡、容器虚拟网卡等无效网络指标 --collector.textfile.directory指定自定义静态指标的文本文件目录 暴露业务自定义指标(如应用状态、版本) -
示例
bash# 1. --collector.<NAME>.enabled:精确控制采集器启用/禁用 --collector.diskstats.enabled=false # 禁用磁盘IO采集器(无需监控磁盘读写性能时使用) --collector.meminfo.enabled=true # 强制启用内存采集器(核心监控项,默认已启用) # 2. --no-collector.<NAME>:快速禁用采集器(批量操作更简洁) --no-collector.processes # 禁用进程指标采集(进程极多的容器主机建议禁用) --no-collector.netstat # 禁用TCP连接状态采集(无需监控连接数时使用) --no-collector.nfs # 禁用NFS相关指标(未使用NFS服务时禁用) # 3. --collector.filesystem.ignored-mount-points:忽略无效挂载点 --collector.filesystem.ignored-mount-points="^/(sys|proc|tmp|var/tmp)($|/)" # 忽略/sys、/proc等虚拟目录和临时目录 # 4. --collector.filesystem.ignored-fs-types:忽略虚拟文件系统 --collector.filesystem.ignored-fs-types="^(tmpfs|sysfs|proc|overlayfs|nfs)$" # 忽略tmpfs、overlayfs等非物理文件系统 # 5. --collector.netdev.ignored-devices:过滤无效网络设备 --collector.netdev.ignored-devices="^(lo|docker0|cni0|flannel.*)$" # 忽略回环网卡、容器虚拟网卡 # 6. --collector.textfile.directory:启用自定义指标采集 --collector.textfile.directory="/etc/node_exporter/textfile" # 读取该目录下.prom文件的自定义指标(如业务状态)
2.3、常用采集器启用
-
参数
参数(禁用示例) 对应采集器 指标含义 禁用场景 --no-collector.diskstatsdiskstats 磁盘 IO 统计(读写速率、IO 耗时) 无需监控磁盘 IO 性能的轻量服务器 --no-collector.processesprocesses 进程相关指标(进程数、状态分布) 容器集群主机、进程数极多的场景 --no-collector.netstatnetstat TCP 连接状态(ESTABLISHED/TIME_WAIT 等) 无需监控网络连接数的场景 --no-collector.nfsnfs NFS 服务相关指标(挂载状态、IO) 未部署 NFS 服务的服务器 --no-collector.sockstatsockstat Socket 连接统计(TCP/UDP 连接数) 无需监控 Socket 状态的场景 --no-collector.filesystemfilesystem 磁盘容量、挂载点状态等存储指标 无需监控磁盘存储使用情况的场景
2.4、安全加固
-
参数
参数名称 说明 适用场景 --web.config.file加载 TLS/HTTPS 配置和 Basic Auth 身份认证 生产环境、公网暴露、内网敏感环境 --web.listen-address(指定内网 IP)限制仅内网 IP 监听指标接口 仅允许内网 Prometheus 服务器访问 -
示例
bash# 1. --web.config.file:启用HTTPS+Basic Auth(生产核心安全配置) --web.config.file="/etc/node_exporter/web-config.yml" # 配置文件含TLS证书路径和认证信息 # 2. --web.listen-address:限制内网访问(配合安全配置双重加固) --web.listen-address="172.16.0.0/24:9100" # 仅允许172.16.0.0/24网段的内网IP访问 # web-config.yml # 需提前生成TLS证书和Basic Auth认证文件 tls_server_config: cert_file: /etc/node_exporter/certs/node_exporter.crt # TLS证书文件路径 key_file: /etc/node_exporter/certs/node_exporter.key # TLS私钥文件路径 basic_auth_users: prometheus: $2y$05$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # Basic Auth加密后的用户名密码(用htpasswd生成)
2.5、实用组合配置示例
-
场景1:轻量采集(容器主机/轻量服务器,减少资源占用)
bashnode_exporter \ --web.listen-address=":9100" \ # 默认端口,限制内网访问可改为192.168.1.0/24:9100 --log.level="warn" \ # 生产日志级别 --no-collector.diskstats \ # 禁用磁盘IO采集 --no-collector.processes \ # 禁用进程采集 --no-collector.netstat \ # 禁用TCP连接采集 --collector.filesystem.ignored-mount-points="^/(sys|proc|tmp)($|/)" \ # 过滤无效挂载点 --collector.netdev.ignored-devices="^(lo|docker0|cni0)$" # 过滤虚拟网卡 -
场景2:生产环境安全采集(HTTPS+自定义指标+核心监控)
bashnode_exporter \ --web.listen-address="192.168.1.100:9100" \ # 仅内网IP监听 --web.config.file="/etc/node_exporter/web-config.yml" \ # HTTPS+Basic Auth --log.level="warn" \ # 减少日志量 --collector.textfile.directory="/etc/node_exporter/textfile" \ # 启用自定义业务指标 --collector.filesystem.ignored-fs-types="^(tmpfs|sysfs|proc)$" \ # 忽略虚拟文件系统 --web.max-requests=20 # 限制最大并发请求数
三、常用核心指标
3.1、CPU 监控指标
-
参数
指标名称 指标含义 单位 `node_cpu_seconds_total{mode=~"user system idle node_load1/node_load5/node_load15系统 1 分钟、5 分钟、15 分钟平均负载(等待 CPU 调度的进程数) 无(进程数) node_cpu_coresCPU 物理核心数(部分版本需启用 --collector.cpu.info)个 -
示例
bash# 1. 整体CPU使用率(5分钟平均,排除空闲时间,按实例分组) 100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) * 100) # 说明:rate()计算5分钟内空闲CPU的速率,100减后得到使用率 # 2. IO等待占比(排查磁盘IO瓶颈,5分钟平均) avg(rate(node_cpu_seconds_total{mode="iowait"}[5m])) by (instance) * 100 # 说明:IO等待占比过高(如>10%),通常意味着磁盘IO存在瓶颈
3.2、内存监控指标
-
参数
指标名称 指标含义 单位 node_memory_MemTotal_bytes物理内存总大小 字节(B) node_memory_MemAvailable_bytes可用内存(系统估算可立即分配的内存,含空闲 + 可回收缓存) 字节(B) node_memory_Cached_bytes页缓存大小(文件系统缓存,可回收) 字节(B) node_memory_SwapTotal_bytes/node_memory_SwapFree_bytes交换分区总大小 / 空闲大小 字节(B) -
示例
bash# 1. 内存使用率(核心查询,按实例分组,结果更准确) 100 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 by (instance) # 说明:使用MemAvailable而非MemFree,因为包含可回收缓存,更贴近实际可用内存 # 2. 已使用内存大小(转换为GB,直观查看) (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / 1024 / 1024 / 1024 # 说明:总内存减可用内存得到已用内存,除以1024^3转换为GB单位 # 3. 缓存占比(判断缓存是否占用过多内存) node_memory_Cached_bytes / node_memory_MemTotal_bytes * 100 by (instance) # 说明:缓存占比过高(如>50%)但应用内存充足时,无需处理(缓存可回收) # 4. 可用内存低于1GB告警规则(按实例匹配) node_memory_MemAvailable_bytes{instance=~".*"} < 1024*1024*1024 # 说明:1024*1024*1024 即1GB,可根据服务器内存大小调整阈值
3.3、磁盘存储指标
-
参数
指标名称 指标含义 单位 `node_filesystem_size_bytes{mountpoint=~"/ /data /var"}` `node_filesystem_avail_bytes{mountpoint=~"/ /data /var"}` node_filesystem_free_bytes文件系统空闲容量(完全未使用的空间) 字节(B) node_filesystem_readonly{mountpoint="/"}文件系统是否为只读(1 = 只读,0 = 可读写) 布尔值(0/1) -
示例
bash# 1. 磁盘容量使用率(过滤虚拟文件系统,按实例+挂载点分组) 100 - (node_filesystem_avail_bytes{mountpoint='/',fstype!="tmpfs"} / node_filesystem_size_bytes) * 100 # 说明:过滤tmpfs等虚拟文件系统,避免无效数据;关注根目录(/)和数据目录(/data) # 2. 根目录可用空间低于10GB告警(转换为字节计算) node_filesystem_avail_bytes{mountpoint="/",fstype!~"tmpfs"} < 10*1024*1024*1024 # 说明:10*1024^3 即10GB,根据业务需求调整阈值(如数据库服务器可设更大) # 3. 根目录空闲空间(转换为GB,直观查看) node_filesystem_free_bytes{mountpoint="/",fstype!~"tmpfs"} / 1024 / 1024 / 1024 # 说明:free与avail的区别:free是完全未使用,avail是普通用户可使用(排除root预留)
3.4、网络监控指标
-
参数
指标名称 指标含义 单位 `node_network_transmit_bytes_total{device!~"lo docker0 cni0"}` `node_network_receive_bytes_total{device!~"lo docker0 cni0"}` node_network_transmit_errors_total/node_network_receive_errors_total网卡发送 / 接收错误数(累计,如丢包、校验错误) 个 node_netstat_Tcp_CurrEstab当前 ESTABLISHED 状态的 TCP 连接数 -
示例
bash# 1. 网卡发送速率(每秒,5分钟平均,指定物理网卡eth0) rate(node_network_transmit_bytes_total{device="eth0"}[5m]) # 说明:rate()计算累计字节数的每秒速率,单位为B/s;需替换为实际物理网卡名称(如ens33) # 2. 网卡接收速率(每秒,5分钟平均,转换为MB/s更直观) rate(node_network_receive_bytes_total{device="eth0"}[5m]) / 1024 / 1024 # 说明:除以1024^2转换为MB/s,适合监控带宽使用情况 # 3. 当前ESTABLISHED TCP连接数(监控连接数是否过高) node_netstat_Tcp_CurrEstab{instance="目标实例IP:9100"} # 说明:连接数过高(如>10000)可能导致端口耗尽,需结合业务调整阈值 # 5. 网卡总吞吐量(发送+接收,MB/s,5分钟平均) (rate(node_network_transmit_bytes_total{device="eth0"}[5m]) + rate(node_network_receive_bytes_total{device="eth0"}[5m])) / 1024 / 1024 # 说明:用于监控网卡带宽是否接近上限(如1G网卡上限约125MB/s)
3.5、磁盘 IO 指标
-
参数
指标名称 指标含义 单位 `node_disk_read_bytes_total{device!~"loop.* sr0"}` 磁盘读取字节数(累计,排除虚拟磁盘 / 光驱) `node_disk_written_bytes_total{device!~"loop.* sr0"}` 磁盘写入字节数(累计,排除虚拟磁盘 / 光驱) node_disk_io_time_seconds_total磁盘 IO 累计耗时 秒(s) node_disk_io_now当前正在进行的磁盘 IO 请求数(磁盘繁忙度) 个 -
示例
bash# 1. 磁盘读速率(每秒,5分钟平均,指定物理磁盘sda) rate(node_disk_read_bytes_total{device="sda"}[5m]) # 说明:适用于监控磁盘读取性能,数据库服务器需重点关注 # 2. 磁盘写速率(每秒,5分钟平均,转换为MB/s) rate(node_disk_written_bytes_total{device="sda"}[5m]) / 1024 / 1024 # 说明:写入速率过高(如SSD>500MB/s、HDD>100MB/s)可能达到磁盘性能上限 # 3. 磁盘IO使用率(5分钟平均,反映磁盘繁忙程度) avg(rate(node_disk_io_time_seconds_total{device="sda"}[5m])) by (instance) * 100 # 说明:IO使用率>80% 表示磁盘繁忙,可能导致应用响应缓慢 # 4. 磁盘当前IO请求数(实时繁忙度) node_disk_io_now{device="sda"} # 说明:普通SATA盘并发IO能力约10-20,SSD约1000+;超过磁盘能力会导致队列堆积 # 5. 5分钟内磁盘IO请求累计数(评估磁盘IO压力) increase(node_disk_io_time_seconds_total{device="sda"}[5m]) # 说明:请求数持续过高,需检查是否有大量随机读写操作
3.6、系统状态指标
-
参数
指标名称 指标含义 单位 node_procs_running当前运行状态(R 状态)的进程数 个 node_procs_blocked被阻塞(D 状态)的进程数(等待 IO 等资源) 个 -
示例
bash# 3. 运行状态(R状态)进程数异常增长(5分钟内增长超过10个) increase(node_procs_running{instance="目标实例IP:9100"}[5m]) > 10 # 说明:R状态进程数激增可能是应用异常(如死循环创建进程) # 4. 阻塞状态(D状态)进程数告警(超过5个需关注) node_procs_blocked{instance="目标实例IP:9100"} > 5 # 说明:D状态进程数过高通常是IO瓶颈导致(如磁盘读写阻塞)
四、预警
-
prometheus配置
bashrule_files: - "/data/prometheus/rules/node_alter.yml" # 检查语法 prometheus]# ./promtool check config prometheus.yml -
/data/prometheus/rules/node_alter.ymlbashgroups: # 节点、CPU、磁盘、内存 - name: 节点监控 rules: - alert: 节点下线 expr: up == 0 for: 5m labels: severity: info annotations: title: 节点下线 description: "节点 {{ $labels.instance }} node_export 服务已下线,请排查。" - alert: 节点CPU使用率过高 expr: (1 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])))) * 100 > 90 for: 5m labels: severity: warning annotations: title: 节点CPU使用率过高 description: "节点 {{ $labels.instance }} CPU 使用率已持续 {{ $value | humanizeDuration }} 超过 85%,当前值:{{ $value | humanizePercentage }},请排查高负载进程。" runbook_url: https://github.com/kubernetes-monitoring/kubernetes-mixin/tree/master/runbook.md#alert-name-nodecpuexceededthreshold - alert: 节点内存使用率过高 expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 90 for: 5m labels: severity: info annotations: title: "节点 {{ $labels.instance }} 内存使用率过高" description: "节点 {{ $labels.instance }} 内存使用率已持续 {{ $value | humanizeDuration }} 超过 85%,当前值:{{ $value | humanizePercentage }},请排查高负载进程。" - alert: 节点磁盘使用率过高 expr: (node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_free_bytes{mountpoint="/"}) / node_filesystem_size_bytes{mountpoint="/"} * 100 > 95 for: 5m labels: severity: warning annotations: title: "节点 {{ $labels.instance }} 磁盘使用率过高" description: "节点 {{ $labels.instance }} 磁盘使用率已持续 {{ $value | humanizeDuration }} 超过 90%,当前值:{{ $value | humanizePercentage }},请排查高负载进程。" - alert: 磁盘将耗尽 expr: predict_linear(node_filesystem_avail_bytes{mountpoint="/"}[6h], 3600) < 0 for: 5m labels: severity: warning annotations: title: "节点 {{ $labels.instance }} 磁盘将耗尽" description: "节点 {{ $labels.instance }} 磁盘将耗尽,请清理磁盘。"