在 Ubuntu Linux 上,要把 Intel Core i5(14 代,P/E 核混合架构) 的频率尽量固定在 Base~Max Turbo 区间内,可以按下面思路操作。
一、查看当前调频驱动(先确认环境)
先执行:
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 回车即可。