Kubernetes

dcgm-exporter源码分析

2023-03-14  本文已影响0人  王勇1024

背景

在早期的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 可以通过三种模式来启动:

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监控方案

上一篇下一篇

猜你喜欢

热点阅读