模式介绍
PVE9.0目前支持下面几种模式,初始安装默认是performance。
- performance (高性能, 频率接近最大值。PVE默认/推荐)
- powersave (低功耗, 频率接近最低值)
- ondemand (动态调节, 负载高时升频。旧版内核)
- schedutil (智能调节, 根据调度器智能调节。新版内核推荐)
在个人PVE服务器上,AMD Ryzen 7 8745H功耗为3.28W,这支持amd-pstate-epp,自动调整功耗,最佳模式是performance。但是老型号的CPU没有自动调节,因此需要软调节,软调节如下:
这几个模式的对比如下:
-
performance(默认的):-
原理: 强制 CPU 频率保持在或接近最大值 (4966 Mhz)。
-
优点: 零延迟。一旦有任务,CPU 立即全速处理。
-
缺点: 极其浪费电。即使 CPU 0% 负载,它也保持高频率,就像一辆在等红灯时还猛踩油门的跑车。
-
-
powersave:-
原理: 强制 CPU 频率保持在或接近最小值 (400 Mhz)。
-
优点: 最省电。
-
缺点: 性能极差,延迟极高。当你突然需要性能时(比如打开 PVE 界面,或 VM 突发一个任务),CPU 会"反应不过来",导致整个系统感觉非常卡顿。这是以牺牲所有性能为代价来省电,性价比很低。
-
-
schedutil(PVE 8.x 和新内核的推荐):-
原理: 智能调节。这是
ondemand的进化版,它直接与 Linux 内核的任务调度器(scheduler)集成。 -
优点: 完美平衡。
-
空闲时: 它会自动降到最低频率(像
powersave一样省电)。 -
需要时: 它能根据任务的实际需求瞬间、智能地提升到所需的频率。
-
-
结论: 这是最符合“功耗性价比最佳” 需求的模式。它在空闲时提供了
powersave的低功耗,又在需要时提供 了performance的高响应速度。
-
所以,切换到 schedutil 模式。
模式切换Bash脚本
这个脚本会自动:
-
检查是否以 root 权限运行(PVE上修改系统配置必须是root)。
-
检查并自动安装
cpufrequtils,这是在Debian系(PVE基于Debian)上管理CPU模式的标准工具。 -
显示提到的四种模式菜单。
-
将选择永久写入
/etc/default/cpufrequtils配置文件。 -
立即应用选择的模式到所有CPU核心。
-
重启并启用
cpufrequtils服务,确保设置在PVE重启后依然生效。
脚本内容
-
登录PVE Shell:
通过网页UI > 数据中心 > pve (您的节点) > Shell。或者通过SSH登录。
必须以 root 用户身份登录。
-
创建脚本文件:
vim set-pve-governor.sh -
粘贴代码:
将下面“脚本内容”区域中的所有代码复制并粘贴到 vim 编辑器中。
#!/bin/bash# ==========================================================
# PVE 9.0+ CPU Governor 永久切换脚本 (v2.1 - 修正语法错误)
# ==========================================================# 1. 权限检查:必须以 root 身份运行
if [ "$(id -u)" -ne 0 ]; thenecho "错误:此脚本必须以 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" ]; thenAVAILABLE_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"
elseecho "警告:无法读取 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 in1)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"; thenecho ""echo "!!! 警告:您选择了 '$GOVERNOR_TO_SET' !!!"echo " 但您的系统报告仅支持: $AVAILABLE_GOVERNORS"echo ""read -p "您确定要强行继续吗? (这很可能会失败) (y/N): " confirmif [[ "$confirm" != "y" ]] && [[ "$confirm" != "Y" ]]; thenecho "操作已取消。"exit 0fi
fiecho "您选择了: $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; thenecho ""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
-
给脚本添加执行权限:
chmod +x set-pve-governor.sh -
运行脚本:
./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 这样的“软件调度器”。
它只向操作系统提供两种“策略”:
-
performance(应该选的)-
误解: 这不是“始终跑在 100% 频率”。
-
实际含义: “CPU,请你使用你内置的 CPPC 硬件算法,在最低功耗和最高睿频(Turbo)之间全速、自由地动态调节,目标是实现最大性能。”
-
它在空闲时依然会降频,在需要性能时会瞬间飙升。这比
schedutil更快、更省电。
-
-
powersave- 实际含义: “CPU,请你同样使用 CPPC 硬件算法,但请限制最高频率,目标是优先省电。”
验证方法
-
检查正在使用的驱动:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_driver- 输出应该会是:
amd_pstate或amd-pstate-epp
- 输出应该会是:
-
检查
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) 即可获得最佳性能(并且在空闲时自动省电)。