美文网首页Kubernetes
dcgm-exporter源码分析

dcgm-exporter源码分析

作者: 王勇1024 | 来源:发表于2023-03-14 14:59 被阅读0次

    背景

    在早期的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监控方案

    相关文章

      网友评论

        本文标题:dcgm-exporter源码分析

        本文链接:https://www.haomeiwen.com/subject/kaqkrdtx.html