Proxmox VE9.0优化-功耗切换到智能模式

模式介绍

PVE9.0目前支持下面几种模式,初始安装默认是performance。

  1. performance (高性能, 频率接近最大值。PVE默认/推荐)
  2. powersave (低功耗, 频率接近最低值)
  3. ondemand (动态调节, 负载高时升频。旧版内核)
  4. schedutil (智能调节, 根据调度器智能调节。新版内核推荐)

在个人PVE服务器上,AMD Ryzen 7 8745H功耗为3.28W,这支持amd-pstate-epp,自动调整功耗,最佳模式是performance。但是老型号的CPU没有自动调节,因此需要软调节,软调节如下:

这几个模式的对比如下:

  1. performance (默认的):

    • 原理: 强制 CPU 频率保持在或接近最大值 (4966 Mhz)。

    • 优点: 零延迟。一旦有任务,CPU 立即全速处理。

    • 缺点: 极其浪费电。即使 CPU 0% 负载,它也保持高频率,就像一辆在等红灯时还猛踩油门的跑车。

  2. powersave:

    • 原理: 强制 CPU 频率保持在或接近最小值 (400 Mhz)。

    • 优点: 最省电

    • 缺点: 性能极差,延迟极高。当你突然需要性能时(比如打开 PVE 界面,或 VM 突发一个任务),CPU 会"反应不过来",导致整个系统感觉非常卡顿。这是以牺牲所有性能为代价来省电,性价比很低

  3. schedutil (PVE 8.x 和新内核的推荐):

    • 原理: 智能调节。这是 ondemand 的进化版,它直接与 Linux 内核的任务调度器(scheduler)集成。

    • 优点: 完美平衡。

      • 空闲时: 它会自动降到最低频率(像 powersave 一样省电)。

      • 需要时: 它能根据任务的实际需求瞬间智能地提升到所需的频率。

    • 结论: 这是最符合“功耗性价比最佳” 需求的模式。它在空闲时提供了 powersave 的低功耗,又在需要时提供 了 performance 的高响应速度。

所以,切换到 schedutil 模式。

模式切换Bash脚本

这个脚本会自动:

  1. 检查是否以 root 权限运行(PVE上修改系统配置必须是root)。

  2. 检查并自动安装 cpufrequtils,这是在Debian系(PVE基于Debian)上管理CPU模式的标准工具。

  3. 显示提到的四种模式菜单。

  4. 将选择永久写入 /etc/default/cpufrequtils 配置文件。

  5. 立即应用选择的模式到所有CPU核心。

  6. 重启并启用 cpufrequtils 服务,确保设置在PVE重启后依然生效。


脚本内容

  1. 登录PVE Shell:

    通过网页UI > 数据中心 > pve (您的节点) > Shell。或者通过SSH登录。

    必须以 root 用户身份登录。

  2. 创建脚本文件:

    vim set-pve-governor.sh
    
  3. 粘贴代码:

    将下面“脚本内容”区域中的所有代码复制并粘贴到 vim 编辑器中。

#!/bin/bash

# ==========================================================
# PVE 9.0+ CPU Governor 永久切换脚本 (v2.1 - 修正语法错误)
# ==========================================================

# 1. 权限检查:必须以 root 身份运行
if [ "$(id -u)" -ne 0 ]; then
    echo "错误:此脚本必须以 root 权限运行。"
    echo "您当前已经是 root,请直接运行 './set-pve-governor.sh'"
    exit 1
fi

# 定义服务名称和路径
SERVICE_NAME="set-cpu-governor.service"
SERVICE_PATH="/etc/systemd/system/$SERVICE_NAME"
AVAILABLE_GOVERNORS=""
CURRENT_GOVERNOR=""

# 2. 显示当前设置
echo "---------------------------------------"
echo "正在检查可用的 CPU 模式..."
if [ -f "/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors" ]; then
    AVAILABLE_GOVERNORS=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors)
    echo "当前系统支持的模式: $AVAILABLE_GOVERNORS"
    CURRENT_GOVERNOR=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor)
    echo "当前 CPU 模式 (CPU0): $CURRENT_GOVERNOR"
else
    echo "警告:无法读取 CPU 模式信息。您的 CPU 可能不支持频率调节。"
fi
echo "---------------------------------------"


