Ubuntu 26.04 笔记本功耗排查记录
设备:ThinkPad X1 Extreme Gen 5(i7-12700H + RTX 3060)
系统:Ubuntu 26.04
日期:2026-05-31
耗电情况:1小时电量告罄。
文章目录
- [Ubuntu 26.04 笔记本功耗排查记录](#Ubuntu 26.04 笔记本功耗排查记录)
-
- 一、起因
- 二、测量过程
-
- [第一步:尝试 Powertop](#第一步:尝试 Powertop)
- [第二步:尝试 NVIDIA 驱动](#第二步:尝试 NVIDIA 驱动)
- [第三步:尝试 RAPL(Intel 内置功耗测量)](#第三步:尝试 RAPL(Intel 内置功耗测量))
- 第四步:写采样脚本
- [三、关闭 NVIDIA 独显(关键步骤)](#三、关闭 NVIDIA 独显(关键步骤))
-
- 问题:独显一直在耗电
- 解决方法一:切换到纯集显模式(推荐)
- [解决方法二:Runtime PM 自动休眠(不重启)](#解决方法二:Runtime PM 自动休眠(不重启))
- 实际效果
- 四、测量结果
- 五、结论
-
- [34W 正常吗?](#34W 正常吗?)
- [Powertop 的占比有什么用?](#Powertop 的占比有什么用?)
- 六、以后怎么快速查看功耗
- 七、过程中遇到的问题
-
- [问题 1:Powertop 只给占比不给瓦数](#问题 1:Powertop 只给占比不给瓦数)
- [问题 2:重启后 NVIDIA 驱动没加载](#问题 2:重启后 NVIDIA 驱动没加载)
- [问题 3:RAPL 能量值溢出](#问题 3:RAPL 能量值溢出)
一、起因
想看看系统里什么东西在耗电,方便优化。
之前跑了 Powertop,它给了一个报告,里面有占比(%),比如:
| 进程 | 占比 |
|---|---|
| intel_atomic_commit_work | 40.2% |
| Firefox | 10.0% |
| i915_gem_free_work | 8.0% |
但问题是:占比不等于功耗。40% 是什么意思?是 4W 还是 40W?看不出来。
所以决定用其他方法获取真实瓦数。
二、测量过程
第一步:尝试 Powertop
bash
sudo powertop --time=5
结果:只给占比,不给瓦数。放弃。
第二步:尝试 NVIDIA 驱动
bash
nvidia-smi --query-gpu=power.draw --format=csv
结果:9.43 W,独显基本空闲。这个能用。
第三步:尝试 RAPL(Intel 内置功耗测量)
bash
sudo cat /sys/class/powercap/intel-rapl:0/energy_uj # CPU 整包
结果:只能读到累计能量(微焦耳),不是直接的瓦数。
需要自己算:两次读数相减 ÷ 时间间隔 = 功耗(W)
第四步:写采样脚本
bash
#!/bin/bash
E0=$(sudo cat /sys/class/powercap/intel-rapl:0/energy_uj)
E0c=$(sudo cat /sys/class/powercap/intel-rapl:0:0/energy_uj)
E0u=$(sudo cat /sys/class/powercap/intel-rapl:0:1/energy_uj)
E0g=$(sudo cat /sys/class/powercap/intel-rapl:1/energy_uj)
T0=$(date +%s%N)
sleep 3
E1=$(sudo cat /sys/class/powercap/intel-rapl:0/energy_uj)
E1c=$(sudo cat /sys/class/powercap/intel-rapl:0:0/energy_uj)
E1u=$(sudo cat /sys/class/powercap/intel-rapl:0:1/energy_uj)
E1g=$(sudo cat /sys/class/powercap/intel-rapl:1/energy_uj)
T1=$(date +%s%N)
DT=$(( (T1-T0)/1000000 ))
calc() {
local d=$(($2 - $1))
[ $d -lt 0 ] && d=$(( d + 268435456000 ))
echo "scale=1; $d / $DT / 1000" | bc
}
echo "CPU 总包: $(calc $E0 $E1) W"
echo "CPU 核心: $(calc $E0c $E1c) W"
echo "CPU 集显: $(calc $E0u $E1u) W"
echo "独显/其他: $(calc $E0g $E1g) W"
三、关闭 NVIDIA 独显(关键步骤)
问题:独显一直在耗电
重启前测量发现,即使没有运行 3D 程序,NVIDIA RTX 3060 也在耗电(~9W)。
解决方法一:切换到纯集显模式(推荐)
第一步:切换到 Intel 集显
bash
sudo prime-select intel
第二步:停止并禁用 nvidia 持久化守护进程
bash
sudo systemctl stop nvidia-persistenced
sudo systemctl disable nvidia-persistenced
第三步:重启生效
bash
sudo reboot
验证:
bash
prime-select query
# 应该输出: intel
nvidia-smi
# 应该报错:找不到 GPU = 关成功了
解决方法二:Runtime PM 自动休眠(不重启)
如果不想重启,可以让系统自动管理独显电源:
查看独显状态:
bash
cat /sys/bus/pci/devices/0000:01:00.0/power/runtime_status
# suspended = 已休眠 ✓
# active = 没休眠,要处理
cat /sys/bus/pci/devices/0000:01:00.0/power/control
# auto = 自动管理 ✓
# on = 一直开着,要改成 auto
手动切换为 auto 模式:
bash
echo "auto" | sudo tee /sys/bus/pci/devices/0000:01:00.0/power/control
TLP 已配置自动管理:
bash
grep RUNTIME_PM /etc/tlp.conf
# RUNTIME_PM_ON_AC=auto
# RUNTIME_PM_ON_BAT=auto
实际效果
- 方法一(prime-select):重启后独显完全关闭,节省约 9W 功耗
- 方法二(Runtime PM):独显空闲时自动休眠,节省约 9W 功耗
四、测量结果
重启前(系统运行一段时间,空闲状态)
| 组件 | 功耗 |
|---|---|
| CPU 整包 | ~10 W |
| NVIDIA RTX 3060 | ~9 W |
| 合计 | ~20 W |
重启后(刚开机,系统服务启动中)
| 组件 | 功耗 |
|---|---|
| CPU 核心 | 8.7 W |
| Intel 集显 | 25.4 W |
| NVIDIA RTX 3060 | 已休眠(不耗电) |
| 合计 | ~34 W |
为什么重启后反而更高?
刚重启时,系统服务还在启动(load average: 1.63),CPU 和集显都在干活。等几分钟系统稳定后,功耗会降下来。
五、结论
34W 正常吗?
正常。对比一下:
| 设备 | CPU+GPU 功耗 |
|---|---|
| MacBook Air M2 待机 | 2-3W |
| Intel N100 小主机 | 5-8W |
| 你的 i7-12700H | ~34W |
| 游戏本满载 | 80-150W |
i7-12700H 有 14 核 20 线程,光集显驱动屏幕就要 ~25W。这个配置天生比低功耗设备高,不是坏了。
Powertop 的占比有什么用?
占比能告诉你哪个组件相对最耗电 ,但不能告诉你绝对功耗是多少。
比如 Powertop 说 GPU 占 40%,你不知道是 4W 还是 40W。用 RAPL 才能知道真实数字。
六、以后怎么快速查看功耗
bash
# 方法一:看累计能量(微焦耳),自己算
sudo cat /sys/class/powercap/intel-rapl:0/energy_uj
# 方法二:看温度(间接判断)
sensors
# 方法三:看 NVIDIA 独显功耗(如果有)
nvidia-smi --query-gpu=power.draw --format=csv
# 方法四:看系统负载(判断是否在忙)
uptime
如果想知道具体瓦数,用上面的 RAPL 脚本跑一下就行。
七、过程中遇到的问题
问题 1:Powertop 只给占比不给瓦数
解决: 用 RAPL 接口读取累计能量,自己算功耗。
问题 2:重启后 NVIDIA 驱动没加载
bash
nvidia-smi
# 报错:couldn't communicate with the NVIDIA driver
原因: 刚重启时驱动还没加载完,或者系统用了 nouveau 驱动。
解决: 等一会儿,或者检查驱动:
bash
lsmod | grep nvidia
cat /proc/driver/nvidia/version
问题 3:RAPL 能量值溢出
energy_uj 最大约 268435456000(268kJ),超过会归零。
解决: 脚本里加了溢出处理:
bash
local d=$(($2 - $1))
[ $d -lt 0 ] && d=$(( d + 268435456000 ))
本账号所有文章均为原创,欢迎转载,请注明文章出处:https://shandianchengzi.blog.csdn.net/article/details/161573293。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。