如何使用Prometheus采集服务器登录用户的CPU、内存等使用指标?
实现用户级CPU、内存资源监控的可选方案
方案1:使用process-exporter(最推荐)
process-exporter是官方维护的进程级指标采集工具,支持直接按用户名聚合进程资源数据,无需额外开发即可满足需求:
- 首先在配置文件中指定按用户维度分组进程,参考配置片段:
process_names: - name: "{{.Username}}" cmdline: - ".+"
- 启动exporter后会自动生成
namedprocess_name_cpu_seconds_total(CPU累计使用时长)、namedprocess_name_rss_bytes(物理内存使用量)等指标,指标自带name标签对应用户名,直接通过PromQL按标签聚合即可得到每个用户的总资源占用 - 支持自定义过滤规则,可按需排除系统进程、只统计业务/作业进程,降低采集开销
- 注意:若服务器进程量级过万,可适当调大采集间隔,避免额外性能消耗
方案2:扩展node_exporter采集能力
如果已经部署了node_exporter,可通过自带的textfile collector实现自定义用户级指标采集:
- 启动node_exporter时添加参数
--collector.textfile.directory=/path/to/metric/dir,指定指标文件的存放目录 - 编写shell脚本定时统计每个用户的资源使用总和,输出为Prometheus格式的指标并存入上述目录,参考脚本核心逻辑:
# 统计每个用户的物理内存总使用量(单位:字节) ps hax -o rss,user | awk '{rss[$2]+=$1*1024} END {for(u in rss) print "user_memory_usage_bytes{user=\""u"\"}", rss[u]}' > /path/to/metric/dir/user_metrics.prom # 统计每个用户的CPU累计使用时长(单位:秒) ps hax -o cputime,user | awk 'BEGIN{OFMT="%.2f"} {cpu[$2]+=substr($1,1,2)*3600 + substr($1,4,2)*60 + substr($1,7,2)} END {for(u in cpu) print "user_cpu_seconds_total{user=\""u"\"}", cpu[u]}' >> /path/to/metric/dir/user_metrics.prom
- 将脚本加入crontab定时执行(推荐间隔1-5分钟),指标会自动被node_exporter采集上报
方案3:作业集群专属方案
如果你的计算服务器是Slurm、PBS等调度器管理的作业集群,可直接使用调度器对应的exporter:
- Slurm集群可使用slurm_exporter,直接采集每个作业关联的用户、CPU、内存使用数据,额外支持作业ID、队列、运行时间等标签的关联统计
- PBS集群可使用pbs_exporter,同样支持用户维度的作业资源聚合查询
常用查询PromQL示例
- 实时查询各用户内存使用率:
sum by (user) (namedprocess_name_rss_bytes) / sum by (instance) (node_memory_MemTotal_bytes) * 100 - 查询过去1小时各用户CPU平均使用率:
sum by (user) (rate(namedprocess_name_cpu_seconds_total[1h])) / sum by (instance) (count by (cpu) (node_cpu_seconds_total{mode="user"})) * 100
内容的提问来源于stack exchange,提问作者Bowen
相关产品推荐
相关产品推荐

