我的工作电脑是一台安装 Arch Linux 的轻薄笔记本,虽说 Linux 比 Windows 更加节省资源,但是我的工作笔记本续航比较尿崩,出门必须带充电器,进店必找有插座的位置。看到同事的 mbp 的超长续航不可能不羡慕,但我也不奢望过多,只期望出门后,笔记本能够支撑一下午的正常办公就足够了。
amd_pstate
刚好最近注意到 Linux 6.1 内核中集成了 amd_pstate 模块,这是用来实现动态调节 Ryzen CPU 频率的驱动模块,相较于原先的 acpi_cpufreq 驱动, amd_pstate 支持 CPPC(Collaborative Processor Performance Control) 功能,简单来说,CPPC 可以根据系统对性能、功耗的需求,调节 CPU 的工作频率。
支持 CPPC 的 CPU driver 需要跟合适的 CPU scaling governor 配合使用。后者是 Linux 系统中用来调节 CPU 频率的软件,不同的 gorvernor 实现了不同的 CPU 频率调整算法,跟 CPPC 最搭配的是下面两个 gorvernor:
ondemand:基于当前工作负载动态调节 CPU 频率
schedutil:基于调度器的反馈动态调节 CPU 频率
这两种 gorvernor 都能根据操作系统的需要动态降低或提升 CPU 的工作频率,从而实现比较理想节能效果。
对于运行 6.1 版本或者更新内核的 Linux ,可以参考这个链接启用 amd_pstate 驱动。
检测 amd_pstate 生效的方式也比较简单,推荐安装 cpupower:
analyzing CPU 14:driver: amd-pstateCPUs which run at the same hardware frequency: 14CPUs which need to have their frequency coordinated by software: 14maximum transition latency: 20.0 ushardware limits: 400 MHz - 1.90 GHzavailable cpufreq governors: conservative ondemand userspace powersave performance schedutilcurrent policy: frequency should be within 400 MHz and 1.90 GHz.The governor "ondemand" may decide which speed to usewithin this range.current CPU frequency: Unable to call hardwarecurrent CPU frequency: 1.11 GHz (asserted by call to kernel)boost state support:Supported: yesActive: noAMD PSTATE Highest Performance: 166. Maximum Frequency: 4.51 GHz.AMD PSTATE Nominal Performance: 70. Nominal Frequency: 1.90 GHz.AMD PSTATE Lowest Non-linear Performance: 41. Lowest Non-linear Frequency: 1.11 GHz.AMD PSTATE Lowest Performance: 15. Lowest Frequency: 400 MHz.
对于笔记本来说,更常见的需求是根据电源状态自动设置性能偏好,这里推荐使用 TLP,为了方便使用,我还安装了 tlpui。TLP 允许我们配置电脑在不同电源状态的 CPU 调节参数:
gorvernor
最低频率、最高频率
自动超频开关
不过 TLP 的自动超频开关有些死板,即使是出门在外使用电池的场景,我也希望偶尔开启 Boost 提高一下 IDE 分析代码的速度。解决这个问题很简单,有两个方法:
又是一番搜索,怀疑是一些路由器会校验请求来源设备 IP 跟数据包中来源 IP 的一致性,米家设备请求被 OpenWRT 转发到主路由网关,导致来源设备 IP 跟数据包中的来源 IP 不一致,最终请求被拦截在了主路由处。要解决这个问题,得在 OpenWRT 对应的网络接口上启用「动态 IP 伪装」,说白了就是 NAT 。
其他设备也是被 OpenWRT 转发到主路由的,为什么它们没有出现这种问题呢?这时就需要进一步了解 Linux 的网络原理了:
所有发往网关的请求应该都需要转发(FORWARD,因为请求的目标 IP 不是网关本身),但是所有基于这篇透明代理白话文设置的透明代理中,转发流量都被 iptables 发到了 12345 端口,变成了入站请求(INPUT),经过代理软件处理后,作为出站请求(OUTPUT)发出,这些流量就不再被认为是转发流量了,在主路由看来,这些被 v2ray 处理过的流量来源请求都是 OpenWRT ,所以不会触发来源请求校验失败。而被 iptables 分流的米家设备请求,从主路由看来,都是由 OpenWRT 发出但是来自米家设备 IP 的,导致校验失败。
上面的根因分析完全是我半吊子的推测,可能不够准确、专业,但是启用 OpenWRT 的「动态 IP 伪装」之后,确实解决了米家设备无法联网的问题。
第一次启动可能会比较慢,如果发现卡在联想 Logo 页面超过了 3 分钟了,可以长按电源键重启设备,一次不行,就多试几次,这种情况通常只会出现在第一次启动系统。
提高使用体验
在 LineageOS 19 中,以往小新 Pad Pro GSI 系统中会遇到的自动旋转失效问题已经不存在了。但是原生安卓缺少国产 ROM 的“平行视界”功能,运行不适配横屏模式的应用的体验跟 iPad OS 一样,会强制竖屏。所以还是得安装一个旋转管理器,强制部分应用横屏展示得忍受一下 UI 错位 ,我用的是这个 Xposed 模块 —— 自由屏幕旋转。
至于快充,由于我的手机充电速度是 Pad 的 6 倍,实在很难感受到是否存在快充变慢的情况。至少系统界面会在使用原装充电器的时候显示 “Charging Rapidly”的文字。
关于续航,Lineage OS 系统设置中有一个默认启用的 Screen Saver 选项,这是一个类似“常亮显示”的功能,会在屏幕熄灭后在屏幕上显示一个时钟。小新 Pad Pro 虽然使用的是 A 屏,但是硬件设计上可能压根不支持“常量显示”,导致屏幕耗电量剧增。实测关掉 Screen Saver 后,待机续航可以提升一倍(从一天不到提升到两天),而且充电速度也会有明显的提升。