实战:Prometheus 监控 GPU 使用率,设置智能告警阈值

核心提要:GPU 是 AI 运维的核心算力资源,实时监控其使用率并设置合理告警,可避免资源过载导致模型训练/推理失败、服务延迟飙升等问题。本实战基于 Ubuntu 22.04 环境,采用「nvidia-dcgm-exporter + Prometheus + Alertmanager」架构,实现 GPU 使用率、显存占用等核心指标的采集,重点讲解"智能告警阈值"的设计思路与配置方法(区别于固定阈值,适配不同业务场景),最终实现 GPU 异常时的精准告警。

一、前置准备

1. 环境要求

环境/工具 版本要求 核心作用
操作系统 Ubuntu 22.04 LTS 基础实操环境
GPU NVIDIA 显卡(支持 CUDA) 监控对象,AI 算力核心
NVIDIA 驱动 510+ GPU 正常运行基础
Prometheus 2.30+ 指标采集与存储
Alertmanager 0.24+ 告警分发与管理
nvidia-dcgm-exporter 3.2+ GPU 指标暴露(Prometheus 兼容)
Docker 20.10+ 快速部署 nvidia-dcgm-exporter(推荐)

2. 前置环境验证

复制代码
# 1. 验证 NVIDIA 驱动是否正常
nvidia-smi
# 预期输出:显示 GPU 型号、驱动版本、显存使用等信息,无报错

# 2. 验证 Docker 是否正常运行
docker --version
sudo systemctl status docker
# 预期输出:Docker 版本正常,服务状态为 active (running)

# 3. 若未安装 Prometheus/Alertmanager,先执行以下命令安装(Ubuntu 环境)
# 安装 Prometheus
wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz
tar -zxvf prometheus-2.45.0.linux-amd64.tar.gz
sudo mv prometheus-2.45.0.linux-amd64 /usr/local/prometheus

# 安装 Alertmanager
wget https://github.com/prometheus/alertmanager/releases/download/v0.25.0/alertmanager-0.25.0.linux-amd64.tar.gz
tar -zxvf alertmanager-0.25.0.linux-amd64.tar.gz
sudo mv alertmanager-0.25.0.linux-amd64 /usr/local/alertmanager

二、核心原理梳理

  1. 指标采集:通过 nvidia-dcgm-exporter 采集 GPU 核心指标(使用率、显存占用、温度等),并以 Prometheus 兼容格式暴露在 9400 端口;

  2. 数据存储:Prometheus 配置采集任务,定期从 dcgm-exporter 拉取 GPU 指标并存储;

  3. 智能告警:基于 PromQL 编写动态阈值告警规则(而非固定阈值),通过 Alertmanager 配置告警接收方式(邮件、企业微信等);

  4. 可视化(可选):结合 Grafana 导入 GPU 监控模板,直观查看指标趋势(辅助阈值优化)。

三、操作步骤

步骤 1:部署 nvidia-dcgm-exporter(GPU 指标暴露)

1. Docker 部署 dcgm-exporter
复制代码
# 1. 拉取 nvidia-dcgm-exporter 镜像(官方镜像,兼容 Prometheus)
docker pull nvcr.io/nvidia/k8s/dcgm-exporter:3.2.6-3.2.0-ubuntu20.04

# 2. 启动容器(--gpus all 表示挂载所有 GPU,暴露 9400 端口)
docker run -d \
  --gpus all \
  --name dcgm-exporter \
  --net="host" \  # 主机网络模式,避免端口映射问题
  -p 9400:9400 \
  nvcr.io/nvidia/k8s/dcgm-exporter:3.2.6-3.2.0-ubuntu20.04

# 3. 验证容器是否启动成功
docker ps | grep dcgm-exporter
# 预期输出:容器状态为 Up