# 3. 显示菜单
echo "请选择要永久设置的 PVE CPU 模式:"
echo ""
echo "  1) performance  (高性能, 频率接近最大值。PVE默认/推荐)"
echo "  2) powersave    (低功耗, 频率接近最低值)"
echo "  3) ondemand     (动态调节, 负载高时升频。旧版内核)"
echo "  4) schedutil    (智能调节, 根据调度器智能调节。新版内核推荐)"
echo ""
echo "  q) 退出,不作任何更改"
echo ""
read -p "请输入选项 [1-4 或 q]: " choice

# 4. 处理用户输入
GOVERNOR_TO_SET=""
case $choice in
    1)
        GOVERNOR_TO_SET="performance"
        ;;
    2)
        GOVERNOR_TO_SET="powersave"
        ;;
    3)
        GOVERNOR_TO_SET="ondemand"
        ;;
    # 
    # v2.1 修正:这里从 4. 更改为 4)
    # 
    4)
        GOVERNOR_TO_SET="schedutil"
        ;;
    q|Q)
        echo "操作已取消。"
        exit 0
        ;;
    *)
        echo "错误:无效的选项。"
        exit 1
        ;;
esac

# 检查所选模式是否受支持
if ! echo "$AVAILABLE_GOVERNORS" | grep -q "$GOVERNOR_TO_SET"; then
    echo ""
    echo "!!! 警告:您选择了 '$GOVERNOR_TO_SET' !!!"
    echo "    但您的系统报告仅支持: $AVAILABLE_GOVERNORS"
    echo ""
    read -p "您确定要强行继续吗? (这很可能会失败) (y/N): " confirm
    if [[ "$confirm" != "y" ]] && [[ "$confirm" != "Y" ]]; then
        echo "操作已取消。"
        exit 0
    fi
fi

echo "您选择了: $GOVERNOR_TO_SET"
echo "---------------------------------------"

# 5. 立即应用更改
echo "正在立即应用 '$GOVERNOR_TO_SET' 模式到所有CPU核心..."
# 使用 'tee' 一次性写入所有核心,并抑制错误输出以便单独处理
if ! echo "$GOVERNOR_TO_SET" | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor > /dev/null 2>&1; then
    echo ""
    echo "错误:立即应用模式失败!"
    echo "这通常是因为您的系统不支持 '$GOVERNOR_TO_SET' 模式。"
    echo "请重新运行脚本并选择一个支持的模式: $AVAILABLE_GOVERNORS"
    exit 1
fi
echo "立即应用完成。"


# 6. 创建 systemd 服务文件
echo "正在创建永久性 systemd 服务: $SERVICE_PATH"

# 使用 'tee' 命令来写入,'EOF' 前的 '-' 可以允许我们使用 Tab 缩进
tee "$SERVICE_PATH" > /dev/null <<-'EOF'
[Unit]
Description=Set CPU Governor to desired mode on boot
After=network.target

[Service]
Type=oneshot
RemainAfterExit=true
# 'ExecStart' 将在下面被动态替换
ExecStart=

[Install]
WantedBy=multi-user.target
EOF

# 使用 sed 动态插入正确的 ExecStart 命令
# 注意: 'tee' 命令需要绝对路径 /usr/bin/tee
sed -i "s|^ExecStart=.*$|ExecStart=/bin/sh -c 'echo $GOVERNOR_TO_SET | /usr/bin/tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor'|" "$SERVICE_PATH"

echo "服务文件创建成功。"

# 7. 重载 systemd 并启用服务
echo "正在重载 systemd 并启用服务..."
systemctl daemon-reload
systemctl enable "$SERVICE_NAME"
# (可选) 立即启动服务以确认其工作,尽管我们已经手动应用了
systemctl restart "$SERVICE_NAME" 

echo "======================================="
echo "✅ 操作成功!"
echo "已永久设置 CPU 模式为 '$GOVERNOR_TO_SET'。"
echo ""
echo "当前 CPU 模式 (以 CPU0 为例):"
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo ""
echo "服务状态 (systemctl status $SERVICE_NAME):"
systemctl status --no-pager "$SERVICE_NAME" | grep -E "Loaded|Active"

exit 0

  1. 给脚本添加执行权限

    chmod +x set-pve-governor.sh
    
  2. 运行脚本

    ./set-pve-governor.sh
    

