实现算力资源监听Prometheus+node_exporter+dcgm-exporter

95 阅读5分钟

服务器算力资源监听

  • 目标:用 Prometheus + node_exporter(等算力资源) + dcgm-exporter(GPU算力资源) + grafana(可视化平台) 监听程序

  • 架构组件:

    • node_exporter:(部署在每台被监控主机)暴露主机指标,默认端口9100。

    • DCGM: (部署在每台被监控主机)需要sudo权限, 还没尝试

    • Prometheus:(部署在监控主机上)集中拉取指标数据,默认端口9090。

    • Grafana(部署在监控主机上):可视化展示,默认端口3000。

  • 端口需要开放(仅对监控机):

    • 被监控机:9100/tcp(node_exporter)数据收集器;DCGM;9256/tcp (processor_exporter)
    • 监控机:9090/tcp(Prometheus)后端程序,3000/tcp(Grafana)前端页面

实现效果如下 11c2bceec2b86bcefcb387f1b6fa5a19.png

监听器部署

仅需部署在中心机器上

步骤一:下载安装文件

 wget https://github.com/prometheus/prometheus/releases/download/v3.5.0/prometheus-3.5.0.linux-amd64.tar.gz
 tar xvfz prometheus-3.5.0.linux-amd64.tar.gz
 cd prometheus-3.5.0.linux-amd64.tar.gz

步骤二:配置文件

 # 编辑配置文件
 vim ./prometheus.yml
 global:
   scrape_interval:     15s # By default, scrape targets every 15 seconds.
   evaluation_interval: 15s
   
   # Attach these labels to any time series or alerts when communicating with
   # external systems (federation, remote storage, Alertmanager).
   external_labels:
     monitor: 'codelab-monitor'
 
 # A scrape configuration containing exactly one endpoint to scrape:
 # Here it's Prometheus itself.
 scrape_configs:
   # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
   - job_name: 'linux-nodes' # 这个job名可以用来后续查询命令的标识符
 
     # Override the global default and scrape targets from this job every 5 seconds.
     scrape_interval: 5s
 
     static_configs:
       - targets: ['localhost:9090', 'localhost:9100'] # 目标被监听器的ip配置节点, 9100值的node_exporter

详细的配置文档,可参考官方网站: prometheus.io/docs/promet…

动态更新配置命令: curl -X POST http://localhost:9090/-/reload

weburl:http://localhost:9090/targets 可以查看所有的主机信息

步骤三 : 配置服务(便于自动启动)

创建 systemd 服务单元 /etc/systemd/system/prometheus.service

 [Unit]
 Description=Prometheus Server
 After=network-online.target
 Wants=network-online.target
 ​
 [Service]
 User=prometheus
 Group=prometheus
 Type=simple
 ExecStart=/usr/local/bin/prometheus \
     --config.file=/etc/prometheus/prometheus.yml \
     --storage.tsdb.path=/var/lib/prometheus \
     --storage.tsdb.retention.time=15d \
     --web.enable-lifecycle \
     --web.listen-address=:9090
 Restart=on-failure
 LimitNOFILE=65536
 ​
 [Install]
 WantedBy=multi-user.target
  • 生效并启动: systemctl daemon-reload systemctl enable --now prometheus

步骤四:开放端口

开放端口允许局域网访问

 - firewalld:
   firewall-cmd --permanent --add-service=http
   或更精细:仅允许你的管理网段访问 9090 端口
 - ufw:
   ufw allow 9090/tcp

web访问: http://localhost:9090/graph

  • CPU 使用率(按主机,5m 平滑)

    100 - avg by (instance) (rate(node_cpu_seconds_total{job="prometheus", mode="idle"}[5m])) * 100

    可选:把 iowait 也视为“空闲”

    100 - avg by (instance) (rate(node_cpu_seconds_total{job="prometheus", mode=~"idle|iowait"}[5m])) * 100

  • 内存使用率(按主机,MemAvailable 口径,推荐)

    100 * (1 - node_memory_MemAvailable_bytes{job="prometheus"} / node_memory_MemTotal_bytes{job="prometheus"})

小提示

  • 只看某台机器可再加 {instance="localhost:9100"} 过滤。
  • 如果看到重复的“/”分区,可再加 fstype!="rootfs" 或 device!~"^rootfs$"(上面已排除 rootfs)。

步骤五:数据存储

说明文档:prometheus.io/docs/promet…