# 4. 验证指标是否正常暴露
curl http://localhost:9400/metrics
# 预期输出:包含大量以 nvidia_ 开头的指标(如 nvidia_gpu_utilization、nvidia_gpu_memory_used)
2. 关键 GPU 指标说明(监控核心)
  • nvidia_gpu_utilization:GPU 使用率(%),核心监控指标,反映 GPU 算力负载;

  • nvidia_gpu_memory_used:GPU 已用显存(MiB);

  • nvidia_gpu_memory_total:GPU 总显存(MiB);

  • nvidia_gpu_temperature:GPU 温度(℃),避免过热损坏硬件;

  • nvidia_dcgm_exporter_up:dcgm-exporter 服务状态(1=正常,0=异常)。

步骤 2:配置 Prometheus 采集 GPU 指标

1. 编辑 Prometheus 配置文件
复制代码
# 1. 进入 Prometheus 配置目录
cd /usr/local/prometheus

# 2. 备份默认配置文件(避免修改错误无法恢复)
sudo cp prometheus.yml prometheus.yml.bak

# 3. 编辑配置文件
sudo vim prometheus.yml
2. 添加 GPU 指标采集任务
复制代码
scrape_configs

global:
  scrape_interval: 15s  # 全局采集间隔(默认15秒,可根据需求调整)

alerting:
  alertmanagers:
  - static_configs:
    - targets:
      - localhost:9093  # Alertmanager 服务地址(默认端口9093)

rule_files:
  - "gpu_alert_rules.yml"  # 后续创建的 GPU 告警规则文件

scrape_configs:
  # 1. Prometheus 自身指标采集(默认已有,保留)
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]

  # 2. GPU 指标采集任务(新增)
  - job_name: "gpu-monitor"
    static_configs:
      - targets: ["localhost:9400"]  # dcgm-exporter 地址(端口9400)
    scrape_interval: 10s  # GPU 指标采集间隔(比全局短,监控更实时)
    metrics_path: "/metrics"  # 指标暴露路径(dcgm-exporter 默认)
3. 重启 Prometheus 生效配置
复制代码
# 1. 停止现有 Prometheus 进程(若已启动)
sudo pkill prometheus

# 2. 后台启动 Prometheus(指定配置文件)
nohup /usr/local/prometheus/prometheus \
  --config.file=/usr/local/prometheus/prometheus.yml \
  --storage.tsdb.path=/usr/local/prometheus/data \
  > /usr/local/prometheus/prometheus.log 2>&1 &

# 3. 验证 Prometheus 是否启动成功
curl http://localhost:9090/
# 预期输出:Prometheus web 界面(说明启动正常)
4. 验证 GPU 指标采集
复制代码
http://服务器IP:9090

nvidia_gpu_utilization

步骤 3:设置智能告警阈值(核心重点)

1. 编写智能告警规则文件(gpu_alert_rules.yml)
复制代码
rule_files

# 进入 Prometheus 配置目录
cd /usr/local/prometheus

# 创建告警规则文件
sudo vim gpu_alert_rules.yml

