dcgm-exporter源码分析
背景
在早期的GPU监控中我们会使用一些NVML工具来对GPU卡的基本信息进行采集,并持久化到监控系统的数据存储层。因为我们知道,其实通过nvidia-smi这样的命令也是可以获取到GPU的基本信息的,但随着整个AI市场的发展和成熟,对于GPU的监控也越来越需要一套标准化的工具体系,也就是本篇文章讲的关于DCGM相关的监控解决方案。
简介
DCGM(Data Center GPU Manager)即数据中心GPU管理器,是一套用于在集群环境中管理和监视Tesla™GPU的工具。
它包括主动健康监控,全面诊断,系统警报以及包括电源和时钟管理在内的治理策略。
它可以由系统管理员独立使用,并且可以轻松地集成到NVIDIA合作伙伴的集群管理,资源调度和监视产品中。
DCGM简化了数据中心中的GPU管理,提高了资源可靠性和正常运行时间,自动化了管理任务,并有助于提高整体基础架构效率。
DCGM采集GPU指标的实现都封装在 libdcgm.so 库中
指标含义
dcgm-exporter采集指标项以及含义:
dcgm_fan_speed_percent:GPU 风扇转速占比(%)
dcgm_sm_clock:GPU sm 时钟(MHz)
dcgm_memory_clock:GPU 内存时钟(MHz)
dcgm_gpu_temp:GPU 运行的温度(℃)
dcgm_power_usage:GPU 的功率(w)
dcgm_pcie_tx_throughput:GPU PCIe TX传输的字节总数 (kb)
dcgm_pcie_rx_throughput:GPU PCIe RX接收的字节总数 (kb)
dcgm_pcie_replay_counter:GPU PCIe重试的总数
dcgm_gpu_utilization:GPU 利用率(%)
dcgm_mem_copy_utilization:GPU 内存利用率(%)
dcgm_enc_utilization:GPU 编码器利用率 (%)
dcgm_dec_utilization:GPU 解码器利用率 (%)
dcgm_xid_errors:GPU 上一个xid错误的值
dcgm_power_violation:GPU 功率限制导致的节流持续时间(us)
dcgm_thermal_violation:GPU 热约束节流持续时间(us)
dcgm_sync_boost_violation:GPU 同步增强限制,限制持续时间(us)
dcgm_fb_free:GPU fb(帧缓存)的剩余(MiB)
dcgm_fb_used:GPU fb (帧缓存)的使用 (MiB)
其实到这,DCGM的工具集已经完整的将我们需要的 GPU 的metrics数据采集出来了,并且是符合prometheus的数据格式和标准的,此时,我们可以根据实际的情况编写一个简单的api程序,将采集到的数据以api的形式暴露出去,就可以让整个prometheus server对各个 GPU 主机的metrics进行采集和监控。
启动参数
参数名称 | 别名 | 对应环境变量 | 说明 | 默认值 |
---|---|---|---|---|
collectors | f | DCGM_EXPORTER_COLLECTORS | 要采集的指标的配置文件路径 | /etc/dcgm-exporter/default-counters.csv |
address | a | DCGM_EXPORTER_LISTEN | 服务地址 | :9400 |
collect-interval | c | DCGM_EXPORTER_INTERVAL | 指标采集间隔(单位:ms) | 30000 |
kubernetes | k | DCGM_EXPORTER_KUBERNETES | 支持kubernetes指标映射到pod | false |
kubernetes-gpu-id-type | DCGM_EXPORTER_KUBERNETES_GPU_ID_TYPE | GPU ID类型,用于映射kubernetes自由到pods。可选值为uid或device-name | uid | |
use-old-namespace | o | DCGM_EXPORTER_USE_OLD_NAMESPACE | Use old 1.x namespace | false |
remote-hostengine-info | r | DCGM_REMOTE_HOSTENGINE_INFO | 连接到远程的 hostengine <HOST>:<PORT> | localhost:5555 |
devices | d | DCGM_EXPORTER_DEVICES_STR | 要监控的设备 f:监控所有的GPUs和GPU实例 g:只监控GPUs i:只监控GPU实例,如果不支持MIG,则不能指定为该值 |
f |
no-hostname | n | DCGM_EXPORTER_NO_HOSTNAME | 输出时忽略hostname信息,为了兼容旧版本 | false |
fake-gpus | DCGM_EXPORTER_USE_FAKE_GPUS | 接受虚假GPU,仅用于测试 | false | |
configmap-data | m | DCGM_EXPORTER_CONFIGMAP_DATA | 要采集的指标的配置configMap <NAMESPACE>:<NAME> | none |
三种启动模式
DCGM 可以通过三种模式来启动:
-
Embedded:在当前进程内启动 hostengine。
-
Standalone:连接到指定地址的、已经在运行的 nv-hostengine,可以通过 -connect "IP:PORT/Socket" -socket "isSocket" 来指定目标地址。
-
StartHostengine:通过打开 Unix socket的方式来启动并连接到 nv-hostengine,并在退出时终止 nv-hostengine。
DeviceOptions
type DeviceOptions struct {
Flex bool // 如果为true,则监听所有不支持MIG的GPU信息,或支持MIG的GPU实例信息
GpuRange []int // 要监听的GPU的索引列表,如果是-1,则表示监听所有GPU
GpuInstanceRange []int // 要监听的GPU实例的索引列表,如果是-1,则表示监听所有GPU实例
}
启动过程
-
把命令行参数转成*dcgmexporter.Config
-
如果使用远程hostengine,则采用 Standalone 启动模式,否则以 Embedded 模式启动。
-
初始化 DCGM
- 加载 libdcgm.so
-
-
判断是否需要收集 DCP 相关指标
-
创建 ch channel用于传递指标数据
-
创建 *dcgmexporter.MetricsPipeline 实例
-
从--configmap-data 指定的 ConfigMap中解析要采集的指标信息
-
初始化 kubernetes.Interface
-
获取目标ConfigMap,并解析“metrics”配置
-
-
如果从ConfigMap中解析失败,则从 --collectors 指定的 csv 文件中解析要采集的指标信息
-
创建 *dcgmexporter.DCGMCollector 实例
-
初始化 *dcgmexporter.SystemInfo 实例
-
获取 GPU 设备数量
-
获取每个 GPU 的详细信息,包括 GPU编号、DCGM可支持、UUID、功率(W)、PCI信息(BusID、BAR1、FBTotal、带宽)、设备标志(品牌、模式、序列号、Vbios、驱动版本等)、P2PLink列表、CPU亲和性
-
获取GPU实例的层级结构
-
根据层级结构判断GPU是否支持MIG,及关联的 GPU 实例信息
-
设置 DeviceOptions
-
-
获取hostname
-
SetupDcgmFieldsWatch,并返回对应的 cleanup 方法(用于资源回收)
-
通过 *dcgmexporter.SystemInfo 信息创建分组
-
根据 SystemInfo 和 DeviceOptions 获取要监控的实体(包括GPU和GPU实例)
-
创建Group及其cleanup方法
-
将被监控实体加入分组
-
-
创建 FileGroup 及其cleanup方法
-
WatchFieldGroup
-
-
-
如果需要支持kubernetes指标映射到pod,创建 *dcgmexporter.PodMapper 实例
-
封装成 *dcgmexporter.MetricsPipeline 实例
-
-
创建 *dcgmexporter.MetricsServer 实例,并将 ch channel 传给 MetricsServer,赋值给 metricsChan 字段
- 启动 HTTP 服务,用于处理 /health、/metrics 路径请求
-
执行 MetricsPipeline.Run() 方法,并将 ch channel 传给 Run() 方法,用于写入指标数据
-
启动定时器,定期执行 MetricsPipeline.run() 方法
-
执行 gpuCollector.GetMetrics() 方法,获取指标数据
-
从 *dcgmexporter.SystemInfo 实例中获取要监控的实体信息(包括GPU、GPU实例)
-
遍历目标实体,获取最新的指标数据,并转化成 Prometheus 指标格式
-
返回指标数据
-
-
通过 PodMapper 将指标数据和 Pod 进行映射
-
对指标数据进行格式化
-
-
将结果写入 ch channel
-
-
执行 MetricsServer.Run() 方法
-
启动HTTP服务
-
从 metricsChan 接收指标数据
-
-
监听系统中断信号,如果监听到中断信号,则进行停止或重启操作