不同字段设置可以实现数据滚动保存, 建议数据集保存6个月以上

被监听器部署

需要部署在每一台机器上,可以写一个shell脚本,直接在每一台机器上运行快捷部署?

文档说明:prometheus.io/docs/guides…

1. 安装Node Exporter

安装文件

github.com/prometheus/…

 wget https://github.com/prometheus/node_exporter/releases/download/v1.9.1/node_exporter-1.9.1.linux-amd64.tar.gz
 tar xvfz node_exporter-1.9.1.linux-amd64.tar.gz
 cd node_exporter-1.9.1.linux-amd64
 ./node_exporter --version
配置服务

新建文件 /etc/systemd/system/node_exporter.service 内容如下

 [Unit]
   Description=Prometheus Node Exporter
   After=network-online.target
   Wants=network-online.target
 ​
 [Service]
 User=node_exporter
 Group=node_exporter
 Type=simple
 ExecStart={node exporter的服务脚本} \
 --web.listen-address=:9100 \
 --collector.textfile.directory='/var/lib/node_exporter/textfile/ '
 ​
 Restart=on-failure
 ​
 [Install]
 WantedBy=multi-user.target

注:/var/lib/node_exporter/textfile/ 是一个动态脚本的保存路径,可以自定义

检查服务是否启动

访问localhost:9100/metrics,可以查询到大量数据

image-20250930162334892.png


扩展知识:node-exporter 启动参数

./node_exporter --help 可以查看 node-exporter 的启动参数,主要参数:

  • collector 前缀的指标:控制是否启用某个采集器,node-exporter 内置了多个采集器,比如 cpu、meminfo、ntp 等都是不同的采集器;collector 前缀的还有一些参数是控制各个采集器具体行为的,比如 --collector.ntp.server 控制 ntp 采集器的 ntp 服务器地址
  • web 前缀的指标:控制 node-exporter 的 http 服务,比如 --web.listen-address 控制监听地址,--web.telemetry-path 控制暴露指标数据的 API 路径
  • log 前缀的指标:控制日志打印,比如 --log.level 控制日志级别
  • textfile生成文件: --collector.textfile.directory=/var/lib/node_exporter/textfile_collector

这个文件夹下可以暴露自定义指标, 只需定期在该目录写入 *.prom 文本文件,每行一个 Prometheus 指标。

例如1:按用户汇总 CPU/内存/IO(从 /proc)

 思路:
  - 遍历 /proc/[pid],读取 status/stat/io,按 UID 累加:
  - CPU:/proc/pid/stat 的 utime+stime,换算成秒(除以 getconf CLK_TCK)
  - 内存:/proc/pid/status 的 VmRSS(或 /proc/pid/statm)
  - IO:/proc/pid/io 的 read_bytes / write_bytes
 ​
 输出为累计型计数器/当前值:
  - node_user_cpu_seconds_total{uid="1000",user="alice"} 12345
  - node_user_memory_rss_bytes{uid="1000",user="alice"} 987654321
  - node_user_io_read_bytes_total{uid="1000",user="alice"} 123456789
  - node_user_io_write_bytes_total{uid="1000",user="alice"} 234567890
  
 用 systemd timer 或 cron 每 15-60 秒跑一次脚本即可。

例如2: 按用户的磁盘空间占用

如果启用了用户配额(quota),优先用 repquota -au 或相关工具导出用量,转成指标最稳。
没有配额时,可周期性地对用户家目录或特定路径做 du -sb 并按所有者汇总:
	-node_user_disk_usage_bytes{user="alice",path="/home/alice"} 123456789
注意:
	- du 遍历可能较慢,建议降低频率(例如 5-15 分钟一次),或只统计关键目录。
	- 若数据散落在多处挂载点,需分别统计。

例如3: 生成一个uid和username映射表的shell脚本

#!/usr/bin/env bash
set -euo pipefail

OUTDIR="..."
OUTFILE="$OUTDIR/unix_user_info.prom"
TMPFILE="$OUTFILE.$$"

# 读取“登录用户最小 UID”
UID_MIN=$(awk '/^UID_MIN/{print $2}' /etc/login.defs 2>/dev/null || echo 1000)

