Linux 笔记本电源管理资料合集

六月 13, 2024 更新: 一月 16, 2025 [Linux 与系统] #Linux #obsidian #发行版 #合集 #桌面应用 #硬件

Linux TLP 电源管理教程

Linux 的电源管理基础是内核,只要发行版不离谱,功能都是一样的。不过不是所有发行版都默认开启电源管理服务,也就是 TLP ,开启后的续航应该与 Windows 不相上下。

以下教程起初是我贴在 openSUSE 中文社区论坛上,后来寒晶雪把他搬到 openSUSE Wiki 作了拓展与修正,我又从 Wiki 复制到知乎,现在又从知乎转到我的博客。对安装软件的命令稍作修改亦可用于其他发行版。实测在正常使用下可以把我笔记本(标压 CPU )整体功耗压缩到 9.94 瓦。

引言

如果你是第一次在笔记本上安装 openSUSE ,它的表现可能偏离你的预期。不止一人表示 Linux 比 Windows 更加节省资源,但对于你来说,电池使用时间比起 Windows 大幅下降可不是节省资源的表现。在你决定回到 Windows 前,先冷静一下,你只是忘记告诉内核 “你该省电” 这个事实而已。

这确实算是个坏消息:本文的核心部分将在命令行下完成。不过别担心,配置完成后这些工具将会自动运行。然后你就可以忘掉这茬,享受与 Android 等嵌入式设备同源且智能的省电策略,直到你重新安装系统或者换新笔记本为止。

TLP 是什么

TLP 是一个功能丰富的 Linux 命令行工具,无需深入研究技术细节就能节省笔记本电池电量。

TLP 的默认设置已经针对电池寿命进行了优化,所以你可以直接安装并忘记它。然而,TLP 是高度可定制的,以满足你的具体要求。

TLP 是如何工作的

TLP 的基本工作原理是调整影响功耗的内核设置(kernel settings)。

什么是 kernel settings

首先,内核设置(kernel settings)是不稳定的。它们的状态在运行时被保存在 RAM 中,内核没有为它们提供持久性。在启动时,内核创建了一个默认的状态,每次启动时都必须通过用户空间的工具重新应用这些改变。TLP 就是这样一个用户空间的工具。

简短指南

如果你觉得正文“太长不看”,你可以直接执行以下命令启用 TLP,使用默认配置,然后忘掉TLP的存在。

sudo zypper in tlp powertop
sudo systemctl disable powertop
sudo systemctl disable tlp
sudo systemctl stop powertop
sudo systemctl stop tlp
sudo systemctl enable tlp

快速开始

安装

我们需要两个工具:TLP 与 PowerTOP 。在大多数情况下,openSUSE 已经在你的设备上安装了他们,作为 laptop 软件包模组的一部分。如果的确没有安装,使用如下命令行可以简单地安装他们。

sudo zypper in tlp powertop

CPU 功耗

CPU 的耗电大体符合以下公式:

功率 = 电容率 × 电压的平方 × 频率

功率代表能耗(Power),而电容率(Capacitance),与 CPU 的制程和工艺等相关,在 CPU 出厂时就已经确定下来。那么我们能改变的只有电压与频率,而频率与电压成正相关。所以当 CPU 在很高的频率上运行时,效能很高但耗电量很大。如果我们能在 CPU 运算量不大时,让它降频运行,这样我们就可以减少功率,同时我们可以降低电压,节约能源,并减少发热与风扇噪音。

Linux 下调整 CPU 的模块叫 CPU 调速器(Governor),Android 等基于 Linux 的嵌入式平台都会使用 CPU 调速器达到省电的效果,同样,你也能。

如果你有 Android 平台的 CPU 调速器使用经验,请不要试着直接限制 CPU 的频率,那是在 ARM 平台上才有效的做法,在 X86 平台下对减轻能耗帮助甚微。

较新的 Intel CPU 使用 intel_pstate 驱动,只支持两种调速器:

配置

建议使用 TLP 管理电源,PowerTOP 仅作为监测工具使用,所以以下配置均基于 TLP。

首先,禁用相关服务:

sudo systemctl disable powertop
sudo systemctl disable tlp
sudo systemctl stop powertop
sudo systemctl stop tlp

TLP 的配置文件存在于两个位置:

你可以自由决定配置文件存放的方式,但建议使用配置文件夹,将属于不同部分的配置放入不同的文件。

创建一个自定义的配置文件(官方的配置介绍详见:TLP Settings):

cd /etc/tlp.d/
sudo touch 01-cpu.conf