groups:
- name: gpu_alert_rules  # 告警规则组名称
  rules:
    # 场景 1:GPU 使用率持续过高(智能阈值:基于30分钟历史P95值+10%偏移)
    - alert: GPUHighUtilization
      expr: |
        nvidia_gpu_utilization > 
        (quantile_over_time(0.95, nvidia_gpu_utilization[30m]) + 10)  # 30分钟内P95值+10作为阈值
        and 
        nvidia_gpu_utilization > 70  # 兜底阈值(避免历史基准过低导致误告警)
      for: 2m  # 持续2分钟超标才告警(过滤短期峰值)
      labels:
        severity: warning  # 告警级别(warning/critical)
        business_type: all  # 适配所有业务场景
      annotations:
        summary: "GPU 使用率持续过高"
        description: "GPU {{ $labels.gpu }}(UUID: {{ $labels.uuid }})使用率持续2分钟超过智能阈值,当前值:{{ $value }}%,30分钟历史P95值:{{ quantile_over_time(0.95, nvidia_gpu_utilization[30m]) }}"

    # 场景 2:GPU 显存占用过高(智能阈值:已用显存/总显存 > 85%,持续3分钟)
    - alert: GPUHighMemoryUsage
      expr: |
        (nvidia_gpu_memory_used / nvidia_gpu_memory_total) * 100 > 85
      for: 3m
      labels:
        severity: warning
        business_type: all
      annotations:
        summary: "GPU 显存占用过高"
        description: "GPU {{ $labels.gpu }} 显存占用率:{{ ($value) | humanizePercentage }},已用:{{ nvidia_gpu_memory_used | humanize }}MiB,总显存:{{ nvidia_gpu_memory_total | humanize }}MiB"

    # 场景 3:实时推理场景 GPU 使用率超标(更严格的智能阈值)
    - alert: GPUHighUtilizationForRealTimeInference
      expr: |
        nvidia_gpu_utilization > 
        (quantile_over_time(0.90, nvidia_gpu_utilization[20m]) + 5)  # 20分钟P90值+5
        and 
        nvidia_gpu_utilization > 60  # 兜底阈值(实时推理需低负载)
      for: 1m  # 实时场景响应更快,持续1分钟即告警
      labels:
        severity: critical  # 告警级别提升为紧急
        business_type: real_time_inference  # 仅适配实时推理场景
      annotations:
        summary: "实时推理场景 GPU 使用率超标"
        description: "实时推理 GPU {{ $labels.gpu }} 使用率持续1分钟超过智能阈值,当前值:{{ $value }}%,可能导致推理延迟飙升"

    # 场景 4:dcgm-exporter 服务异常(指标采集中断)
    - alert: DCGMExporterDown
      expr: nvidia_dcgm_exporter_up == 0
      for: 30s
      labels:
        severity: critical
        business_type: all
      annotations:
        summary: "GPU 指标采集服务异常"
        description: "nvidia-dcgm-exporter 服务已停止,GPU 指标无法采集,需立即检查容器状态"
2. 关键智能告警规则说明
  • quantile_over_time(0.95, nvidia_gpu_utilization[30m]):PromQL 函数,计算 30 分钟内 GPU 使用率的 P95 值(95% 的数据低于该值,反映正常负载基准);

  • + 10:偏移量(可根据业务调整),避免基准值波动导致误告警;

  • for: 2m:时间窗口,仅当指标持续超标 2 分钟才触发告警,过滤瞬时峰值(如模型加载时的短期高负载);

  • 场景区分:通过 business_type 标签区分实时推理/离线训练,后续可在 Alertmanager 中配置不同的告警接收方式。

3. 配置 Alertmanager 接收告警
3.1 编辑 Alertmanager 配置文件
复制代码
# 进入 Alertmanager 目录
cd /usr/local/alertmanager

# 备份默认配置
sudo cp alertmanager.yml alertmanager.yml.bak

# 编辑配置文件
sudo vim alertmanager.yml

global:
  resolve_timeout: 5m  # 告警解决后,5分钟内不再重复发送

route:
  group_by: ['alertname', 'business_type']  # 按告警名称、业务类型分组
  group_wait: 10s  # 同组告警等待10秒,合并发送
  group_interval: 10s  # 同组告警间隔10秒发送
  repeat_interval: 1h  # 重复告警间隔(避免频繁骚扰)
  receiver: 'wechat'  # 默认接收人(企业微信)

receivers:
- name: 'wechat'
  webhook_configs:
  - url: 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的企业微信机器人key'  # 替换为实际key
    send_resolved: true  # 告警解决后发送恢复通知
    http_config:
      timeout: 10s

# 可选:按业务类型路由不同接收人(如实时推理告警发给运维A,离线训练发给运维B)
routes:
- match:
    business_type: real_time_inference
  receiver: 'wechat-real-time'
- match:
    business_type: offline_training
  receiver: 'wechat-offline'
3.2 重启 Alertmanager 生效配置
复制代码
# 1. 停止现有 Alertmanager 进程
sudo pkill alertmanager

