结论
对第三方方案(「ryzenadj 硬 TDP 墙 + power-profiles-daemon/tuned 策略切换 + systemd cgroup 后台约束」三层组合)的复核结论:大方向成立,但有四处必须修正 —— ① 它与 TLP 互斥,不能像原文那样并列启用;② 原文隐含的「AMD 平台性能档(platform_profile)」在本机是空实现,实际调频走 amd_pstate 的 EPP;③ 给 nix-daemon 限流的建议在本机无收益且有害(瓶颈在窄带下载,不在 CPU);④ 原文通篇漏掉了风扇控制 —— 而本机风扇 PWM 恰好是可写的,这才是 GPD 电源工具的核心卖点之一。
补充一句定位:本机已经在用 power-profiles-daemon(桌面环境默认拉起,三档均可用),所以「启用 ppd」不是待办项,而是现状基线。
本机实测现状
| 判据 | 实测 |
|---|---|
| 可用档位 | performance / balanced(当前)/ power-saver 三档齐全 |
| 调频驱动 | amd-pstate-epp;governor powersave;EPP balance_performance |
| 平台性能档 | 不存在 —— /sys/firmware/acpi/platform_profile 无此文件,ppd 自报 PlatformDriver: placeholder |
| TDP 工具 | ryzenadj 未安装,但在 nixpkgs 中(求值得 0.19.0) |
| 其他电源工具 | tuned / tlp / auto-cpufreq 均未安装(后两者在 nixpkgs 中) |
| 风扇可控性 | 有 PWM 接口:专属风扇 hwmon 节点暴露 pwm1(当前 137/255)与 pwm1_enable(当前 2=自动),转速 3071 RPM;权限 root 可写 |
| 温度源 | k10temp 提供 CPU 温度(当前 61 °C) |
| 后台限流 | nix-daemon 当前无任何限制(CPUQuota/MemoryMax 均为 infinity) |
逐条裁决
| # | 原文说法 | 裁决 | 依据 / 修正点 |
|---|---|---|---|
| 1 | Linux 无与 GPD 工具对等的单一工具,靠组合实现 | ✅ 采信 | 本机确无对等工具;三层机制各自存在 |
| 2 | ryzenadj 已收录 nixpkgs | ✅ 采信 | 本机 nixpkgs 求值 ryzenadj.version = 0.19.0 |
| 3 | 三层组合(TDP 墙 / 策略切换 / cgroup) | ✅ 采信(框架) | 但层次归属需按 4/5 修正;且缺风扇层(见 12) |
| 4 | 「power-profiles-daemon 或 tuned」二选一 | ✅ 采信 | tuned-ppd 与 ppd 提供同一 D-Bus 接口,只能留一个 |
| 5 | 「可选:services.tlp.enable = true;」与前两者并列启用 | ❌ 驳回 | TLP 与 ppd 是互斥的电源管理层:两者都要接管调频/governor/EPP,同时开启会互相覆盖、行为不可预期。本机已在用 ppd ⇒ 不得再加 TLP |
| 6 | tuned 可「映射到 ppd 接口」 | ⚠️ 修正 | 不是叠加而是替换:tuned-ppd 是 ppd 的兼容替代守护(同接口)。开 tuned = 不用 ppd |
| 7 | (隐含)AMD 平台性能档可用 | ❌ 修正 | 本机平台档是空实现(placeholder);真实调节点是 amd_pstate 的 EPP,不是 platform_profile |
| 8 | ryzenadj 重启失效,需服务/脚本在启动时应用 | ✅ 采信 | SMU 参数非持久化,符合 |
| 9 | 给 nix-daemon 限 CPUQuota=50% / MemoryMax=2G | ⚠️ 修正 | 本机当前完全未限流。但受限于窄带代理,大构建的瓶颈是下载而非 CPU ⇒ 限 CPU 无收益;限内存反而可能让并行构建失败。不建议照抄数值 |
| 10 | 写脚本绑快捷键复现「一键切换」体验 | ✅ 采信 | 可行;且本机已有桌面环境可绑定 |
| 11 | 内核正在加入 AMD DPTCi,未来可减少对 ryzenadj 依赖 | ⚠️ 存疑 | 本机内核模块树中未见 dptc 相关;平台档驱动亦缺位 ⇒ 短期内不成立,标未复核 |
| 12 | (原文缺失)风扇曲线控制 | ❌ 重大遗漏 | GPD 电源工具的主要卖点之一就是风扇曲线。本机专属风扇 hwmon 节点已暴露 pwm1/pwm1_enable(root 可写)⇒ 三层框架完全没覆盖这一层 |
| 13 | (原文缺失)本机已启用 ppd | ➕ 补充 | 原文「整合方案」里的 services.power-profiles-daemon.enable = true; 对已是桌面默认的机器属重复声明 |
本机可用的四层方案
| 层 | 机制 | 本机现状 | 落地方式(声明式) |
|---|---|---|---|
| ① 硬功耗墙 | ryzenadj 写 SMU 的 STAPM / Fast / Slow 三档功耗限 | 未安装,包在 nixpkgs | 加入系统包 + 一个在启动时套用默认档的服务(参数重启即失效) |
| ② 策略切换 | power-profiles-daemon 切 EPP / 调度倾向 | 已在运行,三档可用 | 现状即可用;若要自定义档位语义可改用 tuned-ppd(替换而非叠加) |
| ③ 风扇曲线 | 专属风扇 hwmon 的 pwm1 + pwm1_enable | 可写(root),当前自动模式 | 写温度—转速映射的服务(或人工脚本);原文未覆盖 |
| ④ 后台约束 | systemd cgroup 的 CPUQuota / MemoryMax / IOWeight | 未限流 | 按需给具体服务加;本机不建议限 nix-daemon(见裁决 9) |
「一键切换」= 一层脚本同时设置 ① ryzenadj 三档功耗 + ② powerprofilesctl set …(+ 可选 ③ 风扇曲线),再绑到桌面快捷键 —— 这就复现了 GPD 工具的操作体验。
不建议照搬的部分
- TLP 与 ppd 并列启用 —— 互斥,会互相覆盖。二选一。
- 给 nix-daemon 限流 —— 本机瓶颈是窄带下载,限 CPU 无收益;限内存可能让并行构建失败。
- 指望平台性能档(platform_profile) —— 本机是空实现,调节要走 EPP。
- 「未来 DPTCi 可替代 ryzenadj」 —— 本机内核未见该驱动,暂不可作为决策依据。
复核命令
powerprofilesctl list && powerprofilesctl get # 档位齐全性与当前档
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_driver # 实际调频驱动(应为 amd-pstate-epp)
cat /sys/devices/system/cpu/cpu0/cpufreq/energy_performance_preference # 当前 EPP
cat /sys/firmware/acpi/platform_profile # 平台档是否真的存在(本机无此文件)
for h in /sys/class/hwmon/*/; do echo "$(cat $h/name) $h"; done # 找风扇节点,看有无 pwm1
systemctl show nix-daemon -p CPUQuotaPerSecUSec -p MemoryMax # 后台是否被限流
nix-instantiate --eval -E 'with import <nixpkgs> {}; ryzenadj.version' # 确认包在 nixpkgs边界
- 本文是对第三方方案的复核与重排,不是实施记录 —— 本机未安装
ryzenadj,未改任何电源配置。 - 功耗档的实际瓦数上限、风扇曲线是否真有传感器支撑,均未实测(需在真机上逐步试)。
- 「DPTCi 驱动」一节的判断基于本机内核模块树的检索,未查上游内核 changelog ⇒ 标未复核。
- 原文中的示例数值(15 W / 45 W / CPUQuota 50% 等)仅为示意,未在本机验证。