家用 All In One NAS 服务器的降低待机功耗指南
家用 All In One NAS 服务器的降低待机功耗指南
本文面向有一定技术基础的用户,主要介绍如何在不损失性能的前提下降低All In One服务器的待机功耗。通过文中方法,作者将服务器待机功耗从70.2W降至39W,每月节省约20度电。
前言
All In One服务器的核心功能包括存储、虚拟机和Docker。对于普通家庭用户来说,低成本、低功耗和高稳定度是重要需求。因此,选择合适的硬件配置和底层系统至关重要。基于以上观点,作者选择了PVE作为底层系统,虚拟化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频率策略
# 查看支持的 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
。
# 查看调频驱动
root@pve:~# cpupower frequency-info | grep driver
driver: intel_pstate
在这两种驱动下的频率策略不同,在pstate
下可以选择的策略一般只有powersave
和performance
,建议选择powersave
。在cpufreq
下可以选择的策略一般有conservative
、ondemand
、userspace
、powersave
、performance
、schedutil
,建议选择schedutil
或conservative
。在pstate
和cpufreq
下的powersave
并非同一种策略。
不建议新平台禁用pstate
使用cpufreq
驱动,故不在本文中提供方法。
临时调整策略
# 全核性能
cpupower frequency-set -g performance
# 全核省电
cpupower frequency-set -g powersave
# 0-15核开启性能
cpupower -c 0-15 frequency-set -g performance
开机自动调整策略
# 配置默认策略
echo 'GOVERNOR=powersave' > /etc/default/cpufrequtils
# 开启自动调整
systemctl enable cpufrequtils
为不同核心配置不同的策略
我们可以将重要的虚拟机进行核心绑定,然后将其调整为performance
以保证关键功能的流畅运行。在虚拟机-硬件-处理器
配置核心绑定
需要注意的是,应尽量让同一物理核上的逻辑核的调频策略一致,即将核心绑定在同一物理核上。
# 查看逻辑核对应的物理核
root@pve:~# lscpu -e
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ
0 0 0 0 0:0:0:0yes4800.0000 800.0000 4030.0720
1 0 0 1 1:1:1:0yes4800.0000 800.0000 4294.3149
2 0 0 2 2:2:2:0yes5000.0000 800.0000 4539.7510
3 0 0 3 3:3:3:0yes5000.0000 800.0000 4313.2871
4 0 0 4 4:4:4:0yes4800.0000 800.0000 4546.8701
5 0 0 5 5:5:5:0yes4800.0000 800.0000 4561.5659
6 0 0 6 6:6:6:0yes4800.0000 800.0000 4264.5469
7 0 0 7 7:7:7:0yes4800.0000 800.0000 4258.8208
8 0 0 0 0:0:0:0yes4800.0000 800.0000 1235.3180
9 0 0 1 1:1:1:0yes4800.0000 800.0000 4535.1699
10 0 0 2 2:2:2:0yes5000.0000 800.0000 4571.8179
11 0 0 3 3:3:3:0yes5000.0000 800.0000 4601.3188
12 0 0 4 4:4:4:0yes4800.0000 800.0000 800.0000
13 0 0 5 5:5:5:0yes4800.0000 800.0000 800.0000
14 0 0 6 6:6:6:0yes4800.0000 800.0000 4597.3101
15 0 0 7 7:7:7:0yes4800.0000 800.0000 3713.7241
# 观察命令输出中CORE一列的ID
# 在上述例子中,CPU0和8是同一颗物理核,CPU1和9是同一颗物理核
# 调整部分核心的策略
cpupower -c 7,15 frequency-set -g performance
自动调整虚拟机绑定核的策略
利用PVE的钩子脚本可以实现虚拟机开机时调整为性能模式,关机时调整为省电模式。
# 创建脚本
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是否支持对应选项
4. [可选] CPU降压
效果因人而异,能否降压取决于你的CPU和主板,自行研究。
降低周边设备功耗
周边设备的功耗在待机状态下占比相当大,这部分依然是通过软件调节功耗,我的理念是尽量利用旧硬件,因此硬件选择不在讨论范围内。
1. Unraid设置硬盘休眠和缓存盘
设置-磁盘设置
设置硬盘休眠
添加SSD作为缓存盘
设置常用共享目录优先写入缓存盘
设置-计划程序
设置移动器定时回写数据
2. 优化独显待机功耗
由于我的机器没有独显,这一段仅供参考
独立显卡会默认被PVE加载,可以通过在/etc/default/grub
中的GRUB_CMDLINE_LINUX_DEFAULT
加入如下参数来关闭显卡
video=vesafb:off video=efifb:off video=simplefb:off initcall_blacklist=sysfb_init
加入后我的GRUB_CMDLINE_LINUX_DEFAULT
如下
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设备设置电源管理后可能会导致虚拟机无法开机,请确认后再取消注释
# 创建脚本
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,这样就会在虚拟机占用设备之前完成设置
qm set 105 --hookscript local:snippets/device_powersave.sh
4. 开启PCI Express Native Control和PCIE ASPM Support
开启可提升PCIE设备在操作系统中的节能性能,一般位于主板BIOS的高级-芯片组配置
内
5. 开启SATA主动式链接电源管理
允许SATA设备在不活动期间进入低能耗以达到节能目的,一般位于高级-存储配置
内
成果展示
调整前整机功耗70.2W,CPU功耗18W,调整后整机功耗39W,CPU功耗12W,受限于UPS电源的功耗测量精度,整机功耗误差为±3.9W,降低幅度约为40%,每月可以节省约20度电
- 调整前
- 调整后
硬件配置
只罗列了与功耗相关的部分
- 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的文件写入到机械硬盘