M-29 gpu监控:prometheus方案详解
gpu监控:prometheus方案详解
本文档基于开源项目nvidia_gpu_exporter实现gpu监控
参考文档:https://zhuanlan.zhihu.com/p/544321724?utm_id=0

常用监控项统计周期:
#按显卡uuid匹配,查询指定周期内所有gpu的平均使用率
avg(avg_over_time(nvidia_smi_utilization_gpu_ratio{uuid=~”.*”}[1d:1d]))

#按job任务名匹配,查询指定周期内所有显卡显存的平均使用率
avg(avg_over_time(nvidia_smi_memory_used_bytes{job=~”zj_gpu”}[1d:1d])/1024/1024/1024)/32*100

常用监控项统计实时:
nvidia_smi_utilization_gpu_ratio: GPU利用率,单位是百分比:avg(nvidia_smi_utilization_gpu_ratio{uuid=“.*”})
显存平均使用率:avg(nvidia_smi_memory_used_bytes{uuid=
“.“}/1024/1024/1024)/32100

厂区监控:
avg(avg_over_time(nvidia_smi_utilization_gpu_ratio{job=“cqjk_gpu_prod”}[1d:1d]))
avg(avg_over_time(nvidia_smi_memory_used_bytes{job=
“cqjk_gpu_prod”}[1d:1d])/1024/1024/1024)/16100
avg(nvidia_smi_memory_used_bytes{job=~”cqjk_gpu_prod”}/1024/1024/1024)/16
100

一、在gpu服务器上部署nvidia_gpu_exporter
1、获取nvidia_gpu_exporter
wget https://github.com/utkuozdemir/nvidia_gpu_exporter/releases/download/v0.5.0/nvidia_gpu_exporter_0.5.0_linux_x86_64.tar.gz

2、运行nvidia_gpu_exporter
临时:
nohup ./nvidia_gpu_exporter >/var/log/gpu-exporter.log 2>&1 &

自启动:vim gpu_exporter.service
[Unit]
Description=Nvidia GPU Exporter
After=network-online.target

[Service]
Type=simple

User=root
Group=root

ExecStart=/opt/nvidia_gpu_exporter #nvidia_gpu_exporter二进制执行文件存放路径

SyslogIdentifier=nvidia_gpu_exporter

Restart=always
RestartSec=1

NoNewPrivileges=yes

ProtectHome=yes
ProtectSystem=strict
ProtectControlGroups=true
ProtectKernelModules=true
ProtectKernelTunables=yes
ProtectHostname=yes
ProtectKernelLogs=yes
ProtectProc=yes

[Install]
WantedBy=multi-user.target

3、检测监控数据
项目运行后会自动监听:9835端口
尝试curl本机来查看是否正常获取到监控数据
curl localhost:9835/metrics

二、接入prometheus监控
在prometheus.yml中添加exporter地址

  • job_name: ‘zj_gpu’
    static_configs:
    • targets: [‘10.0.1.1:9835’]
      labels:
      gpu: ‘Tesla_V100’
      app: ‘gpu-exporter’

三、常用监控指标
指标名含义nvidia_smi_utilization_gpu_ratioGPU使用率nvidia_smi_memory_used_bytesGPU显存使用量nvidia_smi_memory_total_bytesGPU显存总量nvidia_smi_temperature_gpuGPU温度
prometheus的常用聚合操作符
sum 在维度上求和
max 在维度上求最大值
min 在维度上求最小值
avg 在维度上求平均值
stddev 求标准差
stdvar 求方差
count 统计向量元素的个数
count_values 统计相同数据值的元素数量
bottomk 样本值第k个最小值
topk 样本值第k个最大值
quantile 统计分位数

以下函数允许随着时间的推移聚合给定范围向量的每个序列,并返回具有每个序列聚合结果的即时向量:

  • avg_over_time(range-vector):指定间隔内所有点的平均值。
  • min_over_time(range-vector):指定间隔中所有点的最小值。
  • max_over_time(range-vector):指定间隔内所有点的最大值。
  • sum_over_time(range-vector):指定时间间隔内所有值的总和。
    四、grafana模板监控
    grafana dashboard官方有开源适用于nvidia_gpu_exporter面板ID:14574
    *** 注意:版本大于 8.1, 推荐: grafana9.+

#官方模板功能不全,建议添加:GPU平均使用率面板
新建granfna表盘 类型:Gauge
Query:
A: avg(nvidia_smi_utilization_gpu_ratio{uuid=~”.*”})
Unit:Percent(0.0-1.0)
效果:

五、promql监控项列举
nvidia_gpu_exporter_build_info: 显示 NVIDIA GPU Exporter 构建信息(版本,修订,分支和构建的Go语言版本)。
nvidia_smi_accounting_buffer_size: 记账模式的缓冲区大小。
nvidia_smi_accounting_mode: 显示 GPU 记账模式的状态。
nvidia_smi_clocks_applications_graphics_clock_hz: 应用程序的图形处理器时钟频率。
nvidia_smi_clocks_applications_memory_clock_hz: 应用程序的内存时钟频率。
nvidia_smi_clocks_current_graphics_clock_hz: 当前的图形处理器时钟频率。
nvidia_smi_clocks_current_memory_clock_hz: 当前的内存时钟频率。
nvidia_smi_clocks_current_sm_clock_hz: 当前的流多处理器(SM)时钟频率。
nvidia_smi_clocks_current_video_clock_hz: 当前的视频时钟频率。
nvidia_smi_clocks_default_applications_graphics_clock_hz: 默认应用程序的图形处理器时钟频率。
nvidia_smi_clocks_default_applications_memory_clock_hz: 默认应用程序的内存时钟频率。
nvidia_smi_clocks_max_graphics_clock_hz: 图形处理器的最大时钟频率。
nvidia_smi_clocks_max_memory_clock_hz: 内存的最大时钟频率。
nvidia_smi_clocks_max_sm_clock_hz: 流多处理器(SM)的最大时钟频率。
nvidia_smi_clocks_throttle_reasons_*: 显示 GPU 时钟降速的原因。
nvidia_smi_command_exit_code: 上次抓取命令的退出代码。
nvidia_smi_compute_mode: 显示 GPU 的计算模式。
nvidia_smi_count: 显示 GPU 的数量。
nvidia_smi_display_active: 显示是否有活动的显示器连接到 GPU。
nvidia_smi_display_mode: 显示 GPU 的显示模式。
nvidia_smi_ecc_errors_corrected_*: 显示 ECC 错误纠正情况。
nvidia_smi_ecc_errors_uncorrected_*: 显示 ECC 未纠正错误情况。
nvidia_smi_ecc_mode_current: 当前 ECC 模式。
nvidia_smi_ecc_mode_pending: 待定 ECC 模式。
nvidia_smi_encoder_stats_*: 编码器的状态,如平均帧率,平均延迟,会话数等。
nvidia_smi_enforced_power_limit_watts: 强制执行的功耗限制(瓦特)。
nvidia_smi_gpu_info: GPU 信息,包括 GPU 的 UUID,名称,驱动模型,VBIOS版本,驱动版本等。
nvidia_smi_index: GPU 索引。
nvidia_smi_inforom_ecc: Inforom ECC 信息。
nvidia_smi_pcie_link_width_max: PCIe链接的最大宽度。
nvidia_smi_persistence_mode: 持久模式的状态。
nvidia_smi_power_default_limit_watts: 默认的功率限制,单位是瓦特。
nvidia_smi_power_draw_watts: 当前绘制的功率,单位是瓦特。
nvidia_smi_power_limit_watts: 设置的功率限制,单位是瓦特。
nvidia_smi_power_management: 电源管理的状态。
nvidia_smi_power_max_limit_watts: 最大的功率限制,单位是瓦特。
nvidia_smi_power_min_limit_watts: 最小的功率限制,单位是瓦特。
nvidia_smi_pstate: 当前的性能状态 (P-state)。
nvidia_smi_retired_pages_double_bit_count: 双位错误退役页面的数量。
nvidia_smi_retired_pages_pending: 待处理的退役页面数量。
nvidia_smi_retired_pages_single_bit_ecc_count: 单位ECC错误退役页面的数量。
nvidia_smi_serial: GPU的序列号。
nvidia_smi_temperature_gpu: GPU的温度。
nvidia_smi_temperature_memory: 内存的温度。
nvidia_smi_utilization_gpu_ratio: GPU利用率,单位是百分比。
nvidia_smi_utilization_memory_ratio: 内存利用率,单位是百分比。
process_cpu_seconds_total: 进程所消耗的总CPU时间,单位是秒。
process_max_fds: 进程所能打开的最大文件描述符数量。
process_open_fds: 进程当前打开的文件描述符数量。
process_resident_memory_bytes: 进程常驻内存的大小,单位是字节。
process_start_time_seconds: 进程开始时间,单位是自Unix纪元以来的秒数。
process_virtual_memory_bytes: 进程虚拟内存的大小,单位是字节。
process_virtual_memory_max_bytes: 进程最大虚拟内存的大小,单位是字节。
promhttp_metric_handler_requests_in_flight: 当前正在处理的抓取请求数量。
promhttp_metric_handler_requests_total: 所有已完成的抓取请求数量,按HTTP状态码分类。
nvidia_smi_pcie_link_width_current: 当前的PCIe链接宽度。
nvidia_smi_ecc_errors_corrected_aggregate_device_memory: 累计的设备内存已纠正的ECC错误数量。
nvidia_smi_ecc_errors_corrected_aggregate_dram: 累计的DRAM已纠正的ECC错误数量。
nvidia_smi_ecc_errors_corrected_aggregate_l1_cache: 累计的L1缓存已纠正的ECC错误数量。
nvidia_smi_ecc_errors_corrected_aggregate_l2_cache: 累计的L2缓存已纠正的ECC错误数量。
nvidia_smi_ecc_errors_corrected_aggregate_register_file: 累计的寄存器文件已纠正的ECC错误数量。
nvidia_smi_ecc_errors_corrected_aggregate_total: 累计的所有已纠正的ECC错误总数。
nvidia_smi_ecc_errors_corrected_volatile_device_memory: 易失性设备内存已纠正的ECC错误数量。
nvidia_smi_ecc_errors_corrected_volatile_dram: 易失性DRAM已纠正的ECC错误数量。
nvidia_smi_ecc_errors_corrected_volatile_l1_cache: 易失性L1缓存已纠正的ECC错误数量。
nvidia_smi_ecc_errors_corrected_volatile_l2_cache: 易失性L2缓存已纠正的ECC错误数量。
nvidia_smi_ecc_errors_corrected_volatile_register_file: 易失性寄存器文件已纠正的ECC错误数量。
nvidia_smi_ecc_errors_corrected_volatile_total: 易失性所有已纠正的ECC错误总数。
nvidia_smi_ecc_errors_uncorrected_aggregate_cbu: 累计的CBU未纠正的ECC错误数量。
nvidia_smi_ecc_errors_uncorrected_aggregate_device_memory: 累计的设备内存未纠正的ECC错误数量。
nvidia_smi_ecc_errors_uncorrected_aggregate_dram: 累计的DRAM未纠正的ECC错误数量。
nvidia_smi_ecc_errors_uncorrected_aggregate_l1_cache: 累计的L1缓存未纠正的ECC错误数量。
nvidia_smi_ecc_errors_uncorrected_aggregate_l2_cache: 累计的L2缓存未纠正的ECC错误数量。
nvidia_smi_ecc_errors_uncorrected_aggregate_register_file: 累计的寄存器文件未纠正的ECC错误数量。
nvidia_smi_ecc_errors_uncorrected_aggregate_total: 累计的所有未纠正的ECC错误总数。
nvidia_smi_ecc_errors_uncorrected_volatile_cbu: 易失性CBU未纠正的ECC错误数量。
nvidia_smi_ecc_errors_uncorrected_volatile_device_memory: 易失性设备内存未纠正的ECC错误数量。
nvidia_smi_ecc_errors_uncorrected_volatile_dram: 易失性DRAM未纠正的ECC错误数量。
nvidia_smi_ecc_errors_uncorrected_volatile_l1_cache: 易失性L1缓存未纠正的ECC错误数量。
nvidia_smi_ecc_errors_uncorrected_volatile_l2_cache: 易失性L2缓存未纠正的ECC错误数量。
nvidia_smi_ecc_errors_uncorrected_volatile_register_file: 易失性寄存器文件未纠正的ECC错误数量。
nvidia_smi_ecc_errors_uncorrected_volatile_total: 易失性所有未纠正的ECC错误总数。
nvidia_smi_ecc_mode_current: 当前的ECC模式。
nvidia_smi_ecc_mode_pending: 待设置的ECC模式。
nvidia_smi_encoder_stats_average_fps: 编码器的平均帧率。
nvidia_smi_encoder_stats_average_latency: 编码器的平均延迟。
nvidia_smi_encoder_stats_session_count: 编码器的会话数量。
nvidia_smi_enforced_power_limit_watts: 实施的功率限制,单位是瓦特。
nvidia_smi_gpu_info: GPU信息,包括GPU的UUID,名称,驱动模型,VBIOS版本,驱动版本等。
nvidia_smi_index: GPU索引。
nvidia_smi_inforom_ecc: Inforom ECC信息。
nvidia_smi_inforom_oem: Inforom OEM信息。
nvidia_smi_memory_free_bytes: 空闲内存,单位是字节。
nvidia_smi_memory_total_bytes: 总内存,单位是字节。
nvidia_smi_memory_used_bytes: 已使用的内存,单位是字节。
nvidia_smi_pci_bus: PCI总线信息。
nvidia_smi_pci_device: PCI设备信息。
nvidia_smi_pci_device_id: PCI设备ID。
nvidia_smi_pci_domain: PCI领域信息。
nvidia_smi_pci_sub_device_id: PCI子设备ID。
nvidia_smi_pcie_link_gen_current: 当前的PCIe链接生成。
nvidia_smi_pcie_link_gen_max: PCIe链接的最大生成。