Ubuntu Linux 上 固定P/E 核混合架构CPU频率

在 Ubuntu Linux 上,要把 Intel Core i5(14 代,P/E 核混合架构) 的频率尽量固定在 Base~Max Turbo 区间内,可以按下面思路操作。

英特尔CPU信息查看网站:https://www.intel.com/content/www/us/en/products/sku/236777/intel-core-i5-processor-14400f-20m-cache-up-to-4-70-ghz/specifications.html


一、查看当前调频驱动(先确认环境)

先执行:

bash 复制代码
cpupower frequency-info

重点看:

bash 复制代码
driver: intel_pstate   或   acpi-cpufreq

情况 A(最常见,14 代一般是):

bash 复制代码
driver: intel_pstate

用 intel_pstate 控制(推荐方式)

1️⃣ 设为 performance 模式(防止自动降频)

shell 复制代码
sudo cpupower frequency-set -g performance

检查:

bash 复制代码
cpupower frequency-info | grep governor

应为:

bash 复制代码
governor: performance

2️⃣ 关闭节能模式(允许跑满频)

复制代码
echo 0 | sudo tee /sys/devices/system/cpu/intel_pstate/no_turbo
cat /sys/devices/system/cpu/intel_pstate/no_turbo

(0 = 开 Turbo,1 = 禁用 Turbo)

情况 B:

复制代码
driver: acpi-cpufreq

传统方式


二、分别控制 P/E 核(实验级)

1️⃣ 看核心拓扑

bash 复制代码
lscpu -e

输出

复制代码
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE    MAXMHZ   MINMHZ       MHZ
  0    0      0    0 0:0:0:0          yes 4700.0000 800.0000 2500.0249
  1    0      0    0 0:0:0:0          yes 4700.0000 800.0000 2500.0000
  2    0      0    1 4:4:1:0          yes 4700.0000 800.0000 2500.0000
  3    0      0    1 4:4:1:0          yes 4700.0000 800.0000 2500.0000
  4    0      0    2 8:8:2:0          yes 4700.0000 800.0000 2500.0249
  5    0      0    2 8:8:2:0          yes 4700.0000 800.0000 2500.0000
  6    0      0    3 12:12:3:0        yes 4700.0000 800.0000 2500.0000
  7    0      0    3 12:12:3:0        yes 4700.0000 800.0000 2500.0000
  8    0      0    4 16:16:4:0        yes 4700.0000 800.0000 2500.0249
  9    0      0    4 16:16:4:0        yes 4700.0000 800.0000 2499.9741
 10    0      0    5 20:20:5:0        yes 4700.0000 800.0000 2500.0000
 11    0      0    5 20:20:5:0        yes 4700.0000 800.0000 2500.0000
 12    0      0    6 28:28:7:0        yes 3500.0000 800.0000 1799.9860
 13    0      0    7 29:29:7:0        yes 3500.0000 800.0000 1799.9969
 14    0      0    8 30:30:7:0        yes 3500.0000 800.0000 1800.0389
 15    0      0    9 31:31:7:0        yes 3500.0000 800.0000 1799.9760

2️⃣ 分组锁频(示例)

  • cpu0-11 = P 核
  • cpu12-15 = E 核

锁定频率范围:

P 核:
bash 复制代码
sudo cpupower -c 0-11 frequency-set -d 2.5GHz -u 4.7GHz
E 核:
bash 复制代码
sudo cpupower -c 12-15 frequency-set -d 1.8GHz -u 3.5GHz

锁定固定频率(比如Base频率):

P 核:
bash 复制代码
sudo cpupower -c 0-11 frequency-set -d 2.5GHz -u 2.5GHz
E 核:
bash 复制代码
sudo cpupower -c 12-15 frequency-set -d 1.8GHz -u 1.8GHz

⚠️ 注意:

  • 有些主板 BIOS/内核会无视这个
  • intel_pstate 下可能不完全生效

