背景
实验室有一台四卡 1080 Ti 的深度学习服务器,平时主要用来跑训练。某天没任务的时候我随手敲了一下 nvidia-smi,结果发现了一个奇怪的现象:四张卡显存占用全是 0,利用率也是 0,可功率每张都在 55~60W 左右,而且全都处在 P0 最高性能状态。
正常来说显卡空闲时应该降频节能,这个数字明显不对劲。于是我顺着查了一下,最后发现原因很简单,一条命令就能解决。这里把排查过程记录下来,给遇到同样问题的朋友参考。
我的服务器配置如下:
| 配置项 | 详情 |
|---|---|
| 系统 | Ubuntu |
| 显卡 | NVIDIA GeForce GTX 1080 Ti × 4(11GB 显存) |
| 驱动版本 | 580.159.03 |
| CUDA Version(驱动支持的最高版本) | 13.0 |
问题现象
空闲状态下执行 nvidia-smi,输出如下(只截取了关键部分):
(base) user@server:~$ nvidia-smi
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 580.159.03 Driver Version: 580.159.03 CUDA Version: 13.0 |
+-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
|=========================================+========================+======================|
| 0 NVIDIA GeForce GTX 1080 Ti Off | 00000000:03:00.0 Off | N/A |
| 42% 32C P0 60W / 250W | 0MiB / 11264MiB | 0% Default |
+-----------------------------------------+------------------------+----------------------+
| 1 NVIDIA GeForce GTX 1080 Ti Off | 00000000:04:00.0 Off | N/A |
| 40% 38C P0 58W / 250W | 0MiB / 11264MiB | 0% Default |
+-----------------------------------------+------------------------+----------------------+
| 2 NVIDIA GeForce GTX 1080 Ti Off | 00000000:81:00.0 Off | N/A |
| 46% 36C P0 57W / 250W | 0MiB / 11264MiB | 0% Default |
+-----------------------------------------+------------------------+----------------------+
| 3 NVIDIA GeForce GTX 1080 Ti Off | 00000000:82:00.0 Off | N/A |
| 44% 33C P0 54W / 250W | 0MiB / 11264MiB | 1% Default |
+-----------------------------------------+------------------------+----------------------+
| No running processes found |
+-----------------------------------------------------------------------------------------+
重点看三个地方:
- Perf 一栏是 P0 :P0 是全速运行状态,空闲时应该是 P8。
- 功率 54~60W :1080 Ti 真正空闲时一般只有 10~20W。
- Persistence-M 一栏是 Off:这就是问题的关键,下面会讲。
温度(3238°C)和风扇转速(4046%)都正常,说明硬件本身没什么问题。
原因分析
罪魁祸首是 Persistence Mode(持久模式)关闭了。
持久模式关闭时,如果没有程序在用显卡,驱动就会把 GPU 的状态"卸载"掉。这时候一旦有程序来访问显卡(包括 nvidia-smi 本身),驱动就得重新初始化 GPU,显卡会被临时拉到 P0。
也就是说,我每次敲 nvidia-smi,看到的都是显卡刚被"叫醒"那一瞬间的状态,自然一直是 P0 高功耗。
⚠️ 避坑提示 :一开始我以为是读数不准,就用
nvidia-smi -lms 100每 0.1 秒刷新一次去盯着看,结果四张卡一直都是 60W 左右,更迷惑了。其实高频轮询本身就会不停地访问驱动,显卡根本没有机会降到 P8。排查空闲功耗时千万别开高频监控,否则测出来的就是被监控程序"吵醒"的假象。
解决方法
开启持久模式
执行下面这条命令,给所有显卡开启持久模式:
bash
sudo nvidia-smi -pm 1
简单解释一下:
-
sudo:修改显卡设置需要管理员权限 -
-pm:persistence mode 的缩写 -
1表示开启,0表示关闭执行后再敲一次
nvidia-smi,Persistence-M 一栏变成 On 就说明设置成功了。
验证功耗是否恢复正常
先把之前开着的监控全部关掉(在对应终端按 Ctrl + C),然后什么都不做,静置 1~2 分钟,让显卡自己降频。之后执行下面这条命令,只查询一次:
bash
nvidia-smi --query-gpu=index,pstate,power.draw,clocks.sm,clocks.mem --format=csv
这条命令只输出我们关心的几项:显卡编号、性能状态、功耗、核心频率、显存频率。后面没有加 -l 或 -lms,所以查一次就结束,不会打扰显卡。
我这边的输出如下:
index, pstate, power.draw [W], clocks.current.sm [MHz], clocks.current.memory [MHz]
0, P8, 17.16 W, 139 MHz, 405 MHz
1, P8, 9.66 W, 139 MHz, 405 MHz
2, P8, 9.56 W, 139 MHz, 405 MHz
3, P8, 9.07 W, 139 MHz, 405 MHz
四张卡全部进入 P8 ,核心频率降到 139 MHz,显存频率降到 405 MHz,功耗在 9~17W,这就是 1080 Ti 正常的空闲水平了。
💡 0 号卡比其他三张高了几瓦,这在正常范围内,可能是个体差异,也可能是它承担了一些系统层面的轻量工作,不用在意。
设置开机自动开启
注意,nvidia-smi -pm 1 重启后会失效。想让它一直生效,推荐启用 NVIDIA 官方的持久化守护进程:
bash
sudo systemctl enable --now nvidia-persistenced
重启服务器后,用 nvidia-smi 看一下 Persistence-M 是否仍然显示 On 就行。
⚠️ 避坑提示:我第一次执行这条命令时直接报错了:
Failed to enable unit: Unit file nvidia-persistenced.service does not exist.原因是驱动如果是用 NVIDIA 官网的
.run安装包装的,通常只会装上nvidia-persistenced这个程序,不会自动注册成 systemd 服务。遇到这种情况,按下面的方法手动创建服务文件就行。
手动创建 nvidia-persistenced 服务
-
先确认程序本身是存在的:
bashwhich nvidia-persistenced正常会输出
/usr/bin/nvidia-persistenced。如果什么都没输出,说明程序也没装,apt 方式安装的驱动可以用sudo apt install nvidia-compute-utils-580补上。 -
创建服务文件。直接复制下面整段到终端执行:
bashsudo tee /etc/systemd/system/nvidia-persistenced.service > /dev/null << 'EOF' [Unit] Description=NVIDIA Persistence Daemon Wants=syslog.target [Service] Type=forking ExecStart=/usr/bin/nvidia-persistenced --verbose ExecStopPost=/bin/rm -rf /var/run/nvidia-persistenced [Install] WantedBy=multi-user.target EOF如果第 1 步查到的路径不是
/usr/bin/nvidia-persistenced,记得把ExecStart那一行改成实际路径。 -
让 systemd 重新加载配置,再启用服务:
bashsudo systemctl daemon-reload sudo systemctl enable --now nvidia-persistenced看到
Created symlink ...这一行,说明开机自启已经设置好了。 -
检查服务状态:
bashsystemctl status nvidia-persistenced我这边的输出(节选):
● nvidia-persistenced.service - NVIDIA Persistence Daemon Loaded: loaded (/etc/systemd/system/nvidia-persistenced.service; enabled; vendor preset: enabled) Active: active (running) ... server nvidia-persistenced[...]: device 0000:81:00.0 - persistence mode enabled. server nvidia-persistenced[...]: device 0000:82:00.0 - persistence mode enabled. server systemd[1]: Started NVIDIA Persistence Daemon.看到
active (running)和enabled,并且每张卡都有persistence mode enabled,就说明成功了。
💡
systemctl status默认只显示最后 10 行日志,卡多的话前面几张卡的记录可能被挤掉了,并不是没生效。想看完整记录可以用journalctl -u nvidia-persistenced,或者直接看nvidia-smi里每张卡的 Persistence-M 是不是 On。
如果实在装不上这个服务,还有个简单的替代办法:执行 sudo crontab -e,在末尾加一行 @reboot /usr/bin/nvidia-smi -pm 1,让系统每次开机自动开启持久模式。
如果开了持久模式还是降不下来
我这边开启持久模式后就直接解决了。如果你的显卡静置后仍然长时间停在 P0、功耗 50W 以上,可以按下面的思路继续排查。
-
看看有没有后台程序在偷偷访问显卡。
nvidia-smi只会显示占用了显存的进程,像 Docker 容器、GPU 监控 exporter(DCGM、Prometheus 之类)、挂着的 Jupyter 内核这类程序不一定显示出来,用下面的命令可以查到:bashsudo fuser -v /dev/nvidia* -
查看驱动报告的性能状态和时钟设置:
bashnvidia-smi -q -d PERFORMANCE,CLOCK如果发现 Applications Clocks 或 Locked Clocks 被人手动设置过,可以恢复默认:
bashsudo nvidia-smi -rgc sudo nvidia-smi -rac
这个问题有什么影响
说实话,影响不大。60W 只有 1080 Ti 功耗上限(250W)的四分之一左右,温度也很低,对硬件没有损害。主要是浪费电:四张卡每张多耗约 45W,一天下来大约多用 4 度电左右;另外发热和风扇磨损会稍微多一点点。
另外需要说明的是,持久模式只管空闲时的功耗状态,它解决不了训练过程中的显卡报错、掉卡这类问题,那些通常和供电、散热或硬件本身有关,需要另外排查。
补充:Pascal 老卡用户注意 CUDA 版本
顺便提一句,580 系列驱动是 NVIDIA 官方支持 Pascal 架构(1080 Ti 等)的最后一个驱动分支,而 CUDA 13 的工具链已经不再支持为 Pascal(sm_61)编译。
nvidia-smi 右上角显示的 CUDA Version: 13.0 只是驱动能支持的最高版本,不影响使用。但装 PyTorch 等框架时,建议选择基于 CUDA 12.x 构建的版本 ,否则可能遇到 no kernel image is available for execution on the device 之类的报错。
总结
显卡占用为 0 但功率很高、一直处于 P0,大概率是持久模式没开,nvidia-smi 每次查询都把显卡唤醒了。执行 sudo nvidia-smi -pm 1 开启持久模式,再用 nvidia-persistenced 设置开机自启,就能让显卡空闲时正常回到 P8、10W 左右。排查的时候记得别开高频监控,不然测到的永远是被"吵醒"的状态。