编辑文件:

sudo nano /etc/tlp.d/01-cpu.conf

具体的配置文件

在直流电源与电池供电情况下都使用 powersave 调速器。X86 平台的 powersave 调速器不会限制你的最高频率,只是更加谨慎地增加频率,并在负载下降时更加积极的回到低频率。TLP 的开发者并不建议更改为其他调速器。

CPU_SCALING_GOVERNOR_ON_AC=powersave
CPU_SCALING_GOVERNOR_ON_BAT=powersave

以下两项配置决定了 CPU 的能源策略,在电池模式下省电,而在外部电源供电模式下偏向性能:

CPU_ENERGY_PERF_POLICY_ON_AC=balance_performance
CPU_ENERGY_PERF_POLICY_ON_BAT=power

使用以下两项配置在电池供电时禁用自动超频,也就是关闭睿频:

CPU_BOOST_ON_AC=1
CPU_BOOST_ON_BAT=0

以下两项配置会在电池模式下根据负载自动缩减 CPU 核心数。

SCHED_POWERSAVE_ON_AC=0
SCHED_POWERSAVE_ON_BAT=1

AMD 与旧款 Intel

AMD 与旧款 Intel 使用 acpi-cpufreq 驱动,故部分设置与 Intel 不同。这里仅仅贴出配置文件内容,建议阅读 TLP 官方文档以了解配置内容含义。

/etc/tlp.d/01-cpu.conf
---------
CPU_SCALING_GOVERNOR_ON_AC=ondemand
CPU_SCALING_GOVERNOR_ON_BAT=ondemand
CPU_BOOST_ON_AC=1
CPU_BOOST_ON_BAT=0
SCHED_POWERSAVE_ON_AC=0
SCHED_POWERSAVE_ON_BAT=1

USB 自动挂起设备

TLP 利用内核设置,自动将不使用的 USB 设备挂起以节电。

/etc/tlp.d/02-usb.conf
---------
USB_AUTOSUSPEND=1

ACPI 高级电池管理

基于内核的 natacpi 模块,部分笔记本(如部分 ThinkPad 系列与部分 Dell)电脑可以手动管理电池充电百分比。无需安装额外的 ACPI 模块。

/etc/tlp.d/03-battery.conf
---------
START_CHARGE_THRESH_BAT0=80
## 开始充电阈值
STOP_CHARGE_THRESH_BAT0=85
## 停止充电阈值

收尾

按 CRTL + O 写入配置文件,然后 CRTL + X 关闭编辑面板

启动服务:

sudo systemctl start tlp

检查服务状态:

sudo systemctl status tlp

让 TLP 开机自启动:

sudo systemctl enable tlp

检查是否成功:

sudo systemctl is-enabled tlp

然后你就可以像我说的,忘掉这件事了。

Powertop

powertop 是个很好的实时监测工具,你只需要运行 sudo powertop 就可以获得相对友好的输出。

它可以显示特定进程与设备的耗电量。用 tab 在不同的标签页中切换。你看,我的电脑此刻的耗电速率为 9.94 瓦,甚至不及一个树梅派 4(5 伏 3 安即 15 瓦)。不过 不要 听从 PowerTOP 关于省电的建议,也不要在 systemd 上启用他—— TLP 做的比他更好。同时 tlp-stat 命令也会输出有用的信息。

参考&外链

linux下使用笔记本的相关设置

无线连接

Wi-Fi

一般地,安装linux-firmware 即可,许多发行版会默认安装此包,如果安装主流的桌面环境,也会自动安装它。

还可以尝试linux-firmware-iwlwifi(也可能名为firmware-iwlwifi) ,此软件包为intel相关网卡驱动。

一些网卡可能需要寻找相应的驱动,可到其官网寻找支持,或者以网卡名、具体型号加firmware作为关键字搜索解决方案。可使用lspci | grep Network查看具体显卡情况。

其他解决思路:换网卡;使用免驱动安装的usb网卡。

蓝牙

一般地,安装bluez即可,一些发行版会默认安装此包,如果安装主流的桌面环境,也会自动安装它。

特别的驱动解决思路参考上文“wi-fi”。

可以参考这篇文章- archwifi-蓝牙


rfkill:某些情况下,wifi或者蓝牙被关闭(尤其是硬关闭)但是又找不打开的方法,可以使用rfkill这个工具解决,常用命令:

rfkill list    #查看所有无线设备的状态rfkill unblock all    #启用所有设备rfkill --help    #查看rfkill相关命令

