欢迎光临
我们一直在努力

如何利用cAdvisor/Node-Exporter监控Docker容器的GPU使用率?

在AI模型部署和推理服务中,精确监控GPU资源利用率是基础设施优化的关键。传统的容器监控工具如cAdvisor和Node-Exporter虽然在CPU、内存、网络I/O方面表现出色,但对于细粒度的、容器级别的GPU使用率监控却显得力不从心。这是因为GPU指标通常需要访问底层的NVIDIA Management Library (NVML),而cAdvisor/Node-Exporter设计上并不直接集成此功能。

本篇文章将介绍如何引入NVIDIA官方推荐的解决方案——DCGM Exporter(Data Center GPU Manager Exporter),并结合Prometheus和Docker Compose,实现对容器级别GPU指标的全面采集和监控。

1. 为什么cAdvisor和Node-Exporter不够用?

  1. 缺乏细粒度指标: Node-Exporter主要关注宿主机硬件和OS指标。cAdvisor虽然能报告容器是否分配了GPU(通过设备文件挂载),但无法提供实时的、进程级别的利用率、温度、显存占用等高级指标。
  2. 依赖NVML/DCGM: 准确的GPU指标(例如SM利用率、PCIe吞吐量)需要通过NVIDIA提供的库(如NVML或DCGM)来获取,这些库不在标准Linux工具链或容器监控工具的范畴内。

2. 核心工具:NVIDIA DCGM Exporter

DCGM Exporter是一个专门为Prometheus设计、用于导出NVIDIA GPU指标的工具。它作为Prometheus的Target运行,能够通过DCGM接口获取GPU的各项状态,并以Prometheus可识别的格式暴露在端口上。

关键优势在于,当它运行在nvidia-container-runtime环境中时,可以获取到进程级别的指标,从而间接关联到是哪个容器在使用资源。

3. 实操步骤:部署监控栈

为了演示,我们将部署一个包含DCGM Exporter、Prometheus和Grafana的最小监控栈。

前提条件

  1. 宿主机安装了NVIDIA驱动。
  2. 宿主机安装了Docker,并且配置了nvidia-container-runtime(通常通过安装nvidia-docker2包即可自动配置)。

步骤 3.1: 准备配置文件

创建 prometheus.yml 文件,用于配置Prometheus抓取DCGM Exporter的指标:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
# prometheus.yml
global:
  scrape_interval: 15s

scrape_configs:
  # Node Exporter (可选,用于宿主机CPU/内存监控)
  - job_name: 'node_exporter'
    static_configs:
      - targets: ['host.docker.internal:9100'] # 假设Node Exporter部署在宿主机上

  # DCGM Exporter Job (核心)
  - job_name: 'dcgm_exporter'
    static_configs:
      - targets: ['dcgm-exporter:9400']

步骤 3.2: 部署 Docker Compose Stack

创建 docker-compose.yml 文件来部署服务。

注意: DCGM Exporter必须在nvidia运行时下运行,并且通常需要privileged: true或至少正确挂载设备文件才能访问底层的GPU信息。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
version: '3.7'

services:
  # 1. DCGM Exporter - 负责采集GPU指标
  dcgm-exporter:
    image: nvidia/dcgm-exporter:3.2.0-cuda12.1
    container_name: dcgm-exporter
    restart: always
    privileged: true
    runtime: nvidia
    environment:
      - NVIDIA_VISIBLE_DEVICES=all
    ports:
      - "9400:9400"

  # 2. Prometheus - 负责存储和查询指标
  prometheus:
    image: prom/prometheus:v2.47.0
    container_name: prometheus
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
    ports:
      - "9090:9090"
    depends_on:
      - dcgm-exporter

  # 3. Grafana - 负责可视化
  grafana:
    image: grafana/grafana:10.1.5
    container_name: grafana
    ports:
      - "3000:3000"

volumes:
  prometheus_data:

运行部署:


1
docker-compose up -d

4. 验证与PromQL查询

部署成功后,访问 http://:9090 (Prometheus UI)。检查 Target 状态,确保 dcgm-exporter 处于 UP 状态。

DCGM Exporter暴露的关键指标(例如,GPU利用率)前缀为 DCGM_FI_。以下是一些常用的查询示例:

PromQL Query 描述
DCGM_FI_DEV_GPU_UTIL GPU SM/核心利用率(百分比)
DCGM_FI_DEV_MEM_COPY_UTIL 显存拷贝引擎利用率(百分比)
DCGM_FI_DEV_FB_USED 显存使用量(字节)

如何查看特定容器的GPU利用率?

虽然DCGM Exporter直接报告的是设备ID(例如device=0),但如果你的容器是使用runtime: nvidia运行的,DCGM Exporter还会提供进程级别的指标,你可以使用这些指标来关联到宿主机上的具体进程ID(PID)。

对于典型的AI服务部署,如果你想查看0号GPU的平均利用率:


1
avg by (gpu) (DCGM_FI_DEV_GPU_UTIL)

通过配置Grafana,导入针对DCGM指标的预制Dashboard(例如ID 13350),你可以获得更直观的容器级GPU性能视图,帮助你定位高负载的推理服务或训练任务。

【本站文章皆为原创,未经允许不得转载】:汤不热吧 » 如何利用cAdvisor/Node-Exporter监控Docker容器的GPU使用率?
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址