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实例
}

启动过程

  1. 把命令行参数转成*dcgmexporter.Config

  2. 如果使用远程hostengine,则采用 Standalone 启动模式,否则以 Embedded 模式启动。

    1. 初始化 DCGM

      1. 加载 libdcgm.so
  3. 判断是否需要收集 DCP 相关指标

  4. 创建 ch channel用于传递指标数据

  5. 创建 *dcgmexporter.MetricsPipeline 实例

    1. 从--configmap-data 指定的 ConfigMap中解析要采集的指标信息

      1. 初始化 kubernetes.Interface

      2. 获取目标ConfigMap,并解析“metrics”配置

    2. 如果从ConfigMap中解析失败,则从 --collectors 指定的 csv 文件中解析要采集的指标信息

    3. 创建 *dcgmexporter.DCGMCollector 实例

      1. 初始化 *dcgmexporter.SystemInfo 实例

        1. 获取 GPU 设备数量

        2. 获取每个 GPU 的详细信息,包括 GPU编号、DCGM可支持、UUID、功率(W)、PCI信息(BusID、BAR1、FBTotal、带宽)、设备标志(品牌、模式、序列号、Vbios、驱动版本等)、P2PLink列表、CPU亲和性

        3. 获取GPU实例的层级结构

        4. 根据层级结构判断GPU是否支持MIG,及关联的 GPU 实例信息

        5. 设置 DeviceOptions

      2. 获取hostname

      3. SetupDcgmFieldsWatch,并返回对应的 cleanup 方法(用于资源回收)

        1. 通过 *dcgmexporter.SystemInfo 信息创建分组

          1. 根据 SystemInfo 和 DeviceOptions 获取要监控的实体(包括GPU和GPU实例)

          2. 创建Group及其cleanup方法

          3. 将被监控实体加入分组

        2. 创建 FileGroup 及其cleanup方法

        3. WatchFieldGroup

    4. 如果需要支持kubernetes指标映射到pod,创建 *dcgmexporter.PodMapper 实例

    5. 封装成 *dcgmexporter.MetricsPipeline 实例

  6. 创建 *dcgmexporter.MetricsServer 实例,并将 ch channel 传给 MetricsServer,赋值给 metricsChan 字段

    1. 启动 HTTP 服务,用于处理 /health、/metrics 路径请求
  7. 执行 MetricsPipeline.Run() 方法,并将 ch channel 传给 Run() 方法,用于写入指标数据

    1. 启动定时器,定期执行 MetricsPipeline.run() 方法

      1. 执行 gpuCollector.GetMetrics() 方法,获取指标数据

        1. 从 *dcgmexporter.SystemInfo 实例中获取要监控的实体信息(包括GPU、GPU实例)

        2. 遍历目标实体,获取最新的指标数据,并转化成 Prometheus 指标格式

        3. 返回指标数据

      2. 通过 PodMapper 将指标数据和 Pod 进行映射

      3. 对指标数据进行格式化

    2. 将结果写入 ch channel

  8. 执行 MetricsServer.Run() 方法

    1. 启动HTTP服务

    2. 从 metricsChan 接收指标数据

  9. 监听系统中断信号,如果监听到中断信号,则进行停止或重启操作

参考文档

基于DCGM和Prometheus的GPU监控方案

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容