Zabbix关于Gpu的监测

Administrator
发布于 2026-05-25 / 3 阅读 / 0 评论 / 0 点赞

Zabbix关于Gpu的监测


一、整体接入流程

步骤

说明

1️⃣ 安装 Zabbix Agent

在 GPU 服务器上安装 Zabbix Agent(经典版或 Agent2),推荐 Agent2

2️⃣ 配置 Agent

设置主动模式(ServerActive=Zabbix服务器IPHostname=唯一标识StartAgents=0

3️⃣ 编写 GPU 监控脚本

实现 GPU 发现(LLD)和指标获取(利用率、显存、温度、功耗)

4️⃣ 定义 UserParameter

将脚本注册为自定义监控项

5️⃣ 重启 Agent

加载配置

6️⃣ Zabbix 前端配置

创建主机,关联模板,添加发现规则和监控项原型

7️⃣ 验证数据

检查最新数据是否上报


二、检测脚本编制

2.1 脚本位置与权限

创建两个脚本在 /usr/local/bin/ 下,赋予执行权限,并确保 zabbix 用户能够执行(已加入 video 组)。

2.2 GPU 发现脚本 (gpu_discovery.sh)

作用:输出所有 GPU 的索引和名称,供 Zabbix 低级别自动发现使用。

bash

#!/bin/bash
# 文件:/usr/local/bin/gpu_discovery.sh
gpu_count=$(nvidia-smi --query-gpu=name --format=csv,noheader | wc -l)
echo '{"data":['
for i in $(seq 0 $((gpu_count-1))); do
    name=$(nvidia-smi -i $i --query-gpu=name --format=csv,noheader | sed 's/"/\\"/g')
    echo -n '{"{#GPUINDEX}":'$i', "{#GPUNAME}":"'$name'"}'
    [ $i -lt $((gpu_count-1)) ] && echo ','
done
echo ']}'

输出示例

json

{"data":[
{"{#GPUINDEX}":0, "{#GPUNAME}":"NVIDIA L20"},
{"{#GPUINDEX}":1, "{#GPUNAME}":"NVIDIA L20"},
...
]}

2.3 GPU 指标获取脚本 (gpu_metrics.sh)

作用:根据传入的 GPU 索引和指标类型,返回对应数值。

bash

#!/bin/bash
# 文件:/usr/local/bin/gpu_metrics.sh
# 用法:gpu_metrics.sh <gpu_index> <metric>
# 支持的 metric: util, mem_used, mem_total, temp, power
gpu=$1
metric=$2
case $metric in
    util)
        nvidia-smi -i $gpu --query-gpu=utilization.gpu --format=csv,noheader,nounits
        ;;
    mem_used)
        nvidia-smi -i $gpu --query-gpu=memory.used --format=csv,noheader,nounits
        ;;
    mem_total)
        nvidia-smi -i $gpu --query-gpu=memory.total --format=csv,noheader,nounits
        ;;
    temp)
        nvidia-smi -i $gpu --query-gpu=temperature.gpu --format=csv,noheader,nounits
        ;;
    power)
        nvidia-smi -i $gpu --query-gpu=power.draw --format=csv,noheader,nounits | sed 's/ W//'
        ;;
esac

2.4 赋予执行权限并测试

bash

chmod +x /usr/local/bin/gpu_discovery.sh /usr/local/bin/gpu_metrics.sh

# 测试发现脚本
/usr/local/bin/gpu_discovery.sh

# 测试指标脚本(返回数值)
/usr/local/bin/gpu_metrics.sh 0 util
/usr/local/bin/gpu_metrics.sh 0 temp

三、Zabbix Agent 配置

3.1 配置文件 /etc/zabbix/zabbix_agentd.conf 关键项

ini

# 主动模式,关闭被动监听(可根据需要开启)
StartAgents=0

# Zabbix Server 地址(主动上报)
ServerActive=IP

# 主机名(务必与前端主机名一致)
Hostname=Gpu-server

# 允许自定义参数中的特殊字符
UnsafeUserParameters=1