触摸板

一般安装桌面环境(如gnome、plasma等等)会自动安装上触摸板相关驱动;如果使用的一些窗口管理器(如i3wm、awesom)则可能需要自行安装。

安装驱动 xf86-input-synaptics

如果从其他桌面环境改用gnome作为桌面环境,则要用libinput 替换掉 xf86-input-synaptics (GNOME 目前不再支持 synaptics),卸载掉 xf86-input-synaptics。

电源管理

电源管理工具

电源相关行为的响应动作

这些行为及响应动作多能在桌面环境的电源管理工具中进行设置,参看综合型电源管理工具

按键和盖子的响应动作

针对按下电源相关按钮(如挂起/休眠/电源等按键)和盖上笔记本盖子等行为而响应的电源动作。

systemd 能够处理某些电源相关的事件,编辑/etc/systemd/logind.conf 可进行配置,其主要包含以下事件:

取值可以是 ignore、poweroff、reboot、halt、suspend、hibernate、hybrid-sleep、lock 或 kexec。

其中:

注意,系统默认设置为:

HandlePowerKey=poweroff    #按下电源键关机HandleSuspendKey=suspend    #按下挂起键挂起(暂停)HandleHibernateKey=hibernate    #按下休眠键休眠la=suspend    #盖上笔记本盖子挂起

例如要设置盖上笔记本盖子进行休眠,在该文件中配置:

HandleLidSwitch=hibernate

保存文件后,执行 systemctl restart systemd-logind 使其生效。

注意:一些Linux发行版可能需要自行对休眠进行配置,参考后文**休眠配置**,或者借助pm-utils之类的工具实现。 桌面环境带有的电源管理工具能管理上述(部分)动作的电源响应事件。

电池低电量的响应动作

如希望在电池电量极低的时候自动关机,可以通过修改/etc/UPower/UPower.conf相关配置,示例,在电量低至%5时自动休眠:

PercentageLow=15  #<=15%低电量PercentageCritical=10  #<=10%警告电量PercentageAction=5  #<=5%执行动作(即CriticalPowerAction)的电量CriticalPowerAction=PowerOff #(在本示例中是电量<=5%)执行休眠

CriticalPowerAction的取值有Poweroff、Hibernate和Hybid-sleep。

更多配置项参考该文件中的说明。

处理器调整

使一般是降低频率以减少发热,同时降低风扇转速以减少噪音,并提升笔记本的电池续航时间。

在/sys/devices/system/cpu目录下有着cpu相关信息。

如intel处理器的设备,其系统在/sys/devices/system/cpu/intel_pstate 目录下(可能存在)的文件规定着cpu运行频率相关参数,如:

调频工具

cpupower属于Linux内核工具系列,但有的发行版不一定会默认安装。

执行cpupower frequency-info 可查看到相关信息,cpupower set可进行频率设置。

一般搜索cpupower、freq、cpu加freq等关键字可以找到此类工具。

示例:使用cpupower控制频率

编辑/etc/default/cpupower,找到min_freq.max_freq 这两行,去掉其注释的#, 填写好频率并保存

min_freq="0.25GHz"    #最小频率max_freq="2.5GHz"    #最大频率

执行systemctl enable cpupower.service 使其生效。

关闭睿频

可使用命令 :cat /sys/devices/system/cpu/intel_pstate/no_turbo 查看睿频开启状态,如果显示0则表示开启睿频,显示1则表是关闭睿频。(intel)

一些关闭睿频的方法:

intel_pstate

休眠配置

如果桌面环境无休眠相关选项,可参考以下方法手动配置。

  1. 合适大小的swap 休眠(hibernate)需要将内存中的内容写入磁盘的swap,如果swap大小比当前休眠所需空间小,则无法保证能够正确地休眠。具体的swap的大小根据个人使用情况(要休眠时的内存占用)而定。

  2. 在bootloader 中增加resume内核参数 假如使用swap文件为/home/swap,需要编辑/etc/default/grub 文件,在GRUB_CMDLINE_LINUX_DEFAULT中添加resume=/home/swap,让系统在启动时读取swap分区中的内容。(如果使用swap分区,则resume对应的为swap的盘符,例如/dev/sdc) 例如该行的原有内容是:

    GRUB_CMDLINE_LINUX_DEFAULT=”quiet intel_pstate=enable”

    添加resume参数后就是:

    GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_pstate=enable resume=/home/swap"

    然后更新 grub 配置 grub-mkconfig -o /boot/grub/grub.cfg

  3. 配置 initramfs的resume钩子 编辑/etc/mkinitcpio.conf,在HOOKS行中添加resume钩子,例如该行原有内容是:

    HOOKS="base udev autodetect modconf block filesystems keyboard fsck"

    添加resume后就是:

    HOOKS="base udev resume autodetect modconf block filesystems keyboard fsck"

    注意:如果使用lvm分区,需要将resume放在lvm2后面,示例:

    HOOKS="base udev autodetect modconf block lvm2 resume filesystems keyboard fsck"

    重新生成 initramfs 镜像: mkinitcpio -p linux