# 2. 后台启动 Alertmanager
nohup /usr/local/alertmanager/alertmanager \
  --config.file=/usr/local/alertmanager/alertmanager.yml \
  --storage.path=/usr/local/alertmanager/data \
  > /usr/local/alertmanager/alertmanager.log 2>&1 &

# 3. 验证 Alertmanager 启动成功
curl http://localhost:9093/
# 预期输出:Alertmanager web 界面(说明启动正常)

步骤 4:验证智能告警(模拟故障测试)

1. 模拟 GPU 高负载
复制代码
# 1. 安装 PyTorch(若未安装)
pip3 install torch torchvision -i https://pypi.tuna.tsinghua.edu.cn/simple

# 2. 创建 GPU 压力测试脚本(gpu_stress.py)
vim gpu_stress.py

import torch
import time

# 确认 GPU 可用
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"使用设备:{device}")

# 生成大张量,占用显存
x = torch.randn(10000, 10000).to(device)
y = torch.randn(10000, 10000).to(device)

# 循环进行矩阵运算,占用 GPU 算力
while True:
    z = torch.matmul(x, y)
    time.sleep(0.1)
    print("GPU 压力测试中...")
2. 执行测试脚本,触发告警
复制代码
# 执行脚本(占用 GPU 资源)
python3 gpu_stress.py

# 查看 GPU 使用率(确认负载已飙升)
nvidia-smi
# 预期输出:GPU 使用率 > 90%,显存占用 > 80%
3. 验证告警触发与推送
复制代码
for: 2m

http://服务器IP:9093

Ctrl+C

resolve_timeout

步骤 5:可选:Grafana 可视化 GPU 指标

复制代码
# 1. 安装 Grafana(Ubuntu 环境)
sudo apt-get install -y apt-transport-https software-properties-common wget
wget -q -O - https://packages.grafana.com/gpg.key | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/grafana.gpg
echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
sudo apt-get update -y
sudo apt-get install grafana -y

# 2. 启动 Grafana
sudo systemctl start grafana-server
sudo systemctl enable grafana-server

# 3. 访问 Grafana(http://服务器IP:3000,默认账号密码:admin/admin)
# 4. 配置数据源:添加 Prometheus(地址 http://localhost:9090)
# 5. 导入 GPU 监控模板:在 Grafana 中搜索模板 ID(12239),一键导入即可查看 GPU 使用率、显存、温度等可视化图表

四、常见问题排查

问题 1:Prometheus 无法采集 GPU 指标

原因:dcgm-exporter 容器未启动、Prometheus 配置错误、端口被防火墙拦截。

解决方案: 1. 检查 dcgm-exporter 容器状态:docker ps | grep dcgm-exporter,若未启动则重启:docker restart dcgm-exporter; 2. 验证 dcgm-exporter 指标暴露:curl http://localhost:9400/metrics; 3. 检查 Prometheus 配置文件语法:/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml --web.enable-lifecycle(语法错误会直接提示); 4. 关闭防火墙:sudo ufw disable(测试环境)。

问题 2:告警未触发

原因:告警规则语法错误、指标未达标、Prometheus 与 Alertmanager 连接失败。

解决方案: 1. 检查告警规则语法:在 Prometheus web 界面→「Alerts」,查看规则是否显示「OK」(无语法错误); 2. 验证告警表达式:在 Prometheus 搜索框输入告警规则中的 expr 表达式,查看是否返回 true(达标); 3. 检查 Prometheus 与 Alertmanager 连接:查看 Prometheus 日志:tail -f /usr/local/prometheus/prometheus.log,是否有连接 Alertmanager 失败的错误。

问题 3:告警推送失败(企业微信未收到)

原因:企业微信机器人 key 错误、网络不通、Alertmanager 配置错误。

解决方案: 1. 验证企业微信机器人 key:直接访问 webhook 地址(https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的key),若提示"invalid key"则 key 错误; 2. 测试网络连通性:curl -X POST "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的key" -H "Content-Type: application/json" -d '{"msgtype":"text","text":{"content":"测试消息"}}',若返回 {"errcode":0,"errmsg":"ok"} 则网络正常; 3. 检查 Alertmanager 日志:tail -f /usr/local/alertmanager/alertmanager.log,查看是否有推送失败的错误信息。

