以下是 Shell GPU 监控 的完整指南,涵盖显存、性能、温度及功耗监控,适用于 NVIDIA/AMD 显卡及高性能计算场景!
Shell GPU 监控 的完整指南
一、GPU 监控核心指标
监控项 | 工具/命令 | 典型阈值 |
---|---|---|
显存使用率 | nvidia-smi (NVIDIA) | >80%(报警) |
GPU 利用率 | nvidia-smi | >90%(持续高负载) |
核心温度 | nvidia-smi | >85℃(危险) |
功耗 | nvidia-smi | >250W(高性能卡阈值) |
运行进程 | ps + nvidia-smi | 未知进程占用 GPU |
二、监控工具与命令
1. NVIDIA 显卡监控
基本命令
# 查看 GPU 详细信息(显存、温度、功耗)
nvidia-smi --query-gpu=memory.total,utilization.gpu,temperature.gpu,power.draw --format=csv,noheader,nounits
# 实时监控(每秒刷新)
watch -n 1 nvidia-smi
示例输出
memory.total,utilization.gpu,temperature.gpu,power.draw
11242560, 98%, 72℃, 220W
2. AMD 显卡监控
工具安装
sudo apt install mesa-utils # 提供 glxinfo
sudo apt install rocm-smi # ROCm 工具包
基本命令
# 查看 AMD GPU 信息
glxinfo | grep "OpenGL renderer" # 显示显卡型号
rocm-smi --csv # 类似 nvidia-smi 的输出
三、Shell 监控脚本示例
1. 实时 GPU 状态监控
#!/bin/bash
while true; do
# NVIDIA 监控(兼容 AMD 的 fallback)
if command -v nvidia-smi &> /dev/null; then
gpu_info=$(nvidia-smi --query-gpu=memory.total,utilization.gpu,temperature.gpu,power.draw --format=csv,noheader,nounits | awk 'NR==1 {print $1" MB / "$2"% / "$3"℃ / "$4"W}')
else
# AMD 监控(示例)
mem=$(rocm-smi --mem | awk '/Total:/ {print $2}')
util=$(rocm-smi --gpu | awk '/% Used:/ {print $3}')
temp=$(rocm-smi --temp | awk '/GPU:/ {print $2}')
power=$(rocm-smi --power | awk '/Draw:/ {print $2}')
gpu_info="${mem} MB / ${util}% / ${temp}℃ / ${power}W"
fi
echo "[$(date +%T)] GPU: $gpu_info"
sleep 5
done
2. 显存泄漏检测脚本
#!/bin/bash
# 监控显存使用趋势(保存为 CSV)
gpu_mem.csv=""
while true; do
mem=$(nvidia-smi --query-gpu=memory.used --format=csv,noheader,nounits | awk 'NR==1 {print $1}')
timestamp=$(date +%s)
if [ -n "$gpu_mem.csv" ]; then
echo "$timestamp,$mem" >> gpu_mem.csv
else
echo "$timestamp,$mem" > gpu_mem.csv
fi
sleep 60 # 每分钟采样一次
done
四、高级监控与可视化
1. GPU 温度预警脚本
#!/bin/bash
while true; do
temp=$(nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader,nounits | awk 'NR==1 {print $1}')
if [ $(echo "$temp > 85" | bc -l) -eq 1 ]; then
echo "$(date): GPU 温度过高!${temp}℃" | mail -s "GPU Overheat Alert" admin@example.com
fi
sleep 30
done
2. 使用 Gnuplot 可视化显存使用
#!/bin/bash
# 生成显存使用图表(需提前安装 gnuplot)
gpu_mem.csv=""
while true; do
mem=$(nvidia-smi --query-gpu=memory.used --format=csv,noheader,nounits | awk 'NR==1 {print $1}')
timestamp=$(date +%s)
echo "$timestamp,$mem" >> gpu_mem.csv
sleep 60
done
# 绘制图表(后台运行)
gnuplot -persist -e "set terminal png; set output 'gpu_mem.png'; plot 'gpu_mem.csv' using 1:2 with lines title 'GPU Memory Usage'"
五、云原生与容器化监控
1. Kubernetes GPU 资源监控
# 获取 Pod 的 GPU 资源使用
kubectl top pods --namespace=default --resource=gpu
# 监控特定 Pod(GPU 利用率 >90%)
while true; do
metrics=$(kubectl top pod my-gpu-pod --namespace=default --output=json)
gpu_util=$(echo $metrics | jq '.items[0].metrics.gpu.usage')
if [ $(echo "$gpu_util > 90" | bc -l) -eq 1 ]; then
echo "Pod GPU Utilization Alert!" | mail -s "K8s GPU Alert" admin@example.com
fi
sleep 5
done
2. Docker 容器 GPU 监控
# 查看容器 GPU 显存
docker stats --no-stream | grep "gpu-memory"
# 监控容器 GPU 温度
while true; do
temp=$(docker inspect my-gpu-container | grep "temperature" | awk '{print $2}')
if [ $(echo "$temp > 85" | bc -l) -eq 1 ]; then
echo "Container GPU Overheat!" | mail -s "Docker GPU Alert" admin@example.com
fi
sleep 30
done
六、安全与权限
1. 限制 GPU 访问权限
# 仅允许特定用户组访问 GPU(NVIDIA)
sudo chmod 660 /dev/nvidia*
sudo chgrp video /dev/nvidia*
2. 防止未授权监控
# 在脚本中添加权限验证
if [ "$(id -u)" != "root" ]; then
echo "Error: Must run as root" >&2
exit 1
fi
七、常见问题与解决方案
1. nvidia-smi
未找到
• 解决:安装 NVIDIA 驱动并确保内核支持(dkms
安装)。
• AMD 替代:使用 rocm-smi
或 glxinfo
。
2. 温度监控不准确
• 校准:检查 BIOS 中的 GPU 温度传感器设置。
• 物理散热:清理机箱风扇灰尘,确保散热良好。
3. 脚本被杀死(OOM)
• 优化:减少采样频率(如 sleep 60
改为 sleep 300
)。
• 轻量级工具:使用 vcgencmd
(AMD)替代 nvidia-smi
。
八、工具链推荐
- 实时监控:
nvidia-smi
(NVIDIA)、rocm-smi
(AMD)、glxinfo
。 - 长期存储:InfluxDB(时序数据库) + Grafana(可视化)。
- 报警:AlertManager(Prometheus 生态) + Slack/Email Webhook。
- 容器化监控:Kubernetes Metrics Server + Prometheus。
通过以上指南,你可以用 Shell 脚本实现 GPU 的全面监控,确保高性能计算任务的稳定性与效率!如果有具体需求(如 GPU 负载预测),欢迎进一步讨论。 🚀