显卡管理

amd使用开源mesa(无需额外配置)即可,以下描述中的独显均指Linus钦点的F**k Nvidia,且只讨论显卡用于图像输出的问题。

参看archwiki-NVIDIA

显卡切换Optimus

archwiki-NVIDIA_Optimus

Nvidia Optimus技术可根据需求在集成GPU和Nvidia GPU之间实时无缝切换,已达到节能省电的目的(因此在笔记本电脑上有使用该技术的需求),但在Linux下该功能的实现效果较差。

如果BIOS支持选择输出显卡,可在BIOS中选择使用指定卡(但不是所有设备都具有该功能),例如只使用集成显卡或独立显卡。

目前Optimus可选方案:

linux笔记本电池管理,Linux系统笔记本电源管理方法实用指南

Linux是一种性能优越的开源操作系统,随着其性能和知名度越来越高,最主要的是在价格上无与伦比的优势,许多厂家开始推出Linux笔记本电脑,并且这种趋势大有愈演愈烈之势。我们知道,笔记本受到电池续航时间的限制,所以特别注重机器的电源管理。因此,本文将讨论如何处理这些事项。

一、概述

实际上,除了利用主板上的BIOS来管理电源外,大多数Linux系统本身都自带了管理电源的实用工具软件,来处理各种电源事件,如:

1.电池电量不足--这时机器会发出警告,并显示相应图标,或者将硬件挂起。

2.闲置--如果在一段时间内机器一直处于非活动状态,那么可以让机器休眠(如关闭硬盘以及停用音频及网络等服务)从而有效延长电池供电时间。

通过检测你的笔记本使用的是交流电源还是电池,可以让机器进入相应的电源管理模式。在Fedora中,用于管理和检修电源问题的工具有:

1.高级电源管理(APM)--APM软件组成如下:一个pmd守护进程,用来监视电池的使用情况;多个实用工具软件,用来显示和响应电池事件。它们包含于apmd软件包中。

2.高级配置和电源接口(ACPI)--acpid事件守护进程一方面监视电源事件,另一方面用来设置响应这些事件的规则,这些规则用来关闭某些硬件或关掉系统电源等。ACPI是一款设计用来替代APM电源管理的更具通用性的工具软件,但是目前它还需进一步完善。

3.hdparm命令--hdparm命令可用于打开和关闭电源管理功能。另外,该命令还有许多选项,完成诸如停止硬盘启动器转动或让硬盘进入待机状态等操作。

需要说明的是,使用ACPI时,是操作系统在负责电源管理,而不是BIOS。尽管ACPI在管理电源问题方面功能更强也更灵活,但是,普通用户用起来却不是那么方便,如使用ACPI时,你必须亲自告诉它要关注哪些电源事件以及如何响应这些事件。目前,对一般用户而言,APM的功能不但丰富,并且对用户也更加友好。

下边我们将针对以上三种常见的电源管理工具分别加以讨论。

二、用APM管理电源

在Fedora中,可以配置APM,让其检测某些电源事件并做出响应。这时,它运行守护进程/usr/sbin/apmd来侦听事件,然后根据配置文件/etc/sysconfig/apmd 中的有关规定来处理这些事件。要配置运行APM,输入下列命令:

chkconfig apmd on

service apmd restart

注意:apmd和acpid不能同时使用,所以,如果此前系统正在使用acpid的话,应该先停用它,具体命令如下:

chkconfig acpid off

service acpid stop

APM成功启动后,在文件/var/log/messages中应该看到一则消息,指出该服务已启动,并列出当前电池的电量状况。默认时,pmd守护进程根据文件/etc/sysconfig/apmd 中的设置运行。我们可以列出当前运行的进程来查看运行中的apmd的使用了哪些选项:

ps ax | grep apmd

/usr/sbin/apmd -p 10 -w 5 -W -P /etc/sysconfig/apm-scripts/apmscript

根据以上命令中列出的选项,apmd守护进程将会:

1.记录电池电量的变化--如果电量变化超过10%或更多,守护进程将向系统日志文件(默认时为/var/log/messages)发出一条消息。这一行为是由选项"-p 10"指定的。

2.记录电池电量不足--当电池电量低于5%并且仍未充电时,一条警告消息将发送到系统日志文件中。这一行为是由选项"-w 5"指定的。

3.提醒用户--如果电池电量低于"-w"选项所设定的值,将向所有登录系统的用户发送警报。此行为是由选项"-W"指定的。

4.利用apmscript响应事件--出现电源事件时,apmd将这些事件转给设定用于响应这些事件的脚本。根据上面的命令,运行的脚本应该是/etc/sysconfig/apm-scripts/apmscript。所用的文件取决于选项"- P"。

linux系统电源管理之常用工具_upower

目录

综述

TLP

tlp stat

采用新版本(V1.3.1)

upower

powertop

用新版本工具(V2.14)

可调整参数

CPU 频率信息

CPU IDLE信息

s-tui

采用新版本(V1.1.1)

Slimbook Battery


本系列用于记录linux电源管理一些资料收集及实验过程。

综述

TLP 用于调控笔记本各项参数,以达到节约电能的目的。主要注意采用新版本支持新硬件。

powertop 可以监控 系统的进程占用的cpu时间比、CPU的频率变化、idle时cpu的状态、总线及外设电源管理的配置、后台定时线程的唤醒时间等配置。此外可以针对以上信息进行调节。

Stress-Terminal UI, s-tui, monitors CPU temperature, frequency, power and utilization in a graphical way from the terminal.

目前以上几个工具 在CPU方面主要以intel为主,虽然powertop在宣称上支持ARM,但也需要arm厂商实际适配了内核的cpufreq cpuidle的驱动,将相关sys接口暴露出来才可以。

因为以上几个工具在使用时,要针对各个工具的配置项进行确认,最终整理输入一个工具支持的硬件集合列表。

TLP

工具主要依赖shell脚本实现。

https://www.cnblogs.com/ManWingloeng/p/12373806.html

https://github.com/d4nj1/TLPUI 图形调参

https://github.com/linrunner/TLP 源码 shell,可以研究设置了哪些。

https://linrunner.de/tlp/introduction apt install tlp tlp-rdw

https://www.2daygeek.com/tlp-increase-optimize-linux-laptop-battery-life/ 老外写的分项命令。

tlp stat

TLP配置

系统信息、启动参数、BIOS版本

CPU型号、CPU调频信息(和笔记本型号、CPU型号强相关)

CPU温度及风扇信息 和笔记本型号、CPU型号强相关)

文件系统 中关于dirty的配置参数信息

磁盘的信息(smart,对于NVME盘的信息不能有效获取)

AHCI 连接电源管理的策略信息(SCSI控制器)

AHCI Host控制器 Runtime 电源管理的策略配置信息

PCIE ASPM配置策略

无线接口(蓝牙、wifi、wwan)开关状态

audio设备电源管理策略

Runtime Power Management(各种外设power的始终开、还是自动调节)

USB设备电源管理

电池状态

采用新版本(V1.3.1)

make

make install 即可安装新版本

./tlp-stat -s

--- TLP 1.3.1 --------------------------------------------

+++ System Info

System = IPASON

BIOS = 5.1。

upower

upower -d

Device: /org/freedesktop/UPower/devices/battery_BAT1

native-path: BAT1

vendor: Sunwoda-H

model: HB4692Z9ECW-41

serial: 44901

power supply: yes

updated: 2021年04月25日 星期日 11时14分32秒 (69 seconds ago)

has history: yes

has statistics: yes

battery

present:             yes

rechargeable:        yes

state:               discharging

warning-level:       none

energy:              48.3154 Wh

energy-empty:        0 Wh

energy-full:         56.0012 Wh

energy-full-design:  55.2372 Wh

energy-rate:         9.3208 W

voltage:             16.398 V

time to empty:       5.2 hours

percentage:          86%

capacity:            100%

technology:          lithium-ion

icon-name:          'battery-full-symbolic'

History (rate):

1619320472 9.321 discharging

powertop

此是C /C++ 代码实现的工具

sudo apt install powertop (2.8版本 2015年)

program to analyze power consumption on Intel-based laptops

https://zhuanlan.zhihu.com/p/57365414

https://www.w3cschool.cn/working_on_gnu_linux/working_on_gnu_linux-jugs27nu.html

powertop --html=report.html

