服务器算力资源监听
-
目标:用 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)前端页面
实现效果如下
监听器部署
仅需部署在中心机器上
步骤一:下载安装文件
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
安装文件
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,可以查询到大量数据
扩展知识: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
导入已有的仪表盘
官方提供的表盘清单如下, 可自行尝试:
- CPU算力仪表盘:grafana.com/grafana/das…
- GPU仪表盘链接: grafana.com/grafana/das…
- processor仪表盘链接: grafana.net/dashboards/…
- 其他仪表盘可参考:grafana.com/grafana/das…