五、总结与进阶方向

1. 核心成果

完成「GPU 指标采集→Prometheus 存储→智能告警配置→告警推送」全流程,实现了 GPU 使用率、显存占用等核心指标的实时监控,通过「动态阈值+时间窗口」的智能策略,避免了传统固定阈值的误告警问题,可适配不同 AI 业务场景(实时推理/离线训练)。

2. 进阶方向

  • 告警阈值优化:结合机器学习算法(如 Prometheus 结合 Thanos),基于历史数据自动调整阈值;

  • 分布式 GPU 监控:针对多节点 GPU 集群,部署 Prometheus 联邦集群,实现统一监控与告警;

  • 告警降噪:添加告警抑制规则(如 GPU 温度过高告警触发时,抑制使用率告警),减少冗余告警;

  • 自动化运维:结合 Ansible 或 Kubernetes,实现告警触发后的自动修复(如重启异常 GPU 进程、扩容资源)。

附:nvidia-dcgm-exporter 二进制部署步骤(无 Docker 场景)

复制代码
# 1. 安装 DCGM(NVIDIA 数据中心 GPU 管理工具)
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt-get update -y
sudo apt-get install -y datacenter-gpu-manager

# 2. 下载 dcgm-exporter 二进制包
wget https://github.com/NVIDIA/dcgm-exporter/releases/download/v3.2.6/dcgm-exporter_3.2.6_amd64.deb
sudo dpkg -i dcgm-exporter_3.2.6_amd64.deb

# 3. 启动 dcgm-exporter 服务
sudo systemctl start dcgm-exporter
sudo systemctl enable dcgm-exporter

# 4. 验证服务状态
sudo systemctl status dcgm-exporter
# 预期输出:active (running),说明启动正常
相关推荐
AC赳赳老秦12 小时前
外文文献精读:DeepSeek翻译并解析顶会论文核心技术要点
前端·flutter·zookeeper·自动化·rabbitmq·prometheus·deepseek
牛奶咖啡132 天前
Prometheus+Grafana构建云原生分布式监控系统(十二)_基于DNS的服务发现
云原生·prometheus·dns·搭建自己的dns服务器·使用bind搭建dns服务器·配置正向解析·基于dns的服务发现
A-刘晨阳3 天前
Prometheus + Grafana + Alertmanager 实现邮件监控告警及配置告警信息
运维·云计算·grafana·prometheus·监控·邮件
饺子大魔王的男人3 天前
告别服务器失联!Prometheus+Alertmanager+cpolar 让监控告警不局限于内网
运维·服务器·prometheus
牛奶咖啡134 天前
Prometheus+Grafana构建云原生分布式监控系统(十一)_基于consul的服务发现
云原生·prometheus·consul的安装部署·consul服务自动发现·consul服务的注册删除·consul服务的更新·实现自动去consul注册服务
Otto_10275 天前
在 OpenStack Rocky 中部署 Prometheus + Grafana
openstack·grafana·prometheus
牛奶咖啡135 天前
Prometheus+Grafana构建云原生分布式监控系统(十)_prometheus的服务发现机制(一)
云原生·prometheus·prometheus服务发现·静态服务发现·动态服务发现·基于文件的服务发现配置实践·prometheus标签重写
玄德公笔记5 天前
Prometheus监控k8s的metric详解(第二版)-01-scrape 指标抓取
kubernetes·k8s·prometheus·监控·metric·scrape·k8s监控
小北方城市网5 天前
Spring Boot Actuator+Prometheus+Grafana 生产级监控体系搭建
java·spring boot·python·rabbitmq·java-rabbitmq·grafana·prometheus
牛奶咖啡136 天前
Prometheus+Grafana构建云原生分布式监控系统(九)_pushgateway的使用
云原生·grafana·prometheus·pushgateway·pushgateway使用场景·推数据到pushgateway·pushgateway的使用