让 PVE 主机安静下来:Homelab 低功耗调优,从 C-State、ASPM 到 Powertop 实战

Homelab 不是数据中心,7x24 小主机更需要低功耗、低噪音和稳定性。本文以 Proxmox VE 为例,系统梳理 CPU C-State、PCIe ASPM、磁盘休眠、网卡节能和 powertop 持久化调优,并给出可回滚的排障方案。

前言

很多人搭 Homelab 的第一反应是堆性能:CPU 核心越多越好、内存越大越好、NVMe 越快越好。但机器真正 7x24 跑起来以后,电费、噪音和温度才是每天都能感知到的指标。尤其是放在卧室、书房、弱电箱里的 PVE 小主机,空载 35W 和空载 12W 的体验完全不同:前者风扇常转、机箱烫手,后者基本无感。

本文记录一套我更推荐的 “先测量、再调优、最后持久化” 的 PVE 低功耗方案。它不是盲目追求最低瓦数,而是在不牺牲虚拟机稳定性的前提下,把空闲功耗降下来。核心会覆盖:

  • CPU 频率策略与 C-State 检查
  • PCIe ASPM 链路省电
  • powertop --auto-tune 的正确打开方式
  • SATA/NVMe/USB 设备的节能配置
  • 网卡 EEE 与 Wake-on-LAN 的取舍
  • 调优后出现掉盘、网卡断流、VM 卡顿时如何回滚

重要提醒:低功耗调优一定要分阶段做。每改一项,至少观察 24 小时,确认虚拟机、Docker、NAS、Home Assistant 等服务稳定后再继续。

1. 先建立基线:不要凭感觉调优

调优前先记录当前状态,否则最后只会变成“好像省电了”。如果有智能插座,优先以墙上功率为准;如果没有,也可以先用软件指标观察趋势。

1.1 安装基础工具

在 PVE 宿主机执行:

1
2
apt update
apt install -y powertop linux-cpupower lm-sensors ethtool smartmontools nvme-cli pciutils

记录当前 CPU、内核、PCIe 设备和磁盘:

1
2
3
4
uname -a
lscpu | egrep 'Model name|CPU\(s\)|Thread|MHz|Governor'
lspci -nn
lsblk -o NAME,MODEL,SIZE,ROTA,TRAN,MOUNTPOINT

如果是 Intel 平台,还可以看 CPU 是否真正进入深度 C-State:

1
powertop --time=20 --html=/root/powertop-before.html

把报告拷到本地打开,重点看 Idle stats 页面。如果 Package C-State 长时间只能到 C2/C3,空载功耗通常降不下来;能进 PC8/PC10 的小主机,空载功耗往往会明显更低。

1.2 记录 10 分钟空载功耗

先停掉高负载任务,比如备份、校验、转码、下载:

1
2
systemctl list-timers --all | egrep 'apt|backup|prune|gc|scrub|fstrim'
pvesh get /nodes/$(hostname)/qemu --output-format json-pretty | grep -E 'vmid|status'

然后记录:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# CPU 频率与 governor
cpupower frequency-info | egrep 'driver|governor|current CPU frequency|boost state'

# 温度
sensors

# 磁盘 SMART 关键字段
smartctl -a /dev/sda | egrep 'Power_On_Hours|Power_Cycle_Count|Load_Cycle_Count|Temperature|Power_Mode' || true

# NVMe 电源状态
nvme get-feature /dev/nvme0 -f 0x0c -H || true

建议做一个简单表格:

阶段墙上功率CPU Package C-StateCPU 温度备注
调优前例如 28WC348℃默认安装
CPU 调优后例如 22WC6/C843℃governor 调整
ASPM 后例如 16WC8/C1039℃PCIe 链路省电
powertop 后例如 13WC1036℃USB/SATA tunables

2. CPU:先确认 governor,再看 C-State

PVE 默认更偏向服务器稳定性,不一定会给你最激进的省电配置。对 Homelab 来说,CPU 大多数时间处于低负载,应该让它尽量进入低频和深度睡眠。

2.1 查看当前频率驱动

1
2
3
cpupower frequency-info
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_driver
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

常见结果:

平台/驱动常见 governor建议
Intel intel_pstate activepowersave / performanceHomelab 推荐 powersave
Intel/AMD acpi-cpufreqondemand / schedutil / performance推荐 schedutilondemand
新内核 AMD amd-pstateschedutil / powersave推荐先用 schedutil

临时切换 governor:

1
2
3
4
5
# Intel intel_pstate 常用
cpupower frequency-set -g powersave

# 如果 powersave 不存在,可用 schedutil
cpupower frequency-set -g schedutil

验证:

1
2
3
for g in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
  echo "$g: $(cat $g)"
done

2.2 持久化 CPU governor

Debian/PVE 可以使用 systemd 服务持久化:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
cat >/etc/systemd/system/cpupower-governor.service <<'EOF'
[Unit]
Description=Set CPU governor for homelab low power
After=multi-user.target

[Service]
Type=oneshot
ExecStart=/usr/bin/cpupower frequency-set -g powersave
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now cpupower-governor.service
systemctl status cpupower-governor.service --no-pager

如果你的平台没有 powersave,把上面的 powersave 改成 schedutil

2.3 C-State 被锁死怎么办?

检查内核启动参数:

1
cat /proc/cmdline

如果看到这些参数,通常会影响省电:

1
2
3
intel_idle.max_cstate=1
processor.max_cstate=1
idle=poll

这些参数常见于为了追求极低延迟或排查死机临时加上的配置。Homelab 如果没有强实时需求,不建议长期保留。

PVE 修改 GRUB 的方式:

1
2
3
4
nano /etc/default/grub
# 修改 GRUB_CMDLINE_LINUX_DEFAULT,移除限制 C-State 的参数
update-grub
reboot

如果是 systemd-boot(常见于 ZFS root 安装),检查:

1
2
3
4
proxmox-boot-tool status
nano /etc/kernel/cmdline
proxmox-boot-tool refresh
reboot

3. PCIe ASPM:低功耗的关键,但也是最容易踩坑的地方

ASPM(Active State Power Management)用于让 PCIe 链路在空闲时进入 L0s/L1 等低功耗状态。很多小主机空载功耗降不下来,根因不是 CPU,而是某个 NVMe、网卡、SATA 控制器或 PCIe 转接设备不让链路睡觉。

3.1 查看当前 ASPM 状态

1
cat /sys/module/pcie_aspm/parameters/policy

常见输出:

1
[default] performance powersave powersupersave

方括号表示当前策略。也可以看具体设备链路能力:

1
lspci -vv | egrep -i '^[0-9a-f:.]+|LnkCap|LnkCtl|ASPM'

如果 LnkCap 里显示支持 ASPM,但 LnkCtl 里是 ASPM Disabled,说明链路没有启用省电。

3.2 临时启用 powersave 策略

先临时测试,不要一上来写入启动参数:

1
2
echo powersave >/sys/module/pcie_aspm/parameters/policy
cat /sys/module/pcie_aspm/parameters/policy

然后观察 24 小时:

1
journalctl -k -f | egrep -i 'pcie|aer|nvme|reset|timeout|link'

如果出现大量 AER 报错、NVMe reset、网卡 link down/up,就说明某个设备不适合激进 ASPM。

3.3 持久化 ASPM

确认稳定后再写入内核参数。

GRUB:

1
nano /etc/default/grub

示例:

1
GRUB_CMDLINE_LINUX_DEFAULT="quiet pcie_aspm.policy=powersave"

应用:

1
2
update-grub
reboot

systemd-boot:

1
2
3
4
nano /etc/kernel/cmdline
# 在同一行追加:pcie_aspm.policy=powersave
proxmox-boot-tool refresh
reboot

不建议一开始就使用 pcie_aspm=force。Red Hat 的电源管理文档也明确提醒:只有确认硬件支持 ASPM 时才应强制启用。Homelab 里很多廉价 PCIe 转 SATA、2.5G 网卡、NVMe 转接卡的固件质量参差不齐,force 可能换来掉盘和网络抖动。

4. Powertop:可以用,但不要无脑全自动

powertop --auto-tune 会把很多 tunables 改成省电模式,包括 USB autosuspend、SATA 链路电源管理、音频省电、网卡省电等。它很有效,但也可能把某些 USB Zigbee 网关、UPS USB 线、移动硬盘盒调到不稳定。

4.1 先生成报告

1
powertop --time=60 --html=/root/powertop-after-cpu-aspm.html

打开 HTML 后看 Tunables 页面。不要急着全套启用,先识别哪些设备不能睡:

  • Zigbee2MQTT / Z-Wave USB Dongle
  • UPS 的 USB HID 连接
  • USB 网卡、USB 硬盘盒
  • 正在做直通的 PCIe/USB 设备
  • 某些 Realtek 2.5G 网卡

4.2 临时执行 auto-tune

1
powertop --auto-tune

执行后马上检查关键服务:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# USB 设备是否还在
lsusb

# 网卡是否掉线
ip link
ethtool eno1 | egrep 'Speed|Duplex|Link detected'

# PVE 服务是否正常
systemctl --failed
pvesh get /cluster/resources --type vm

4.3 排除指定 USB 设备的 autosuspend

如果 Zigbee 网关或 UPS 掉线,先查 VID/PID:

1
2
lsusb
# 示例:Bus 001 Device 004: ID 10c4:ea60 Silicon Labs CP210x UART Bridge

创建 udev 规则,禁止该设备 autosuspend:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
cat >/etc/udev/rules.d/99-homelab-usb-power.rules <<'EOF'
# Zigbee Coordinator / CP210x,避免 powertop 开启 autosuspend 后掉线
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="10c4", ATTR{idProduct}=="ea60", TEST=="power/control", ATTR{power/control}="on"

# UPS USB HID 示例,按你的 lsusb VID/PID 修改
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="051d", ATTR{idProduct}=="0002", TEST=="power/control", ATTR{power/control}="on"
EOF

udevadm control --reload-rules
udevadm trigger

4.4 持久化 powertop auto-tune

确认所有服务稳定后再创建 systemd 服务:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
cat >/etc/systemd/system/powertop-autotune.service <<'EOF'
[Unit]
Description=Powertop auto tune for homelab
After=multi-user.target

[Service]
Type=oneshot
ExecStart=/usr/sbin/powertop --auto-tune
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now powertop-autotune.service
systemctl status powertop-autotune.service --no-pager

这里建议把它放在 udev 规则之后启用。即使 powertop 改了 USB 策略,关键设备也会被规则拉回 on

5. 磁盘:省电和寿命要平衡

Homelab 常见组合是:NVMe 跑 PVE 和虚拟机,SATA HDD 做 NAS 或备份盘。磁盘省电需要谨慎:频繁启停机械盘可能比常转更伤寿命。

5.1 SATA 链路电源管理

查看 SATA host:

1
2
3
for h in /sys/class/scsi_host/host*/link_power_management_policy; do
  echo "$h: $(cat $h)"
done

临时设置为中等省电:

1
2
3
for h in /sys/class/scsi_host/host*/link_power_management_policy; do
  echo med_power_with_dipm > "$h" 2>/dev/null || true
done

如果发现掉盘、I/O timeout,回退到:

1
2
3
for h in /sys/class/scsi_host/host*/link_power_management_policy; do
  echo max_performance > "$h" 2>/dev/null || true
done

5.2 HDD 是否要休眠?

对于下载盘、媒体库、备份盘,可以考虑休眠;对于 ZFS 主存储池、数据库、监控时序库,不建议频繁休眠。

查看当前电源模式:

1
smartctl -n standby -a /dev/sdb

hdparm 设置 30 分钟无访问后待机:

1
2
apt install -y hdparm
hdparm -S 241 /dev/sdb

-S 241 表示 30 分钟。注意 hdparm 参数比较反直觉:1240 是 5 秒为单位,241251 是 30 分钟为单位。

持久化配置:

1
2
3
4
5
6
cat >/etc/hdparm.conf <<'EOF'
/dev/disk/by-id/ata-WDC_xxx {
    spindown_time = 241
    write_cache = on
}
EOF

一定要使用 /dev/disk/by-id/,不要写 /dev/sdb,因为重启后盘符可能变化。

5.3 NVMe APST

很多 NVMe 支持 APST(Autonomous Power State Transition),能在空闲时进入低功耗状态。查看:

1
nvme get-feature /dev/nvme0 -f 0x0c -H

如果遇到 NVMe 睡死、I/O timeout,可临时禁用 APST 验证:

1
2
# GRUB 或 systemd-boot 内核参数追加
nvme_core.default_ps_max_latency_us=0

反过来说,如果你的机器稳定,通常不需要手工关闭 APST。低功耗调优不是参数越多越好,稳定的默认值往往更适合长期运行。

6. 网卡:EEE 能省电,但也可能带来延迟毛刺

网卡节能主要看 EEE(Energy Efficient Ethernet)和 WOL(Wake-on-LAN)。

查看网卡:

1
2
3
ip -br link
ethtool eno1
ethtool --show-eee eno1 || true

启用 EEE:

1
ethtool --set-eee eno1 eee on

关闭 EEE:

1
ethtool --set-eee eno1 eee off

我的建议:

场景EEE 建议原因
普通管理口、低流量服务✅ 开启可以降低空闲功耗
NAS 大流量传输口可测试部分网卡会有吞吐波动
软路由 WAN/LAN谨慎可能引入延迟毛刺或兼容问题
Realtek 2.5G + 廉价交换机先关闭常见链路协商/断流问题

持久化可以创建 systemd 服务:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
cat >/etc/systemd/system/ethtool-eee.service <<'EOF'
[Unit]
Description=Configure EEE for homelab NIC
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/sbin/ethtool --set-eee eno1 eee on
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now ethtool-eee.service

如果你依赖远程唤醒,检查 WOL:

1
2
ethtool eno1 | grep Wake-on
ethtool -s eno1 wol g

注意:有些主板在开启 ErP/Deep Sleep 后会切断网卡待机供电,导致 WOL 失效。BIOS 里的省电选项和 Linux 里的省电策略要一起验证。

7. PVE 虚拟机侧也要配合

宿主机省电不代表 VM 可以随便跑。几个常见优化:

7.1 给 VM 安装 qemu-guest-agent

Debian/Ubuntu VM:

1
2
apt install -y qemu-guest-agent
systemctl enable --now qemu-guest-agent

PVE 里开启:

1
qm set 100 --agent enabled=1

这样 PVE 能更准确地管理关机、冻结文件系统、读取 IP,也减少某些异常状态下的资源浪费。

7.2 避免 VM 内部高频轮询

下面这些服务会让 CPU 无法长期空闲:

  • 过于频繁的 Prometheus scrape,例如 1s 抓一次
  • 日志 debug 级别长期打开
  • 下载器不停扫描目录
  • 媒体库频繁生成缩略图
  • Windows VM 默认计划任务、索引、更新

Prometheus 的 Homelab 抓取间隔通常 15s~60s 足够:

1
2
3
global:
  scrape_interval: 30s
  evaluation_interval: 30s

7.3 Windows VM 的电源计划

Windows 虚拟机建议选择“平衡”而不是“高性能”。如果是长期待机的下载机、办公机,关闭不必要的后台索引和自动维护:

1
2
powercfg /L
powercfg /S SCHEME_BALANCED

8. 一套推荐的安全调优顺序

不要把所有配置一次性打上去。推荐顺序:

顺序动作观察时间回滚难度
1记录基线、生成 powertop 报告10 分钟
2CPU governor 改为 powersave/schedutil24 小时
3临时启用 ASPM powersave24~48 小时
4临时执行 powertop auto-tune24 小时
5排除关键 USB 设备 autosuspend24 小时
6持久化 systemd 服务和内核参数长期
7调整 HDD spindown / EEE按设备观察

一键检查脚本可以这样写:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
cat >/root/check-power-state.sh <<'EOF'
#!/usr/bin/env bash
set -euo pipefail

echo "== CPU governor =="
for g in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
  echo "$g: $(cat $g)"
done | sort -V | head -8

echo
 echo "== ASPM policy =="
cat /sys/module/pcie_aspm/parameters/policy || true

echo
 echo "== SATA LPM =="
for h in /sys/class/scsi_host/host*/link_power_management_policy; do
  echo "$h: $(cat $h)"
done 2>/dev/null || true

echo
 echo "== NIC EEE =="
for nic in $(ls /sys/class/net | grep -v lo); do
  echo "-- $nic --"
  ethtool --show-eee "$nic" 2>/dev/null | egrep 'EEE status|Tx LPI|Supported EEE' || true
 done

echo
 echo "== Kernel errors in last boot =="
journalctl -k -b --no-pager | egrep -i 'aer|pcie|nvme|reset|timeout|link down|i/o error' || true
EOF

chmod +x /root/check-power-state.sh
/root/check-power-state.sh

如果复制脚本时发现 echo 前有多余空格,不影响执行;强迫症可以顺手删掉。

9. 踩坑记录

❌ 坑 1:pcie_aspm=force 直接上生产

有些教程会建议直接加:

1
pcie_aspm=force pcie_aspm.policy=powersave

这确实可能多省几瓦,但代价是不可预测。轻则日志里 AER 报错刷屏,重则 NVMe reset、SATA 控制器掉盘、2.5G 网卡断流。我的建议是:先用 pcie_aspm.policy=powersave,稳定后再考虑是否需要 force;绝大多数 Homelab 不值得 force。

❌ 坑 2:USB autosuspend 让 Zigbee/UPS 偶发掉线

powertop --auto-tune 后,Zigbee2MQTT 过几小时突然不可用,UPS NUT 也可能报通信失败。根因通常是 USB autosuspend。解决方式不是放弃 powertop,而是用 udev 规则把关键 USB 设备固定为 power/control=on

排查命令:

1
2
3
for d in /sys/bus/usb/devices/*/power/control; do
  echo "$d: $(cat $d)"
done

❌ 坑 3:机械盘频繁启停

HDD spindown 看起来很美,但如果媒体库、监控、备份任务每隔几分钟访问一次磁盘,硬盘会反复启停。长期看,Load_Cycle_Count 飙升并不划算。

检查:

1
smartctl -a /dev/sdb | egrep 'Start_Stop_Count|Load_Cycle_Count|Power_Cycle_Count|Power_On_Hours'

如果一天增长几十上百次,建议延长休眠时间或干脆关闭休眠。

❌ 坑 4:只看 CPU 频率,不看 Package C-State

很多人看到 CPU 频率已经降到 800MHz,就以为省电完成了。实际上,现代平台空载功耗关键在 Package C-State。一个卡在 C2 的 800MHz CPU,可能比能进 C10 的动态频率 CPU 更耗电。

验证还是用:

1
powertop --time=30

看 Idle stats,而不是只看 watch grep MHz /proc/cpuinfo

总结

PVE Homelab 低功耗调优的核心不是“把所有省电选项都打开”,而是三句话:

  1. 先测量:用智能插座、powertop、sensors 建立基线。
  2. 分阶段:CPU governor → ASPM → powertop → USB/磁盘/网卡逐项处理。
  3. 可回滚:每个配置都知道怎么撤销,出现掉盘、断网、VM 卡顿时能快速恢复。

最终推荐配置:

项目推荐值备注
CPU governorpowersave / schedutil以平台支持为准
C-State不限制移除 max_cstate=1idle=poll
PCIe ASPMpcie_aspm.policy=powersave谨慎使用 force
Powertopauto-tune + udev 排除关键 USB不要无脑全自动
SATA LPMmed_power_with_dipm掉盘就回退
HDD spindown仅备份盘/冷数据盘启用ZFS 主池不建议
网卡 EEE管理口可开,软路由口谨慎Realtek 2.5G 多观察

低功耗不是玄学,也不是只靠 BIOS 里点几个选项。只要按“测量 → 修改 → 观察 → 持久化”的流程走,一台 PVE 小主机从 25W35W 降到 10W18W 是很现实的;更重要的是,它会更安静、更凉,也更适合真正长期运行在家里的 Homelab。

Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackJimmy 设计