使用 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 及其他省电工具的安装

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

sudo pacman -S networkmanager

TLP 开机启动

systemctl enable tlp

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

systemctl enable NetworkManager-dispatcher

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

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

reboot 之后,tlp 就启动了

TLP 及其他配置

禁用网络唤醒功能

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

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


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

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

nmcli device

我这里的输出:

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

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

sudo ethtool eno1 | grep -i "wake"

输出如下:

Supports Wake-on: pumbg
Wake-on: d

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

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

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

ethtool -s eno1 wol d

修改/etc/tlp.conf

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

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

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

    CPU_SCALING_GOVERNOR_ON_AC=performance
    CPU_SCALING_GOVERNOR_ON_BAT=schedutil
    

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

  4. CPU 相对节能模式

    CPU_ENERGY_PERF_POLICY_ON_AC=performance
    CPU_ENERGY_PERF_POLICY_ON_BAT=power
    

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

  5. 硬盘设置

    DISK_DEVICES="nvme0n1"
    

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

  6. 硬盘空闲速度设置

    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 常用的命令

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

最后附上一张 TLP 效果图

scanf 是如何工作的
Conda init 设置拖慢 shell 启动速度的解决方法