神船 TX6 延长 ArchLinux 下的续航
Last updated on January 31, 2022 pm
神船 TX6 延长 ArchLinux 下的续航
神船 TX6(2020 款,CU5Dx)采用蓝天 NK60SB 模具,搭载 Intel Core i5-10400 这一 6 核心 12 线程,TDP 65W 的 LGA 封装 CPU 和 NVIDIA GeForce GTX1650 (4GB GDDR6)独立显卡,再加上 16.1 寸 60Hz 的 LCD 显示屏,却使用一块只 47Whr 的可拆卸电池,如果运行 Linux 的话,在办公、编码场景下对其续航到底能抱有多大期待呢?经过一番并不足够硬核的调教,又能有怎样的进步呢?
Part 1 背景
先前,笔者已经在神船 TX6 BIOS 开关独显一文中通过关闭独显获得了明显的续航进步。即使限制充电上限,在 Windows 10 下,续航也已经差不多能满足本人一上午或一下午的需要了。但是,ArchLinux 的续航相比 Windows 仍然不是很令人满意。我忍不住想动手了。
Part 2 初次尝试
起初,我以为影响续航的罪魁祸首是那颗台式机 CPU,在上网查找一番后决定安装 x86_energy_perf_policy
软件包,执行 sudo x86_energy_perf_policy powersave
,但没这个调速器,就改成了 sudo x86_energy_perf_policy power
。运行了一段时间,却没发现有什么变化,搞得我一度以为这行命令没有作用。之后,我决定直接关闭 CPU 的睿频,执行 sudo x86_energy_perf_policy --turbo-enable 0
。睿频成功地关掉了,但是耗电速度仍然很快。尝试采用 TLP,好像也没有缓解迅速下降的电量。由于当时时间有限,我没有再深入尝试,不过我感觉可能问题在桌面环境上。
Part 3 再次探索
后来有一定的时间后,决定花一些时间探讨一下。看到这条回答,但并没听说过 CPU 的 Package C State 相关的内容,不过还是把 PowerTOP 也给安装了,并没起太大作用,但 PowerTOP 的监控却让我发现可以进行一下更定量化的探索:亮度 25% 左右时,KDE 下这台机器待机耗电在 8W 以上。又看了这个回答,怀疑是 Baloo 的错,把它禁止了,仍然没有测得数据下降。我禁止 sddm 的自启动,这样重启后就不会启动图形界面了(这个具体要根据各人的配置),在命令行环境下登录,已经自启 TLP,开启 PowerTOP 的 autotune,结果却另我大吃一惊:不进行任何操作时,功耗仍然在 8W 左右!看来,除了 GUI 外,一定还有其他因素在影响。
带着问题,我重启进了 Windows。这次查看的是 HWiNFO64 中的 Battery Charge Rate,结果 Windows 10 待机下电池放电速率仅有 6W 多,足足少了 2W。既然这样,那可能是上面那条回答中所提到的设备问题了。
PowerTOP 里面有 WakeUp 一栏,列出了我的 USB 接口、有线网络接口和无线网络接口。想起在 PowerTOP 的 Overview 里还看到过蓝牙有关的东西,我执行了 sudo rfkill block bluetooth
,这样似乎有了些提升:空闲时功耗在 7.9W 左右了。
但这还不够。在外面场景时,WiFi 往往是需要开启的,因此从无线网络上似乎省不出什么东西。会不会是有线网络呢?我重启进入 Windows,打开 HWiNFO64,等到功耗 6W 多时插上了网线。功耗在波动了一番后竟然升到了 8W 多。拔下网线,功耗又降回了 6W多。难道有线网卡真的耗 2W?我又重启进入 Linux,这次让 PowerTOP 待机连续观测了很长时间,确认这张 Realtek 有线网卡在 Linux 下无论是否连接网线,均有 2W 的功耗。
检查发现,有线网卡驱动模块名为 r8169。执行 sudo rmmod r8169
后在 PowerTOP 里显示有线网络接口功耗为 0,但是事实上电池报告的数值并无下降。执行 lspci | grep Ethernet
后得出其 PCI 地址,切换到 su 后执行 echo 1 > /sys/bus/pci/devices/地址/remove
,没有进步。执行 sudo ip link set 有线网络接口名 down
,也不行。
就在这时,我看到了 Wiki,再结合网上其他的讨论,决定更换网卡驱动试一试。按照 Wiki 的做法,用 pacman 安装了 r8168,并在 /etc/modprobe.d/
下新建一个配置文件写入 blacklist r8169
,执行 sudo mkinitcpio -P
,重启后内核模块成了 r8168,这时不连接有线网时多的 2W 功耗终于消失不见了。顺便说,很多人说 RTL8168 的网卡却用的是 r8169 的内核模块是系统识别错误,我却认为“没有调查就没有发言权”。
经过测试,使用 VSCode,开启 Chromium 并连接 WiFi,关闭 CPU 睿频,此时虽然 VSCode 没那么跟手了,但经过 50min 的使用,电量从 75% 下降到 61%,续航有明显提升。
滑稽的是,直到撰写本文前我一直以为我的有线网卡是 Realtek RTL8168,可在求证时按照网上说的,用 lspci
命令得到 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 12)
后却发现,这块 Device 10ec:8168(从 dmesg 里看到的),rev 12 的网卡居然是张 Realtek RTL8411B。(后来才看到好像确实是这样的)
Part 4 修复问题
我以为到这里本帖就应该结束了,可后来在使用中才发现休眠后无法唤醒。经查,只要是 TLP 运行在电池模式下,休眠(到 RAM)后就会出现睡死的情况(显示休眠前的画面,REISUB 有效,无法切换 TTY),并且 journalctl 里面只记录到休眠前的 log。我起初毫无头绪,后来观察发现休眠后唤醒时硬盘活动指示灯不亮,推测可能是 TLP 对硬盘进行的省电设置导致的。于是编辑 /etc/tlp.conf,把 DISK_DEVICES
显式地置为空串,重启后终于可以正常休眠了。在阅读了官方文档后,把 AHCI_RUNTIME_PM_ON_BAT
从默认的 auto
改成 on
并把 DISK_DEVICE
复原后,睡死不再出现。看来在我的机器上(linux 5.16.3,systemd 250.3-1,tlp 1.5.0-4)上这个选项是要修改的。