# 包含自定义配置目录
Include=/etc/zabbix/zabbix_agentd.d/*.conf

3.2 自定义参数文件 /etc/zabbix/zabbix_agentd.d/gpu.conf

ini

UserParameter=gpu.discovery,/usr/local/bin/gpu_discovery.sh
UserParameter=gpu.metrics[*],/usr/local/bin/gpu_metrics.sh $1 $2

3.3 重启 Agent

bash

systemctl restart zabbix-agent
systemctl status zabbix-agent

3.4 验证自定义参数

bash

zabbix_agentd -t gpu.discovery
zabbix_agentd -t gpu.metrics[0,util]

四、Zabbix 前端配置(主动模式)

4.1 创建主机

  • 主机名:Gpu-server(与 Agent 配置完全一致)

  • 可见名称:任意

  • 群组:例如 Linux servers

  • 接口:添加 Agent 接口,IP 可填 127.0.0.1(主动模式下端口不实际使用,但必须存在)

  • 模板:关联 Linux by Zabbix agent(用于 CPU、内存、磁盘等基础监控)

4.2 创建发现规则(用于 GPU)

  1. 进入主机 → 发现规则创建发现规则

    • 名称:NVIDIA GPU discovery

    • 类型:Zabbix 客户端(主动模式下仍选此项)

    • 键值:gpu.discovery

    • 更新间隔:1h

    • 过滤器:保持为空(不设置任何过滤条件,避免宏不存在错误)

  2. 创建监控项原型(点击发现规则上方的“监控项原型”标签)

    名称

    键值

    单位

    信息类型

    GPU {#GPUINDEX} 利用率

    gpu.metrics[{#GPUINDEX},util]

    %

    数字(无符号)

    GPU {#GPUINDEX} 显存使用

    gpu.metrics[{#GPUINDEX},mem_used]

    MiB

    数字(无符号)

    GPU {#GPUINDEX} 显存总量

    gpu.metrics[{#GPUINDEX},mem_total]

    MiB

    数字(无符号)

    GPU {#GPUINDEX} 温度

    gpu.metrics[{#GPUINDEX},temp]

    数字(浮点)

    GPU {#GPUINDEX} 功耗

    gpu.metrics[{#GPUINDEX},power]

    W

    数字(浮点)

  3. 可选:创建图形原型,将利用率和温度等组合显示。

4.3 等待数据

  • 发现规则会在下一个更新周期(1小时)自动执行,也可手动点击“立即执行”触发。

  • 进入 监测最新数据,筛选主机 Gpu-server,搜索 gpu.metrics 即可看到数据。


五、实现特定信息的检测

5.1 通过 Zabbix 触发器实现告警

例如:GPU 温度超过 85℃ 告警,GPU 利用率持续过低等。

创建触发器(可在模板或主机上):

  • 名称:GPU {#GPUINDEX} 温度过高

  • 表达式:last(/Gpu-server/gpu.metrics[{#GPUINDEX},temp])>85

  • 严重性:警告/严重

5.2 自定义监控其他 GPU 指标

如需监控更多指标(如风扇转速、PCIe 链路速率、ECC 错误计数等),只需扩展 gpu_metrics.shcase 分支,添加新的指标类型,然后在 Zabbix 前端创建对应的监控项原型即可。

示例:添加 GPU 风扇转速监控(L20 可能无风扇,但可通用)

bash

# 在 gpu_metrics.sh 中添加
fan_speed)
    nvidia-smi -i $gpu --query-gpu=fan.speed --format=csv,noheader,nounits
    ;;

5.3 调整采集频率

  • 对于利用率、温度等变化较快的指标,可以在监控项原型中设置更新间隔为 30s1m

  • 对于显存总量等静态指标,可设置为 1d 或使用 flexible interval


六、验证与排错

6.1 常见问题检查表

现象

排查步骤

Agent 日志显示 host [Gpu-server] not found

检查前端主机名是否与 Agent 的 Hostname 完全一致(大小写敏感)

发现规则错误 no value received for macro "{#DEVTYPE}"

删除发现规则中的所有过滤器,或确保过滤器使用的宏存在于 JSON 中

监控项无数据

手动执行 zabbix_agentd -t gpu.metrics[0,util];检查 zabbix 用户能否执行 nvidia-smi;查看 Agent 日志

主动模式不上报

确认 ServerActive 地址正确,防火墙允许访问 10051(出方向)

6.2 日志查看

bash

# Agent 日志
tail -f /var/log/zabbix/zabbix_agentd.log

# Server 日志(需在 Zabbix Server 上执行)
tail -f /var/log/zabbix/zabbix_server.log | grep "Gpu-server"

七、总结

通过以上步骤,您已经完成了:

  • ✅ Zabbix Agent 的主动模式配置

  • ✅ GPU 发现脚本和指标获取脚本的编写与部署

  • ✅ 自定义监控项和低级别自动发现的配置

  • ✅ 对 4 张 NVIDIA L20 的利用率、显存、温度、功耗等关键指标的实时监控


评论