之后,只需按照脚本的菜单提示(输入1、2、3或4)即可完成永久切换。

注意

root@pve:~/document/set-pve-governor# ./set-pve-governor.sh
---------------------------------------
正在检查可用的 CPU 模式...
当前系统支持的模式: performance powersave
当前 CPU 模式 (CPU0): performance
---------------------------------------
请选择要永久设置的 PVE CPU 模式:

  1) performance  (高性能, 频率接近最大值。PVE默认/推荐)
  2) powersave    (低功耗, 频率接近最低值)
  3) ondemand     (动态调节, 负载高时升频。旧版内核)
  4) schedutil    (智能调节, 根据调度器智能调节。新版内核推荐)

  q) 退出,不作任何更改

请输入选项 [1-4 或 q]: 4

!!! 警告:您选择了 'schedutil' !!!
    但您的系统报告仅支持: performance powersave

您确定要强行继续吗? (这很可能会失败) (y/N): n
操作已取消。

PVE 9.0 (以及它的新内核) 100% 支持 schedutil。但我的 CPU 硬件驱动 告诉内核,它不需要 schedutil,因为它有更好、更底层的管理方式。

因此看到的 当前系统支持的模式: performance powersave 是最理想的情况,并自动启用了 AMD 最新的CPU频率管理驱动:amd_pstate

1. 新驱动 amd_pstate vs 旧驱动 acpi-cpufreq

  • acpi-cpufreq (旧驱动):

    • 这是通用的 Linux 驱动。

    • 它提供 schedutil, ondemand, powersave, performance 等模式,让操作系统 (OS) 来“猜”并“命令”CPU 该做什么。

    • schedutil 是这个旧驱动里最好的“软件调节”模式。

  • amd_pstate (新驱动):

    • 这是 AMD 专为 Ryzen CPU 开发的现代驱动。

    • 它利用了 AMD CPU 内置的硬件电路 (称为 CPPC - Collaborative Processor Performance Control)自我管理频率。

    • CPU 硬件自己管理频率,远比操作系统“猜”要快得多、高效得多。

2. 为什么 amd_pstate 只有两个模式?

amd_pstate 驱动以其最高效的 “主动模式” (active mode / EPP) 运行时(PVE 9.0 内核对 8745H 默认就是这样做的),它不再需要 schedutil 这样的“软件调度器”。

它只向操作系统提供两种“策略”:

  1. performance (应该选的)

    • 误解: 这不是“始终跑在 100% 频率”。

    • 实际含义: “CPU,请你使用你内置的 CPPC 硬件算法,在最低功耗和最高睿频(Turbo)之间全速、自由地动态调节,目标是实现最大性能。”

    • 它在空闲时依然会降频,在需要性能时会瞬间飙升。这比 schedutil 更快、更省电。

  2. powersave

    • 实际含义: “CPU,请你同样使用 CPPC 硬件算法,但请限制最高频率,目标是优先省电。”

验证方法

  1. 检查正在使用的驱动:

    cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_driver
    
    • 输出应该会是:amd_pstateamd-pstate-epp
  2. 检查 amd_pstate 的运行状态:

    cat /sys/devices/system/cpu/amd_pstate/status
    
    • 输出应该会是:active (这代表最高效的 EPP 硬件模式)

1. scaling_driver: amd-pstate-epp

  • amd-pstate:正在使用 AMD 的现代 CPU 驱动。

  • -epp (Energy Performance Preference):这代表驱动正运行在最新的“硬件首选”模式下。

2. status: active

  • 这确认了 amd-pstate 驱动程序正处于活动状态,并以 EPP 模式在工作。

模式对比 (AMD 版)

驱动 amd_pstate (在 "active" 模式下) acpi-cpufreq (旧系统/驱动)
管理方 CPU 硬件 (CPPC) 操作系统 (OS)
最佳性能模式 performance (硬件智能调节) schedutil (软件智能调节)
支持的模式 performance, powersave performance, powersave, ondemand, schedutil

总结: PVE 9.0 内核正确识别了新 CPU,并配置了最佳的驱动。只需要在脚本中选择 1 (performance) 即可获得最佳性能(并且在空闲时自动省电)。

posted @ 2025-11-14 14:45  舟清颺  阅读(4)  评论(0)    收藏  举报