保姆级教程:用nvidia-smi命令行搞定多卡服务器监控与日志记录(含report.csv分析)
保姆级教程:用nvidia-smi命令行搞定多卡服务器监控与日志记录(含report.csv分析)
在GPU密集型计算场景中,服务器管理员和算法工程师常面临这样的困境:训练任务跑了三天突然中断,却无法定位是显存泄漏、温度过高还是功耗触顶导致的故障。传统的人工抽查监控方式不仅效率低下,更可能遗漏关键时间点的异常数据。本文将手把手带您构建一套基于nvidia-smi的自动化监控方案,实现从实时状态追踪到历史数据分析的完整闭环。
1. 监控体系搭建基础
1.1 核心参数解析
nvidia-smi的灵活性源于其丰富的查询参数组合。以下六个核心参数构成监控体系的基石:
- -l/--loop:监控间隔秒数,建议生产环境设为60-300秒以避免日志膨胀
- --format=csv:结构化输出格式,便于后续程序解析
- --filename:日志存储路径,推荐使用
/var/log/gpu/gpu_%Y%m%d.csv的日期格式 - --query-gpu:字段查询语法,支持嵌套属性(如
utilization.memory) - -i/--id:指定GPU设备ID,多卡环境下需配合逗号分隔使用
- -f/--filename:输出到文件时的路径处理策略(追加/覆盖)
1.2 字段选择策略
通过nvidia-smi --help-query-gpu可获取全部可用字段,但实际监控中建议分层配置:
# 基础健康监测字段 BASIC_FIELDS="timestamp,name,temperature.gpu,fan.speed,power.draw" # 性能指标字段 PERF_FIELDS="utilization.gpu,utilization.memory,memory.total,memory.used" # 高级诊断字段 ADVANCED_FIELDS="clocks.current.graphics,clocks.current.memory,ecc.errors.corrected"提示:实际部署时应根据业务需求裁剪字段,每个字段增加约5%的日志体积
2. 多场景监控方案实现
2.1 实时监控模式
对于调试场景,推荐使用watch命令组合实现高刷新率监控:
watch -n 1 -d 'nvidia-smi --query-gpu=index,utilization.gpu,memory.used --format=csv'这个方案的特点在于:
-d参数高亮变化数值- 只保留核心指标避免信息过载
- 1秒刷新频率平衡了可读性与系统负载
2.2 后台日志模式
生产环境更推荐使用nohup实现后台持续记录:
nohup nvidia-smi -l 60 \ --format=csv \ --filename=/var/log/gpu/$(date +%Y%m%d).csv \ --query-gpu=timestamp,index,$BASIC_FIELDS,$PERF_FIELDS > /dev/null 2>&1 &关键配置要点:
- 使用
nohup和&实现后台运行 - 日志按日期分割存储
- 重定向STDOUT/STDERR避免产生垃圾文件
2.3 多卡差异监控
当服务器搭载不同型号GPU时,需要针对性监控:
# A100重点监控MIG状态 nvidia-smi -i 0 --query-gpu=timestamp,mig.mode.current --format=csv # V100关注ECC错误计数 nvidia-smi -i 1 --query-gpu=timestamp,ecc.errors.uncorrected --format=csv3. 日志分析与异常检测
3.1 CSV预处理技巧
原始日志往往包含冗余头信息,需用awk预处理:
awk 'NR>2' gpu_log.csv > cleaned.csv # 去除头部说明 sed -i 's/ %//g' cleaned.csv # 去除百分号便于数值计算3.2 关键指标趋势分析
使用pandas进行内存使用率分析示例:
import pandas as pd df = pd.read_csv('cleaned.csv', parse_dates=['timestamp']) df['memory_usage_ratio'] = df['memory.used [MiB]'] / df['memory.total [MiB]'] # 找出显存使用率持续增长的进程 leaking_processes = df.groupby('pid')['memory_usage_ratio'].filter( lambda x: x.diff().mean() > 0.01 )3.3 自动告警规则配置
通过阈值检测实现自动化告警:
# 温度异常检测 awk -F',' '$4 > 85 {print $1,$4}' cleaned.csv # 显存泄漏检测(连续3次增长) python3 -c " import sys data = [float(x) for x in sys.stdin.read().split()] print(any(data[i]<data[i+1]<data[i+2] for i in range(len(data)-2))) " < <(awk '{print $7}' cleaned.csv)4. 高级应用场景
4.1 与Prometheus集成
通过nvidia_gpu_exporter实现监控数据可视化:
# docker-compose.yml配置示例 services: gpu-exporter: image: nvidia/gpu-monitoring-tools command: > --query-gpu=utilization.gpu,memory.used --interval=60s devices: - /dev/nvidiactl:/dev/nvidiactl - /dev/nvidia-uvm:/dev/nvidia-uvm4.2 性能瓶颈分析
结合时间序列数据定位计算瓶颈:
# 计算GPU利用率与任务进度的相关性 correlation = df[['utilization.gpu', 'epoch_progress']].corr().iloc[0,1] if correlation < 0.3: print("警告:GPU计算资源未充分利用")4.3 日志轮转策略
使用logrotate管理历史日志:
# /etc/logrotate.d/gpu-monitor /var/log/gpu/*.csv { daily rotate 30 compress missingok notifempty create 640 root adm }5. 实战问题排查指南
当收到GPU异常告警时,建议按以下流程排查:
确认当前状态:
nvidia-smi -q -i <故障GPU编号>检查历史趋势:
df.plot(x='timestamp', y=['temperature.gpu', 'utilization.gpu'])定位问题进程:
nvidia-smi pmon -c 1 -s um深度诊断命令:
- 查看时钟状态:
nvidia-smi -q -d CLOCK - 检查PCIe带宽:
nvidia-smi -q -d PERFORMANCE - 获取详细错误:
nvidia-smi -q -d ERROR
- 查看时钟状态:
在最近一次A100集群维护中,我们发现某节点频繁出现性能降级。通过分析历史日志,定位到每天14:00温度达到90℃触发降频。最终确认是机房空调在该时段送风量不足导致,调整冷却策略后问题解决。
