神船 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 的功耗。
block bluetooth 后,亮度 25%
block bluetooth 后,亮度 25%
检查发现,有线网卡驱动模块名为 r8169。执行 sudo rmmod r8169 后在 PowerTOP 里显示有线网络接口功耗为 0,但是事实上电池报告的数值并无下降。执行 lspci | grep Ethernet 后得出其 PCI 地址,切换到 su 后执行 echo 1 > /sys/bus/pci/devices/地址/remove,没有进步。执行 sudo ip link set 有线网络接口名 down,也不行。
rmmod r8169,注意此时亮度为 5%
就在这时,我看到了 Wiki,再结合网上其他的讨论,决定更换网卡驱动试一试。按照 Wiki 的做法,用 pacman 安装了 r8168,并在 /etc/modprobe.d/ 下新建一个配置文件写入 blacklist r8169,执行 sudo mkinitcpio -P,重启后内核模块成了 r8168,这时不连接有线网时多的 2W 功耗终于消失不见了。顺便说,很多人说 RTL8168 的网卡却用的是 r8169 的内核模块是系统识别错误,我却认为“没有调查就没有发言权”
r8168,注意此时亮度为 5%
经过测试,使用 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)上这个选项是要修改的。


神船 TX6 延长 ArchLinux 下的续航
https://zhaozihanzzh.github.io/2022/01/17/arch-standby/
Author
zhaozihanzzh
Posted on
January 17, 2022
Licensed under