三、验证是否生效


实时看每个核心频率(最直观)

推荐方式一(最简单):

bash 复制代码
watch -n1 "grep MHz /proc/cpuinfo"

每 1 秒刷新一次,看到类似:

复制代码
Every 1.0s: grep MHz /proc/cpuinfo                                                      

cpu MHz         : 2500.025
cpu MHz         : 800.000
cpu MHz         : 2500.000
cpu MHz         : 2500.000
cpu MHz         : 2500.000
cpu MHz         : 2500.000
cpu MHz         : 2500.025
cpu MHz         : 2500.000
cpu MHz         : 2500.025
cpu MHz         : 2500.000
cpu MHz         : 2500.000
cpu MHz         : 2500.000
cpu MHz         : 1799.939
cpu MHz         : 1455.954
cpu MHz         : 1800.040
cpu MHz         : 1799.981

没有完全锁定现象和原因

现在其实是"基本成功的",看数据:

text 复制代码
2500 MHz  → P核 Base ✅
1800 MHz  → E核 Base ✅
800 MHz   → 空闲睡眠态 ⚠️
1455 MHz  → 中间态 ⚠️

说明:

👉 你的锁频 80% 成功了

👉 剩下 20% 是省电机制

从上面的输出可以看到,cpu并没有被真正锁定,这是 正常现象 + intel_pstate 的一个"坑点",不是你没配好。先直接告诉你结论,再解释原因和解决办法。


一句话结论

你看到的:

text 复制代码
800 MHz
1455 MHz

👉 不是锁频失败,而是:

在「空闲 / C-State / 省电状态」下,
Intel CPU 会短暂进入深度节能模式

绕过了 cpupower 的最低频率限制。

所以:

✔️ 有负载 → 回到 2.5 / 1.8 GHz

✔️ 没负载 → 掉到 800MHz(省电)

这是设计行为,不是 bug。


二、为什么会这样?(原理)

在 intel_pstate 下,有 3 套机制同时在管你 CPU:

1️⃣ P-State(频率调节)刚才控制的是这个

text 复制代码
2.5GHz ~ 4.7GHz

2️⃣ C-State(睡眠状态)现在没关 ❗

text 复制代码
C1 / C3 / C6 / C10 ...

进入深度 C-State 后:

CPU 几乎"半睡眠",频率显示会掉到:

text 复制代码
800MHz 左右

3️⃣ HWP(硬件自控)14代默认开启

CPU 自己决定省不省电。


现在的状态是:

模块 状态
P-State ✅ 你控制住了
C-State ❌ 还在乱进
HWP ✅ 自动

所以会出现你看到的混合频率。


彻底锁定,不掉到 800MHz(实验模式)

⚠️ 注意:下面操作 = 更耗电 + 更热 + 风扇更响,只建议实验时用。


🔧 方法一(推荐):关闭深度 C-State(最有效),只用方法一一般就可以

bash 复制代码
for i in /sys/devices/system/cpu/cpu*/cpuidle/state*/disable; do
  echo 1 | sudo tee $i
done

含义:

text 复制代码
1 = 禁用该睡眠态

执行后再看:

bash 复制代码
watch -n1 "grep MHz /proc/cpuinfo"

800MHz 基本会消失。

bash 复制代码
Every 1.0s: grep MHz /proc/cpuinfo                                                      

cpu MHz         : 2499.974
cpu MHz         : 2500.000
cpu MHz         : 2500.025
cpu MHz         : 2500.025
cpu MHz         : 2500.025
cpu MHz         : 2500.025
cpu MHz         : 2465.597
cpu MHz         : 2465.567
cpu MHz         : 2500.000
cpu MHz         : 2500.000
cpu MHz         : 2500.000
cpu MHz         : 2499.974
cpu MHz         : 1800.011
cpu MHz         : 1799.984
cpu MHz         : 1800.024
cpu MHz         : 1799.974

