【Ubuntu】GTX 1080 Ti 显卡占用为0但功率高达60W的排查与解决

背景

实验室有一台四卡 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                                                             |
+-----------------------------------------------------------------------------------------+

重点看三个地方:

  1. Perf 一栏是 P0 :P0 是全速运行状态,空闲时应该是 P8。
  2. 功率 54~60W :1080 Ti 真正空闲时一般只有 10~20W。
  3. 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 服务

  1. 先确认程序本身是存在的:

    bash 复制代码
    which nvidia-persistenced

    正常会输出 /usr/bin/nvidia-persistenced。如果什么都没输出,说明程序也没装,apt 方式安装的驱动可以用 sudo apt install nvidia-compute-utils-580 补上。

  2. 创建服务文件。直接复制下面整段到终端执行:

    bash 复制代码
    sudo 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 那一行改成实际路径。

  3. 让 systemd 重新加载配置,再启用服务:

    bash 复制代码
    sudo systemctl daemon-reload
    sudo systemctl enable --now nvidia-persistenced

    看到 Created symlink ... 这一行,说明开机自启已经设置好了。

  4. 检查服务状态:

    bash 复制代码
    systemctl 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 以上,可以按下面的思路继续排查。

  1. 看看有没有后台程序在偷偷访问显卡。nvidia-smi 只会显示占用了显存的进程,像 Docker 容器、GPU 监控 exporter(DCGM、Prometheus 之类)、挂着的 Jupyter 内核这类程序不一定显示出来,用下面的命令可以查到:

    bash 复制代码
    sudo fuser -v /dev/nvidia*
  2. 查看驱动报告的性能状态和时钟设置:

    bash 复制代码
    nvidia-smi -q -d PERFORMANCE,CLOCK

    如果发现 Applications Clocks 或 Locked Clocks 被人手动设置过,可以恢复默认:

    bash 复制代码
    sudo 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 左右。排查的时候记得别开高频监控,不然测到的永远是被"吵醒"的状态。

相关推荐
Fruiticecake2 小时前
epoll 回显服务器是怎么工作的:从 accept 队列到就绪链表,以及它和 select / poll 的区别
linux
莫晓燚2 小时前
阿里云若依项目部署与日志采集---实战
运维·数据库·redis·阿里云·ruoyi
何中应2 小时前
Grafana如何共享面板
运维·grafana·可观测
科创致远2 小时前
ESOP 电子作业指导书 WiFi 网络应用实测报告
运维·服务器·网络
承渊政道2 小时前
Linux网络学习【从NAT与代理服务理解网络转发、探索内网穿透原理、再到认识DNS与ICMP、最后动手部署并测试内网穿透】
linux·网络·学习·内网穿透·dns·nat
重生之小比特2 小时前
【Linux系统】17 库制作与原理(下)
linux·运维·服务器
weixin_450907283 小时前
[ZYNQ Linux] VCU使用
linux·zynq
acd120093 小时前
Nginx 反向代理的缓冲区坑:后端响应大时接口偶发 502
java·运维·nginx
程序员清风3 小时前
AI 编程助手的权限边界:文件、命令、密钥与人工确认
运维·服务器·网络