https://www.2daygeek.com/powertop-monitors-laptop-battery-usage-linux/ **** 老外用的记

、

用新版本工具(V2.14)

在ARM上编译时还安装了如下两个包:

sudo apt install libncurses-dev

sudo apt install g++

./autogen.sh

./configure

usr/bin/ld: powertop-main.o: undefined reference to symbol 'pthread_join@@GLIBC_2.2.5'

/usr/bin/ld: //lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line

collect2: error: ld returned 1 exit status

修改powertop-2.14/src/Makefile: 由LDFLAGS = 修改为 LDFLAGS = -lpthread

make

src/powertop为编译生成的二进制。

新版本不止可以看到CPU Freq,其余几个tab的内容也更丰富准确

可调整参数

📄 [图片文字版] PowerTOP Tuning 页待优化项与脚本:vm 回写间隔改 1500(/proc/sys/vm/dirty_writeback_centisecs);SATA 链路电源 min_power;USB 自动挂起 power/control 写 auto;关 NMI watchdog;PCI 设备 Runtime PM 写 auto;网卡 ethtool -s enp2s0 wol d。System 389.0 wakeups/s。

CPU 频率信息

CPU IDLE信息

可以看出CPU 处于cX状态的占比。比如用stress -c 2 压测时,可以看到两个cpu 一直处于C0状态。其他C态,是intel cpu分别关闭cpu某些组件的状态描述。

s-tui