🔧 方法二:禁用 HWP(硬件自动调度)

查看:

bash 复制代码
cat /sys/devices/system/cpu/intel_pstate/hwp_dynamic_boost

如果是 1,关掉:

bash 复制代码
echo 0 | sudo tee /sys/devices/system/cpu/intel_pstate/hwp_dynamic_boost

(部分机器没有这个文件)


🔧 方法三(终极):内核启动参数(最干净)

如果你长期做能耗实验,建议用这个。

编辑 grub:

bash 复制代码
sudo nano /etc/default/grub

找到:

text 复制代码
GRUB_CMDLINE_LINUX_DEFAULT

改成:

text 复制代码
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_idle.max_cstate=0 processor.max_cstate=1"

更新:

bash 复制代码
sudo update-grub
sudo reboot

含义:

参数 作用
intel_idle.max_cstate=0 禁深睡
processor.max_cstate=1 限制睡眠

重启后基本不会再看到 800MHz。

四、完整脚本

shell 复制代码
#!/bin/bash

# ==============================
# CPU Mode Switch Script
# For Intel 14th Gen Hybrid CPU
# ==============================

# Check root
if [ "$EUID" -ne 0 ]; then
  echo "❌ Please run as root: sudo ./cpu_mode.sh"
  exit 1
fi

# P/E core ranges (adjust if needed)
P_CORES="0-11"
E_CORES="12-15"

P_BASE="2.5GHz"
E_BASE="1.8GHz"

P_MAX="4.7GHz"
E_MAX="3.5GHz"

LOW="800MHz"


echo "=============================="
echo " CPU Frequency Control Menu"
echo "=============================="
echo "0 = Power Save (800MHz)"
echo "1 = Base Lock (P=2.5G E=1.8G)"
echo "2 = Turbo Lock (P=4.7G E=3.5G)"
echo "=============================="
read -p "Select mode (0/1/2): " MODE


# Performance governor
cpupower frequency-set -g performance >/dev/null


# Enable turbo
echo 0 > /sys/devices/system/cpu/intel_pstate/no_turbo


# Disable C-States
for i in /sys/devices/system/cpu/cpu*/cpuidle/state*/disable; do
  echo 1 > "$i"
done


case "$MODE" in

0)
  echo "Power Save Mode (800MHz)"

  cpupower -c $P_CORES frequency-set -d $LOW -u $LOW
  cpupower -c $E_CORES frequency-set -d $LOW -u $LOW
  ;;

1)
  echo "Base Lock Mode"

  cpupower -c $P_CORES frequency-set -d $P_BASE -u $P_BASE
  cpupower -c $E_CORES frequency-set -d $E_BASE -u $E_BASE
  ;;

2)
  echo "Turbo Lock Mode"

  cpupower -c $P_CORES frequency-set -d $P_MAX -u $P_MAX
  cpupower -c $E_CORES frequency-set -d $E_MAX -u $E_MAX
  ;;

*)
  echo "❌ Invalid input"
  exit 1
  ;;
esac


echo
echo "✅ Configuration Applied"
echo "Monitoring frequency (Ctrl+C to exit)..."
echo


watch -n1 "grep MHz /proc/cpuinfo"

这个脚本支持 3 种模式:

输入 模式 行为
0 💤 省电模式(800MHz) 全核锁 800MHz
1 ⚙️ Base 锁频 P=2.5GHz / E=1.8GHz
2 🚀 Max 锁频 Turbo 模式 P=4.7GHz / E=3.5GHz

同时会:

✔️ 切 performance governor

✔️ 打开 Turbo

✔️ 关闭 C-State(防 800MHz 漂移)

✔️ 最后实时监控频率

bash 复制代码
chmod +x cpu_mode.sh
sudo ./cpu_mode.sh

然后你会看到:

text 复制代码
0 = Power Save
1 = Base Lock
2 = Turbo Lock
Select mode:

输入 0 / 1 / 2 回车即可。