nvidia-smi默认输出不能单看gpu-util,因其仅统计sm单元活跃周期占比,对显存拷贝、tensor core未触发、pcie瓶颈等场景不敏感;真正负载需结合memory-usage、temp及进程列表判断。

nvidia-smi 是唯一能直接反映 NVIDIA GPU 运算压力的命令,但默认输出里的 GPU-Util 不等于“整体负载”,必须结合 Memory-Usage、Temp 和进程列表交叉判断。
为什么 nvidia-smi 默认输出不能单看 GPU-Util
很多人看到 GPU-Util 显示 0%,就以为 GPU 没干活——这是最大误区。该字段只统计 SM 单元的活跃周期占比,对以下场景完全不敏感:
- 纯显存拷贝(如
torch.cuda.empty_cache()后的内存整理) - Tensor Core 矩阵乘未触发(模型前向刚加载完权重,还没开始
forward) - PCIe 带宽瓶颈导致核空等(
Perf显示P12或P8,但GPU-Util仍为 0)
真正卡顿或 OOM 的前兆,通常是 Memory-Usage 接近总量,或 Temp 持续 > 85℃ 触发降频。
nvidia-smi -l1 比 watch -n1 nvidia-smi 更可靠
watch 是 shell 层轮询,每次启动新进程调用驱动接口,容易漏掉瞬时峰值;而 -l1 是 nvidia-smi 内置 polling,与内核模块通信更直接。
- 不加数字默认 5 秒刷新,压测时基本无效 → 必须写
nvidia-smi -l1 - 首次输出延迟 > 2 秒?说明 GPU 处于低功耗状态(查
Perf列是否为P12),需跑个 dummy kernel 唤醒 - 终端宽度不足会导致表格折行,
Temp和GPU-Util被挤到下一行 → 调宽终端,或改用nvidia-smi --query-gpu=temperature.gpu,utilization.gpu --format=csv
多卡系统里如何确认是哪张卡被谁占着
默认 nvidia-smi 只显示编号为 0 的 GPU;若要定位具体卡和用户,必须组合使用:
- 查所有卡状态:
nvidia-smi -L(列出每张卡的 UUID 和索引) - 查某张卡详情(如索引 1):
nvidia-smi -i 1 - 查占用设备的进程 PID:
fuser -v /dev/nvidia*(注意:返回的是主设备号,需对照nvidia-smi -L中的顺序) - 确认进程归属用户:
ps -o pid,user,comm -p [PID]
权限问题常被忽略:普通用户需在 video 或 render 组,且 /dev/nvidia* 设备节点权限必须为 c 195,* root root;否则报 “NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver”。
想自动化告警?别解析表格,用 --query-gpu 输出结构化数据
靠人眼扫表格做阈值判断不可靠,脚本应直接消费机器可读格式:
- 导出温度和利用率:
nvidia-smi --query-gpu=temperature.gpu,utilization.gpu --format=csv,noheader,nounits - 导出显存占用和所属用户:
nvidia-smi --query-compute-apps=pid,used_memory,username --format=csv,noheader,nounits - 注意:
--query-gpu不支持同时查进程信息,必须拆成两个命令拼接
最易被忽略的一点:nvidia-smi -q 虽然字段全,但输出是分段文本,不适合管道处理;真要写监控脚本,优先选 --query-gpu + --format=csv,而不是试图用 awk 解析默认表格。