sudo apt install python-pip stress (为2018年11月 0.8.3版本,最新版本是2021-02 V1.1.1

https://www.jianshu.com/p/16925fc6eaa1

实际测试,根据官网 https://github.com/amanusk/s-tui的命令sudo apt install s-tui 安装后才能正常使用命令s-tui

The tool was tested to run onX86 (Intel/AMD) as well asARM systems. For example,s-tui can run on Raspberry-pi and other single board PCs

功能: Monitoring your CPU temperature/utilization/frequency/power

采用新版本(V1.1.1)

pip install urwid

s-tui-1.1.1$ python -m s_tui.s_tui

Slimbook Battery

https://launchpad.net/~slimbook/+archive/ubuntu/slimbook

https://ubuntuhandbook.org/index.php/2020/06/improve-battery-life-ubuntu-20-04-lts/

首先安装工具 add-apt-repository:

sudo apt-get install software-properities-common

sudo add-apt-repository ppa:slimbook/slimbook

sudo apt update

sudo apt install slimbookbattery

桌面应用|TLP:一个可以延长 Linux 笔记本电池寿命的高级电源管理工具

笔记本电池是针对 Windows 操作系统进行了高度优化的,当我在笔记本电脑中使用 Windows 操作系统时,我已经意识到这一点,但对于 Linux 来说却不一样。

多年来,Linux 在电池优化方面取得了很大进步,但我们仍然需要做一些必要的事情来改善 Linux 中笔记本电脑的电池寿命。

当我考虑延长电池寿命时,我没有多少选择,但我觉得 TLP 对我来说是一个更好的解决方案,所以我会继续使用它。

在本教程中,我们将详细讨论 TLP 以延长电池寿命。

我们之前在我们的网站上写过三篇关于 Linux 笔记本电池节电工具 的文章:PowerTOP 和 电池充电状态。

TLP

TLP 是一款自由开源的高级电源管理工具,可在不进行任何配置更改的情况下延长电池寿命。

由于它的默认配置已针对电池寿命进行了优化,因此你可能只需要安装,然后就忘记它吧。

此外,它可以高度定制化,以满足你的特定要求。TLP 是一个具有自动后台任务的纯命令行工具。它不包含GUI。

TLP 适用于各种品牌的笔记本电脑。设置电池充电阈值仅适用于 IBM/Lenovo ThinkPad。

所有 TLP 设置都存储在 /etc/default/tlp 中。其默认配置提供了开箱即用的优化的节能设置。

以下 TLP 设置可用于自定义,如果需要,你可以相应地进行必要的更改。

TLP 功能

如何在 Linux 上安装 TLP

TLP 包在大多数发行版官方存储库中都可用,因此,使用发行版的 包管理器 来安装它。

https://linux.cn/article-10848-1.html

调试 Linux 设备电源管理,解决笔记本发热和续航问题

长期以来,在笔记本上装 Linux 都会面临发热和电池续航下降(相比于在同一台笔记本上装 Windows)的问题。这个主要是驱动的电源管理不完善,很多设备的省电功能没有启动造成的。不过最近随着主要的厂商(Intel, AMD, Qualcomm 等)拥抱开源,主动编写开源驱动,大部分问题都得到了解决。但由于还是有 bug 存在,并且电源管理的 bug 很容易造成整个系统 hang up, 所以发行版一般都把策略配置得比较保守。现在一般在接入电源是都会停用大部分电源管理功能,使用电池供电时才会启用。这样插电运行的时候就还是发热和耗电很厉害;而如果电源管理有 bug, 就会出现插电运行一切正常,不插电就 hang up 的现象。

前段时间在一台 ThinkPad p15 gen2 上装了 Linux, 就遇到了这个问题,断断续续调了很久,才解决问题。感觉这里的调试方法有参考意义,这里记录一下调试问题的过程。

背景

ThinkPad p15 gen2 是一个使用 Intel Core CPU 和 Nvidia Quadro 专业显卡的图形工作站。作为图形工作站,它的显卡接口连接方式和一般的笔记本不同。一般的笔记本是核显连接显示输出,独显只能做计算渲染,渲染结果拷贝回核显再进行输出。现在大多数的显卡切换方案,也是按照这个设计来的。但这台笔记本是 intel 核显连接内置显示屏,nvidia 独显连接外置显示屏。这个配置很难配好能适应各种情况的切换方案,由于我主要是连接外置显示器工作的,就在 UEFI 里面把核显禁用了,只用独显。只有在长期出差,没有外置显示器的情况下,才会使用核显。

除了显卡的问题,另外一个更严重的问题就是,这台机器在不接电源的时候,就会在开机进入桌面环境后不久就 hang 住,连关机都关不了,只能按 alt + sysrq + reisub 重启。由于这个机器的网卡声卡什么全都是 intel 的,就只有显卡和 NVMe 硬盘是第三方品牌,我就直接怀疑这两个设备有问题,把它们的电源管理禁用。但问题并没有解决,最后只好把全部 PCIe 设备的电源管理关掉,才没有问题。不过这样就完全没有续航了,2 个小时就耗尽电池。

在这期间,我还遇到了 type-c 供电驱动程序的 bug, 表现也是系统 hang up. 多个问题交织到一起更加增大了调试难度。

x86 电源管理概况

x86 平台上的电源管理大概分为 3 部分:

  1. CPU 电源管理:包括 freqency scaling, C-state 这些
  2. 平台电源管理:包括待机、休眠、关机、唤醒、电池充放电管理这些
  3. 外设设备的电源管理:目前的 x86 上的外设设备主要就分为 PCIe 和 USB 两大类

其中,CPU 就只有 Intel AMD 两家,并且文档资料齐全,厂商也支持开源驱动开发,电源管理支持得非常好。平台这块则是 firmware 通过 ACPI 向系统提供接口。这里台式机一般没有问题,但笔记本由于多了合盖检测、背光、电池这些,更加复杂,出问题的可能性比较大,不过老牌厂商,如 ThinkPad, Dell 这些,都经过了内核驱动和 ACPI 固件的长期磨合,一般也问题不大。外设设备中,USB 的规范比较具体,比如 HID 键盘鼠标、摄像头、U 盘这些都有通用协议和驱动(比如通用的 Mass Storage 驱动就可以适用于所有品牌的 U 盘),也不容易出问题。问题最大的就是 PCIe 设备,这类设备都是显卡、网卡这类的复杂设备,固件和驱动都很复杂,如果有 bug, 就很容易造成内核错误。

PCIe 设备电源管理

PCIe 设备的电源管理有统一的规范和通信协议。一个设备的电源状态分为 D0, D1, D2, D3 4 个状态。其中 D0 是完全启动正常工作,D3 是最深的省电状态。这两个状态是所有设备都要支持的,D1 和 D2 是可选的。CPU 可以通过写入设备的配置寄存器来改变电源状态。PCIe 设备在进入省电状态时,会关闭一部分电路,缓存、寄存器之类的状态信息可能会丢失。这样,在唤醒设备时,就需要重新初始化这部分状态。这需要驱动的密切配合,如果这个过程有 bug, 设备就会进入一个非预期的状态,驱动无法正常和设备通信,就会造成 hang up 之类的问题。

Linux 下的配置

内核

Linux 下,每个 PCIe 的电源管理 RUNTIME_PM 可以通过 sysfs 中的开关 /sys/bus/pci/devices/<address>/power/control 单独开启或关闭。开关的值可以是

用户空间

有个 tlp 命令可以根据 /etc/tlp.conf 中的配置来调整 sysfs 中的各个开关。在多数发行版中,这个命令会通过 udev 规则来触发,在启动过程中、插拔电源的情况下执行。在多数发行版的默认配置中,tlp 会在电池运行时打开 更多省电功能。

另外有个命令是 Intel 开发的 powertop. 这是一个 TUI 应用,可以监控 CPU 的电源、外设状态,以及调整 sysfs 中的电源管理开关。

tlp 适合保存长期、持久化的配置,而 powertop 适合在调试过程中来使用。

调试过程

这台笔记本最严重的问题就是拔掉电源、电池供电时,会随机 hang 住。例如,不插电源开机,一般是可以正常进入桌面环境,但进入桌面环境后,尝试启动一个应用,如 firefox, 就会启动不了。这个时候其它部分看起来都是正常的,但在终端里尝试 kill 掉 firefox, 也会卡住。尝试执行 sudo journcalctl -k 或 dmesg 来检查日志也会卡住。甚至执行 sudo reboot 也会卡住。

这种已经启动的程序运行正常,新程序无法启动的问题,让我地第一时间怀疑问题是硬盘 I/O 相关的,于是第一时间通过 tlp 禁用了 NVMe 的电源管理,但是没有效果。考虑到 N 卡是闭源驱动,也禁用了电源管理,也没有效果。

这个时候我还不太了解 powertop 这个工具,就开始对比 tlp 的配置在电源供电和电池供电的状态下有哪些区别。最明显的区别就是,插电状态的默认 PCIe 电源管理是 on, 电池状态是 auto. 这里我把电池状态也改成 on 后,问题基本解决。

但这只能算是个能用的方案。在没有开启设备省电的情况下,机器发热比较厉害,并且电池续航只有大概 2.5 小时。

为什么说是基本解决呢?

因为这里还穿插了一个 type-c 供电驱动的 bug, 这个 bug 和 PCIe 电源管理的 bug 混在一起,很难调试。但根据最后的结论,这里关闭 PCIe runtime power management 后,就没有因为 PCIe 设备导致 hang up 的问题了。

这个 type-c bug, 会导致 kernel oops. 在过了一个多月,这个 kernel oops 被修复以后,我才重新找时间去定位 PCIe 的问题。

到了这一步,我能想到的就是通过二分法去查找因为问题的设备,即每次禁用一半设备的电源管理,看看问题还是否复线。但看到除了 NVMe 和显卡,其它设备全都是 Intel 的,我都怀疑是否有多个设备同时有问题,用 tlp 来配置又还是比较麻烦的,这个问题就脱了很久。

直到两个月后,有几天比较闲,我尝试去 powertop 这个工具里去看一下。这就发现 powertop 可以通过 TUI 列出所有外设并 toggle 每个设备的电源管理开关。于是我决定在插电运行,默认关闭所有 PCIe 设备电源管理的情况下,一个个打开电源管理开关,看看什么时候会出故障。

于是一个终端运行 dmesg 看日志,另一个终端开 powertop. 首先把我没有用的设备打开,看了一下,好像完全没用的就只有有线网卡。按下 Enter 打开电源管理,系统立刻表现出异常,过了十几秒中,耳机里的音乐也停了。所以这就找到问题了?

重启电脑,在 tlp 里面把有线网卡的电源管理禁用,尝试一下拔掉电源,好像没有出现任何问题。再继续使用电脑,多开几个新应用,也都没有问题。所以引起问题的竟然是一个 Intel 的,我根本没有使用的有线网卡???因为有线网卡这种设备,在我用过的环境中,从来没有出现过问题;Intel 的设备,也是从来没有出现过问题。

后续配置

把有线网卡加入 tlp 黑名单后,在电池模式下开启省电,大概有 5.5 小时的续航,续航时间翻了一倍。后面我顺便把插电状态下的 PCIe runtime power management 也打开了。虽然插电时没有电池续航的问题,但打开电源管理能让空闲时的 CPU 温度降低大约 7 度。

想到这个有线网卡我也用不上,后面我干脆在 UEFI 里面把网卡禁用了。

总结

  1. 如果一个问题只在不插电的时候出现,那么它大概率和省电配置有关,这时应该去配置 tlp.conf.
  2. Intel 的驱动也可能出问题,不能完全信任。
  3. 发行版默认在插电状态下会禁用一下省电配置,如果想要省电/静音/冷却,应该去修改 tlp.conf 把它打开。(包括台式机)
  4. powertop 是个调试省电配置的好工具。