{
  echo '# HELP unix_user_info Canonical uid->username mapping (one series per uid)'
  echo '# TYPE unix_user_info gauge'

  getent passwd | awk -F: -v uid_min="$UID_MIN" '
    function esc(s){ gsub(/\/,"\\",s); gsub(/"/,"\"",s); gsub(/\r|\n/,"",s); return s }
    {
      user=$1; uid=$3;
      if (uid < uid_min) next;  # 只处理 UID >= 1000 的账号
      if (user == "nobody") next;  # 过滤 nobody 用户

      # 选取每个 UID 的“规范用户名”(按字典序最小,保证稳定且避免多对多 join)
      if ( (uid in best) ) {
        if (user < best[uid]) best[uid]=user
      } else {
        best[uid]=user
      }
    }
    END{
      # 输出去重后的 UID->username 映射
      for (u in best) {
        printf "unix_user_info{user="%s",uid="%s"} 1\n", esc(best[u]), u
      }
    }'
} > "$TMPFILE"

2. process-exporter

项目仓库地址:github.com/ncabatoff/p…

目的:实现不同用户下不同资源收集(也可以依靠 node-exporter 实现相关)

下载安装文件
wget https://github.com/ncabatoff/process-exporter/releases/tag/v0.8.7

注:建议自行登录开源仓库地址下载最新的版本后安装

编辑配置文件

注:新建一个 xxx.yaml, 路径可以自定义, 例如: /etc/process-exporter/config.yml 该地址应该作为参数配置到服务启动进程当中

process_names:
  # 把所有进程按用户名聚合到名为该用户名的分组
  - name: "{{.Username}}"
    cmdline:
      - .*
服务启动
- 参考node-exporter配置启动条目(示例 systemd):
- 后面这个config.path则是你的配置条目
  ExecStart=/usr/local/bin/process-exporter -web.listen-address=:9256 -config.path=/etc/process-exporter/config.yml
监听器配置
-Prometheus 里增加对应的抓取任务:
      - targets:["localhost:9256"] - 添加对应端口号
扩展知识: 常用的PromQL

下述SQL命令是提取监听器Prometheus数据库的命令, 可以用于前端看板的扩展配置

  • namedprocess_namegroup_cpu_seconds_total{groupname=...} 计数器(CPU 总秒数)
  • namedprocess_namegroup_memory_bytes{groupname=...} 常量(RSS 内存字节)
  • namedprocess_namegroup_num_procs{groupname=...} 该用户的进程数
  • 某用户在一个实例上的 CPU 使用(以“核数”为单位),5 分钟速率: sum by (instance) (rate(namedprocess_namegroup_cpu_seconds_total{groupname="alice"}[5m]))
  • 换算为 CPU 使用率(百分比,分母=该实例可用 CPU 逻辑核数): 100 * sum by (instance) (rate(namedprocess_namegroup_cpu_seconds_total{groupname="alice"}[5m])) / count by (instance) (node_cpu_seconds_total{mode="idle"})
  • 某用户内存占用(RSS,字节): sum by (instance) (namedprocess_namegroup_memory_bytes{groupname="alice"})
  • 同时看所有用户: sum by (groupname, instance) (rate(namedprocess_namegroup_cpu_seconds_total[5m])) sum by (groupname, instance) (namedprocess_namegroup_memory_bytes)

提示:

  • 该法会把共享库 RSS 也按进程计入,等价于“该用户进程的 RSS 总和”,与 cgroup 的 memory.current 定义有所差别。
  • 如仅关心特定用户,可把 config.yml 的 name 固定为用户,并用 cmdline 过滤更精确的进程集合。

3. GPU算力监听:GPU监听器DCGM部署

参考文档:blog.csdn.net/MrKinglovey…

DCGM文档:docs.nvidia.com/datacenter/…

DCGMgit仓库:github.com/NVIDIA/dcgm…

DCGM安装文档:docs.nvidia.com/datacenter/…

注:我没有sudu权限,没有尝试

四、前端页面可视化部署

注: 仅需部署到监听机器当中, 仅部署1次即可 安装地址:grafana.com/grafana/dow…

设置中文

grafana安装目录/conf/defaults.ini 配置项, 将default_language = en-US改为 zh-Hans即可,存在部分翻译不完全

VIM的快速编辑命令如下:
VIM向下查找命令:/default_language 回车,n 下一个,N 上一个

服务启动后, 访问可以本地的web网站:http://localhost:3000

image-20250930170328624.png

导入已有的仪表盘

image-20250930170947631.png

官方提供的表盘清单如下, 可自行尝试: