本文面向的群体为有一定基础的用户,主要目的在于如何在尽量不损失性能的前提下降低All In One服务器的待机功耗,而非All In One的具体配置教程

通过文中的方法,我将All In One服务器的待机功耗从70.2W降低到39W,降低幅度约为40%,每月可以节省约20度电

前言

All In One服务器的核心就三点:存储、虚拟机、Docker,对于普通家庭用户来说,还有另外三个要求:低成本、低功耗、高稳定度,因此,选择合适的硬件配置和底层系统就显得尤为重要。即使是All In One服务器,功能的解耦也相当重要,应尽量避免因单一功能故障导致的整体崩溃,专业的系统应当做专业的事,而不应该全部集中于某一系统。基于以上的观点,我选择了PVE作为All In One的底层系统,虚拟化Unraid作为Nas系统,硬件则是升级电脑退役下来的旧硬件。

为什么使用PVE而不直接使用Unraid作为底层?

常见的底层系统有:Esxi、PVE、Unraid

PVE是开源的虚拟化平台,与Unraid同样采用kvm虚拟化技术,可以为普通用户提供相比Unraid更高的自由度和更直观的虚拟机管理界面,其基于Debian也可以为用户提供更为广泛且适用的教程,比Esxi更简单易用,比Unraid更专业。且原生支持lxc,lxc是一种类似于Docker的容器技术,可以在服务器上实现更为轻量化的应用,相比虚拟机对资源的消耗低,相比Docker避免了对底层系统的污染,从而实现不错的稳定性。

为什么使用Unraid作为Nas系统?

常见的Nas系统有:黑群晖、Truenas、Unraid

Unraid将硬盘以非raid的形式向用户提供存储空间,这使得用户可以使用不同种类、不同容量的硬盘,同时也能保障数据的安全性,其非raid的存储形式和独有的缓存机制使得数据在读写时仅有部分硬盘工作,其它硬盘休眠,甚至可以实现日常状态下高功耗的HDD全部休眠,仅保留低功耗的SSD工作,在闲时将数据集中回写至HDD中,避免HDD长时间唤醒和短时间多次休眠,相比其它基于raid的Nas系统,可以在家庭场景下实现低成本和低功耗。

这里贴一个 在 PVE 中创建 Unraid 虚拟机并使用虚拟磁盘启动 Unraid 虚拟机 的方法

降低CPU功耗

与常见的使用低功耗CPU不同,我选择从软件上降低CPU的功耗,便于从旧硬件改造为All In One服务器。

另外,我也想在此吐槽选择所谓低功耗CPU这个观点,通常情况下同代CPU架构下,CPU的能效基本相同,而带T的低功耗CPU是通过限制TDP来降低功耗,选择低功耗CPU只会让你花更多的钱买到更低的性能。结尾的展示可以映证这一观点,Arm平台不在这次吐槽范围内。

1. 虚拟机配置

给虚拟机配置合适的资源(CPU、内存),分配给虚拟机的资源不是越多越好,分配的更多资源会增大CPU的负载,可以先分配足够多的资源给虚拟机,再根据实际的占用情况进行缩减。尽量使用直通硬件(网卡、硬盘控制器)或半虚拟化硬件(virtio),虚拟化硬件会增大CPU的负载。

尽量不要运行非Linux内核的系统(Windows、FreeBSD等),虚拟化非Linux内核的系统会增加功耗。(或许是我装过的Windows 10和Truenas core都恰好消耗资源多?)

2024.8.28补充

确认了是Windows 10的问题,换了Windows Server 2019后功耗显著降低

2. 调节CPU频率策略

PVE默认的CPU频率策略为performance,即高性能模式,这是一种激进的频率策略,会让CPU尽量保持在高频运行。

查看CPU频率策略

1
2
3
4
5
6
7
8
# 查看支持的 CPU 电源模式
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors

# 查看当前的 CPU 电源模式
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

# 为了调整频率策略,需要安装软件包
apt install cpufrequtils linux-cpupower

值得注意的是,新旧平台上使用的调频驱动不同,较新平台上使用的调频驱动为pstate,旧平台上使用的调频驱动cpufreq

1
2
3
# 查看调频驱动
root@pve:~# cpupower frequency-info | grep driver
driver: intel_pstate

在这两种驱动下的频率策略不同,在pstate下可以选择的策略一般只有powersaveperformance,建议选择powersave,在cpufreq下可以选择的策略一般有conservativeondemanduserspacepowersaveperformanceschedutil,建议选择schedutilconservative。在pstatecpufreq下的powersave并非同一种策略。

不建议新平台禁用pstate使用cpufreq驱动,故不在本文中提供方法。

临时调整策略

1
2
3
4
5
6
7
8
# 全核性能
cpupower frequency-set -g performance

# 全核省电
cpupower frequency-set -g powersave

# 0-15核开启性能
cpupower -c 0-15 frequency-set -g performance

开机自动调整策略

1
2
3
4
5
# 配置默认策略
echo 'GOVERNOR=powersave' > /etc/default/cpufrequtils

# 开启自动调整
systemctl enable cpufrequtils

为不同核心配置不同的策略

我们可以将重要的虚拟机进行核心绑定,然后将其调整为performance以保证关键功能的流畅运行。

虚拟机-硬件-处理器配置核心绑定
image

需要注意的是,应尽量让同一物理核上的逻辑核的调频策略一致,即将核心绑定在同一物理核上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 查看逻辑核对应的物理核
root@pve:~# lscpu -e
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ
0 0 0 0 0:0:0:0 yes 4800.0000 800.0000 4030.0720
1 0 0 1 1:1:1:0 yes 4800.0000 800.0000 4294.3149
2 0 0 2 2:2:2:0 yes 5000.0000 800.0000 4539.7510
3 0 0 3 3:3:3:0 yes 5000.0000 800.0000 4313.2871
4 0 0 4 4:4:4:0 yes 4800.0000 800.0000 4546.8701
5 0 0 5 5:5:5:0 yes 4800.0000 800.0000 4561.5659
6 0 0 6 6:6:6:0 yes 4800.0000 800.0000 4264.5469
7 0 0 7 7:7:7:0 yes 4800.0000 800.0000 4258.8208
8 0 0 0 0:0:0:0 yes 4800.0000 800.0000 1235.3180
9 0 0 1 1:1:1:0 yes 4800.0000 800.0000 4535.1699
10 0 0 2 2:2:2:0 yes 5000.0000 800.0000 4571.8179
11 0 0 3 3:3:3:0 yes 5000.0000 800.0000 4601.3188
12 0 0 4 4:4:4:0 yes 4800.0000 800.0000 800.0000
13 0 0 5 5:5:5:0 yes 4800.0000 800.0000 800.0000
14 0 0 6 6:6:6:0 yes 4800.0000 800.0000 4597.3101
15 0 0 7 7:7:7:0 yes 4800.0000 800.0000 3713.7241

# 观察命令输出中CORE一列的ID
# 在上述例子中,CPU0和8是同一颗物理核,CPU1和9是同一颗物理核

调整部分核心的策略

1
2
# 将CPU7和15调整为性能模式
cpupower -c 7,15 frequency-set -g performance

自动调整虚拟机绑定核的策略

利用PVE的钩子脚本可以实现虚拟机开机时调整为性能模式,关机时调整为省电模式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 创建脚本
cat > /var/lib/vz/snippets/cpupower.sh << "EOF"
#!/bin/bash
vmid=$1
status=$2

cpupin=`qm config $vmid|grep affin|awk '{print $2}'`
echo $status
if [ "$status" == "pre-start" ];then
cpupower -c $cpupin frequency-set -g performance
fi

if [ "$status" == "post-stop" ];then
cpupower -c $cpupin frequency-set -g powersave
fi
EOF

# 赋予执行权限
chmod +x /var/lib/vz/snippets/cpupower.sh

# 给对应虚拟机设置钩子脚本
qm set 100 --hookscript local:snippets/cpupower.sh

有一个问题是不同虚拟机绑定同一核心时会产生影响。

3. 开启CPU的C状态支持

C状态是CPU的睡眠状态,可以使CPU在空闲时睡眠以降低功耗,主板BIOS一般默认开启了部分的C状态支持,进入BIOS可以开启更多的C状态支持,允许CPU进入更深的睡眠状态。需要注意的是,从更深的睡眠状态恢复需要更长时间,请酌情开启。

进入BIOS后,进入CPU配置,开启相关选项,一般位于高级-CPU配置
重要!开启前请确认你的CPU是否支持对应选项
image

4. [可选] CPU降压

效果因人而异,能否降压取决于你的CPU和主板,自行研究。

降低周边设备功耗

周边设备的功耗在待机状态下占比相当大,这部分依然是通过软件调节功耗,我的理念是尽量利用旧硬件,因此硬件选择不在讨论范围内。

1. Unraid设置硬盘休眠和缓存盘

设置-磁盘设置 设置硬盘休眠
image
添加SSD作为缓存盘
image
设置常用共享目录优先写入缓存盘
image
设置-计划程序 设置移动器定时回写数据
image

2. 优化独显待机功耗

由于我的机器没有独显,这一段仅供参考

独立显卡会默认被PVE加载,可以通过在/etc/default/grub中的GRUB_CMDLINE_LINUX_DEFAULT加入如下参数来关闭显卡

1
video=vesafb:off video=efifb:off video=simplefb:off initcall_blacklist=sysfb_init

加入后我的GRUB_CMDLINE_LINUX_DEFAULT如下

1
2
root@pve:~# cat /etc/default/grub | grep 'GRUB_CMDLINE_LINUX_DEFAULT'
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt pcie_acs_override=downstream i915.enable_gvt=1 video=vesafb:off video=efifb:off video=simplefb:off initcall_blacklist=sysfb_init"

改完后执行update-grub更新一下配置文件,然后重启

3. 配置Linux的设备电源管理策略

Linux默认的设备电源管理策略比较奔放,不如Windows和Mac来的精细,不过可以通过命令调整
重要! 脚本中的PCIE设备电源管理默认是注释掉的,因为某些PCIE设备设置电源管理后可能会导致虚拟机无法开机,请确认后再取消注释

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
# 创建脚本
cat > /var/lib/vz/snippets/device_powersave.sh << "EOF"
#!/bin/bash
set +e
vmid=$1
status=$2

echo $status
if [ "$status" == "pre-start" ];then
# Intel核显电源管理
echo auto | tee /sys/bus/i2c/devices/i2c-*/device/power/control
# USB电源管理
echo auto | tee /sys/bus/usb/devices/*/power/control
# 硬盘电源管理
echo auto | tee /sys/block/sd*/device/power/control
echo auto | tee /sys/block/nvme*/device/power/control
fi
if [ "$status" == "post-start" ];then
:
# PCIE设备电源管理
# echo auto | tee /sys/bus/pci/devices/????:??:??.?/power/control
# echo auto | tee /sys/bus/pci/devices/????:??:??.?/ata*/power/control
fi
set -e
EOF

# 赋予执行权限
chmod +x /var/lib/vz/snippets/device_powersave.sh

给启动顺序中第一个使用到直通设备的虚拟机设置钩子脚本,比如我的是Unraid,这样就会在虚拟机占用设备之前完成设置

1
qm set 105 --hookscript local:snippets/device_powersave.sh

4. 开启PCI Express Native Control和PCIE ASPM Support

开启可提升PCIE设备在操作系统中的节能性能,一般位于主板BIOS的高级-芯片组配置
image

5. 开启SATA主动式链接电源管理

允许SATA设备在不活动期间进入低能耗以达到节能目的,一般位于高级-存储配置
image

成果展示

调整前整机功耗70.2W,CPU功耗18W,调整后整机功耗39W,CPU功耗12W,受限于UPS电源的功耗测量精度,整机功耗误差为±3.9W,降低幅度约为40%,每月可以节省约20度电

  • 调整前before

  • 调整后after

硬件配置

只罗列了与功耗相关的部分

CPU i9-11900K ES QV1K
主板 华擎Z590M-ITX/ax
内存 金百达银爵DDR4 16G×2 3200MHz
网卡 Intel I219V(板载)
RTL8125BG(板载)
Mellanox MCX4121A
硬盘 傲腾900P 280G
三星PM9A1 512G
希捷ST4000VX015 4T×4
风扇 4090风扇改12018 ×2
利民TL-8015W
利民TL-B8W
电源 Tt钢影SFX 550W

运行的虚拟机&容器

虚拟机 OpenWrt
Unraid
Ubuntu 服务器
黑群晖(嵌套于Unraid内)
Clear Linux 测试机
容器 Ubuntu Docker 环境隔离
Alpine SSH 跳板机
Alpine Web 跳板机
Debian Minecraft 服务器

2024.8.25补充

智能插座统计的一天下来UPS+AIO的总功耗,AIO有约100GB的文件写入到机械硬盘
image

参考文章

功耗节能 - 国光的 PVE 环境搭建教程
佛西博客 - Proxmox VE 调节cpu频率
Unraid NAS怎么省电
华擎Z590M-ITX/ax BIOS 设定指南