问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

家用 All In One NAS 服务器的降低待机功耗指南

创作时间:
作者:
@小白创作中心

家用 All In One NAS 服务器的降低待机功耗指南

引用
1
来源
1.
https://lyxot.github.io/blog/2024/08/23/%E5%AE%B6%E7%94%A8_All_In_One_Nas_%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E9%99%8D%E4%BD%8E%E5%BE%85%E6%9C%BA%E5%8A%9F%E8%80%97%E6%8C%87%E5%8D%97/

本文面向有一定技术基础的用户,主要介绍如何在不损失性能的前提下降低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下可以选择的策略一般只有powersaveperformance,建议选择powersave。在cpufreq下可以选择的策略一般有conservativeondemanduserspacepowersaveperformanceschedutil,建议选择schedutilconservative。在pstatecpufreq下的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的文件写入到机械硬盘

参考文章

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号