使用 tlp 来为 linux 省电

Linux 作为我的主力机已经有快半年时间了,从 ManjaroArchlinux ,从 dwmkde-kwin-tiling,从 Neovim + CoCVSCode-Neovim 插件 ,充分说明了什么叫生命不息,折腾不止,渐渐地我已经完全适应了 Linux 下的生活,也构建起来一套自己的工作流,除了玩游戏,很少再打开磁盘上的 window。

尽管 Linux 的高自定义度非常对我胃口,但对于我这种较新的机器(Lenovo Legion R9000P)来说,硬件驱动始终是个硬伤,就比如最近在 Linux-lts 、nvidia-lts 更新到 5.15.24 之后,我的电脑才能正常地调节亮度,此前我一直用的是自己写的蹩脚 xrandr 脚本,依靠改变 Color Channel 来对亮度进行伪调节。

大概也是因为驱动的问题,在我的机器上,Linux 的耗电速度比 windows 要快,还好有 tlp 能救一把,配合 kde plasma 自带的电源管理,我现在 Linux 的耗电速度已经基本和 windows 持平了,这里就记录一下我的 tlp 做了哪些配置。

TLP 及其他省电工具的安装

1
2
3
4
sudo pacman -S tlp
sudo pacman -S tlp-rdw // tlp 无线设备省电
sudo pacman -S x86_energy_perf_policy //CPU性能与节能策略
sudo pacman -S ethtool //可用于禁用 Linux 的网络唤醒

此处夸一夸 Arch 系的包管理,确实非常香,安装各种东西都非常方便

如果你想要 tlp-rdw 正常工作的话,还需要安装 NetworkManager ,一般来说都是安装过的,很多桌面环境都是用 NetworkManager 做为默认的网络管理,即使是只用命令行的猛男,在安装 Arch Linux 时,也一般会用它来连接网络,如果你不用 NetworkManager ,需要自行编辑 tlp.service,注释掉里面的 NetworkManager.service

1
sudo pacman -S networkmanager

TLP 开机启动

1
systemctl enable tlp

如果安装了 tlp-rdw 无线设备管理的话还需要(确保安装了 networkmanager):

1
systemctl enable NetworkManager-dispatcher

同时屏蔽 systemd 服务 systemd-rfkill.service 以及 套接字 systemd-rfkill.socket 来防止冲突:

1
2
systemctl mask systemd-rfkill.service
systemctl mask systemd-rfkill.socket

reboot 之后,tlp 就启动了

TLP 及其他配置

禁用网络唤醒功能

后来才发现原来 tlp 默认就帮你把网络唤醒给关了= =

可以在 WOL_DISABLE=Y那里直接设置,就不需要后面的那些步骤了


禁用网络唤醒功能后,就无法通过网络远程开机,个人电脑用不到,所以我这里就直接关掉了

使用 networkmanager 查看本地网络设备:

1
nmcli device

我这里的输出:

1
2
3
4
5
DEVICE          TYPE      STATE   CONNECTION
wlp4s0 wifi 已连接 *****
p2p-dev-wlp4s0 wifi-p2p 已断开 --
eno1 ethernet 不可用 --
lo loopback 未托管 --

可以看到我的物理网卡名字叫 eno1,别的机器可能是 eth0 啥的,使用 ethtool 查看网络唤醒功能的状态

1
sudo ethtool eno1 | grep -i "wake"

输出如下:

1
2
Supports Wake-on: pumbg
Wake-on: d

上面一行显示了网卡支持的唤醒模式,下一行则显示了当前网卡的唤醒模式,含义如下:

  • d – 禁用
  • p – 物理活动唤醒
  • u – 单播消息唤醒
  • m – 多播(组播)消息唤醒
  • b – 广播消息唤醒
  • a – ARP 唤醒
  • g – 特定数据包 magic packet 唤醒
  • s – 设有密码的特定数据包 magic packet 唤醒

要禁用网络唤醒,将网卡模式改为 d 即可:

1
ethtool -s eno1 wol d

修改/etc/tlp.conf

  1. 默认电源模式设为 BAT ,没有接通电源时采用 BAT 电源模式

    1
    TLP_DEFAULT_MODE=BAT
  2. 默认持续模式设为 0 ,根据是否接通电源来决定电源模式,若设为 1 则总是使用 TLP_DEFAULT_MODE

    1
    TLP_PERSISTENT_DEFAULT=0
  3. CPU 性能模式设置

    1
    2
    CPU_SCALING_GOVERNOR_ON_AC=performance
    CPU_SCALING_GOVERNOR_ON_BAT=schedutil

    接通电源时,性能优先,无电源时使用 schedutil 模式(似乎是近几年出的省电又顺畅的调度模式,推荐),另外也有 ondemand(按需,推荐),powersave(节能),conservative(保守供电)可选

  4. CPU 相对节能模式

    1
    2
    CPU_ENERGY_PERF_POLICY_ON_AC=performance
    CPU_ENERGY_PERF_POLICY_ON_BAT=power

    接通电源时使用性能模式,否则省电模式,另外也有 balance_performance 和 balance_power 可选

  5. 硬盘设置

    1
    DISK_DEVICES="nvme0n1"

    使用 sudo fdisk -l查看你的硬盘名称,向我只有一块 NVMe 的固态硬盘就只需要写一个”nvme0n1”,如果你还有一块 SATA 固态,那么就应该写 “nvme0n1 sda”,以 fdisk 指令的结果为准

  6. 硬盘空闲速度设置

    1
    2
    DISK_APM_LEVEL_ON_AC="254"
    DISK_APM_LEVEL_ON_BAT="128"

    设置范围是[1,255],[1,127]会使硬盘降速,所以电源模式设置为 128 就好,注意如果你有两块硬盘,就要分别对每块硬盘设置,比如写成”254 254”和”254 128”

  7. (*) 根据不同的硬件型号,有不同的可选项可设置

    比如 Intel CPU()就可以设置 CPU_HWP_ON_AC/BAT,SATA 模式的硬盘就可以设置 SATA_LINKPWR_AC/BAT ,具体如何设置 /etc/tlp.conf 的备注部分都有写,因为我是锐龙 CPU,硬盘也不支持 SATA 模式,所以就不启用这些设置了

TLP 常用命令

最后再列举几个 TLP 常用的命令

1
2
3
4
5
sudo tlp start          //启动 tlp 服务
sudo tlp-stat -s //查看 tlp 运行状态
sudo tlp-stat -c //查看 tlp 设置
sudo tlp-stat -b //查看电池状态
sudo tlp-stat -t //查看风扇转速,CPU温度

最后附上一张 TLP 效果图

作者

Meow-2

发布于

2022-02-19

更新于

2022-11-28


评论