前言
很多人搭 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-State | CPU 温度 | 备注 |
|---|
| 调优前 | 例如 28W | C3 | 48℃ | 默认安装 |
| CPU 调优后 | 例如 22W | C6/C8 | 43℃ | governor 调整 |
| ASPM 后 | 例如 16W | C8/C10 | 39℃ | PCIe 链路省电 |
| powertop 后 | 例如 13W | C10 | 36℃ | 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 active | powersave / performance | Homelab 推荐 powersave |
Intel/AMD acpi-cpufreq | ondemand / schedutil / performance | 推荐 schedutil 或 ondemand |
新内核 AMD amd-pstate | schedutil / 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
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
| GRUB_CMDLINE_LINUX_DEFAULT="quiet pcie_aspm.policy=powersave"
|
应用:
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
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 分钟 | 无 |
| 2 | CPU governor 改为 powersave/schedutil | 24 小时 | 低 |
| 3 | 临时启用 ASPM powersave | 24~48 小时 | 低 |
| 4 | 临时执行 powertop auto-tune | 24 小时 | 中 |
| 5 | 排除关键 USB 设备 autosuspend | 24 小时 | 低 |
| 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 更耗电。
验证还是用:
看 Idle stats,而不是只看 watch grep MHz /proc/cpuinfo。
总结
PVE Homelab 低功耗调优的核心不是“把所有省电选项都打开”,而是三句话:
- 先测量:用智能插座、powertop、sensors 建立基线。
- 分阶段:CPU governor → ASPM → powertop → USB/磁盘/网卡逐项处理。
- 可回滚:每个配置都知道怎么撤销,出现掉盘、断网、VM 卡顿时能快速恢复。
最终推荐配置:
| 项目 | 推荐值 | 备注 |
|---|
| CPU governor | powersave / schedutil | 以平台支持为准 |
| C-State | 不限制 | 移除 max_cstate=1、idle=poll |
| PCIe ASPM | pcie_aspm.policy=powersave | 谨慎使用 force |
| Powertop | auto-tune + udev 排除关键 USB | 不要无脑全自动 |
| SATA LPM | med_power_with_dipm | 掉盘就回退 |
| HDD spindown | 仅备份盘/冷数据盘启用 | ZFS 主池不建议 |
| 网卡 EEE | 管理口可开,软路由口谨慎 | Realtek 2.5G 多观察 |
低功耗不是玄学,也不是只靠 BIOS 里点几个选项。只要按“测量 → 修改 → 观察 → 持久化”的流程走,一台 PVE 小主机从 25W35W 降到 10W18W 是很现实的;更重要的是,它会更安静、更凉,也更适合真正长期运行在家里的 Homelab。