现代 CPU 电压-频率(DVFS)调节影响是数量级的:空载跑 800MHz 省 60% 电;突发升到 5GHz 瞬间完成任务。这需要 OS 秒级到毫秒级决策”该跑多快”。Linux 的 cpufreq 子系统经历了 20 年演化,到今天 schedutil + HWP 双主力。
一、先看图:决策链
flowchart LR
T[任务 util_avg] --> SCH[schedutil governor]
SCH -->|按 util 映射频率| TARGET[target freq]
TARGET --> DRV{驱动}
DRV -->|intel_pstate| HWP[HWP 硬件托管<br/>μs 级]
DRV -->|acpi-cpufreq| P[ACPI P-state]
DRV -->|amd_pstate_epp| APSTATE[AMD EPP]
HWP --> FR[实际频率]
P --> FR
APSTATE --> FR
UC[sched_util_clamp] -. boost/限 .-> SCH
classDef sw fill:#388bfd22,stroke:#388bfd,color:#adbac7;
classDef hw fill:#3fb95022,stroke:#3fb950,color:#adbac7;
class T,SCH,TARGET,UC sw
class DRV,HWP,P,APSTATE,FR hw
二、cpufreq 架构
分层:
- 驱动:
acpi-cpufreq、intel_pstate、amd_pstate、cpufreq-dt(嵌入式) - governor:决策逻辑(performance/powersave/ondemand/conservative/userspace/schedutil)
- 通用层:
cpufreq_driver_target统一接口
/sys/devices/system/cpu/cpu0/cpufreq/:
scaling_driver # intel_pstate / acpi-cpufreq / ...
scaling_governor
scaling_available_governors
scaling_cur_freq
scaling_min_freq scaling_max_freq
cpuinfo_cur_freq # 硬件实际频率
三、历代 governor
3.1 performance / powersave
极端两档:performance 永远 max_freq;powersave 永远 min_freq。
场景:
- performance:服务器、低延迟服务、benchmark
- powersave:极端省电 / 热控
3.2 userspace
governor 不决策,用户态(一般系统工具)写
scaling_setspeed。已冷门。
3.3 ondemand(2002-2015 主力)
周期性采样 CPU 利用率,超阈值上跳到 max,低于阈值线性下降。
缺点:
- 采样周期 10-20ms → 对短脉冲反应迟
- 跟调度器信息完全脱节——调度器刚唤醒一个任务,governor 还在按历史样本跑
3.4 conservative
ondemand 的温柔版:步进上升而不是直接到 max。省电但响应差。
3.5 schedutil(4.7+,现代默认)
与调度器深度耦合:直接用 PELT 的 util_avg 决定频率:
freq = max_freq * util / capacity * C
(C 是 headroom 系数,默认 1.25,留 25% 余量)
优势:
- 与调度器同步,唤醒瞬间就知道需要多少 CPU
- 无采样滞后
- 支持 UCLAMP 对接:任务级 clamp_min / clamp_max 直接影响频率
现在 Android、ChromeOS、Fedora 默认 schedutil。
四、Intel intel_pstate 与 HWP
4.1 intel_pstate 驱动
Intel 从 Sandy Bridge 开始提供自己的 pstate 控制路径,比 ACPI 准。支持两模式:
- active(默认):driver 自带 governor
逻辑(
powersave/performance) - passive:交给通用 governor(如 schedutil)
/sys/devices/system/cpu/intel_pstate/status
看当前模式。
4.2 HWP(Hardware P-states)
Skylake+ CPU 硬件自带频率调节——软件只给 hint (min/max/EPP),μs 级硬件决策。比 OS 反应快 1000x。
EPP(Energy-Performance
Preference):0=performance、255=power、128=balance。/sys/devices/system/cpu/cpu0/cpufreq/energy_performance_preference。
HWP 模式下 Linux 的 “governor” 更像高级提示。
4.3 intel_pstate 常见表现
现代 Intel 机器:kernel 6.x + intel_pstate active 模式 + HWP + EPP=balance 是默认。笔记本上电 EPP=performance、电池 EPP=power。
五、AMD amd_pstate
AMD Zen 2+ 类似 HWP 的 CPPC。Linux 5.17+
amd_pstate 驱动支持。
三模式: - amd_pstate=disable:退回
acpi-cpufreq - amd_pstate=passive:调度器 +
schedutil 驱动 - amd_pstate=active:CPPC
EPP,类似 Intel HWP active -
amd_pstate=guided:6.4 引入,折中
Ryzen 7000 系列默认开 guided 或 active。
六、UCLAMP 与 schedutil
C-25 提到 UCLAMP 影响调度决策;它也直接影响频率。
schedutil 计算 target 时:
effective_util = clamp(util, clamp_min, clamp_max)
所以 uclamp_min = 512 的任务在小 CPU
上不止被拉走,还会把频率顶上去。
Android 系统服务给前台应用动态调 UCLAMP,触发瞬间升频。
七、frequency scaling 的副作用
- turbo:短时超过 base clock;受热控、功耗限制;有时间窗(PL1/PL2)
- thermal
throttle:过热时强制降频;
dmesg有CPU freq throttled - CPPC / EPP 异步:软件读 scaling_cur_freq 与硬件实际可能有短暂差
- AVX-512 降频:老 Skylake/Ice Lake 运行 AVX-512 瞬时降频 10-30%,后代改善
八、诊断与调优
8.1 查看
cpupower frequency-info
# driver / governor / frequency / boost
turbostat --quiet --interval 1
# Bzy_MHz, TSC_MHz, Avg_MHz
Bzy_MHz 是忙时平均频率,比 /sys 的更准。
8.2 设置
cpupower frequency-set -g performance # 所有 CPU 切 performance
cpupower frequency-set -u 3000000 # 上限 3GHz
8.3 per-task boost
struct sched_attr a = {.size=sizeof(a),
.sched_flags = SCHED_FLAG_UTIL_CLAMP_MIN,
.sched_util_min = 768};
sched_setattr(0, &a, 0);8.4 禁用 turbo
echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo
稳定频率 = benchmark 公平对比、避免温度振荡。
九、场景对照
| 场景 | 推荐 |
|---|---|
| 延迟敏感服务 | performance 或 schedutil + EPP=performance |
| 电池笔记本 | schedutil + EPP=balance/power |
| 数据中心 | schedutil + 根据负载调 EPP |
| benchmark | performance + no_turbo + CPU 固定 |
| HPC | performance + 关 HT + numactl |
| 嵌入式 | schedutil + EAS(能量模型) |
十、常见 bug
bug A:scaling_max_freq 设了没效果
原因:intel_pstate active 模式下
acpi-cpufreq 属性失效;改
/sys/devices/system/cpu/intel_pstate/max_perf_pct
bug B:频率卡在 max 不降 原因:BIOS 里固定 P-state;或 governor=performance
bug C:CPU freq 显示不变 原因:HWP 下 /sys 报告不够实时;用 turbostat 看真实
bug D:虚拟机里调节不生效 原因:KVM guest 看到的是虚拟频率;真实频率由 host 控
十一、小结
- schedutil + HWP(或 amd_pstate active)是现代双主力
- ondemand 已退场,代表”猜未来”与”真实算力”的脱节被修正
- UCLAMP 把用户态 hint 接入频率决策
- turbostat 是观察真频率的金标
- 生产按 EPP / governor 调,而不是改硬上限
至此子系列 C(调度器深度)完结,共 10 篇(19-28)。下一子系列 D:虚拟内存(12 篇,29-40)将从 VM 模型、x86/ARM 页表、TLB 工程讲到 huge pages、OOM、compaction、NUMA、anon vs file 内存的区别。
参考文献
Documentation/admin-guide/pm/cpufreq.rst/intel_pstate.rst/amd-pstate.rst- Rafael Wysocki 在 LPC 2016-2024 的 cpufreq 系列 talks
- Corbet, J. “schedutil: the scheduler-driven frequency governor.” LWN.net 2016
- Intel SDM Vol 3B §14.4 “Hardware-Controlled Performance States”
- AMD “Collaborative Processor Performance Control (CPPC) Guide”
工具
cpupower frequency-info / frequency-setturbostat、powertopperf stat -e power/energy-pkg//sys/devices/system/cpu/intel_pstate/*、/sys/devices/system/cpu/cpufreq/*tuned-adm profile <xxx>—— 一键配置
上一篇:idle governors:空闲管理 下一篇:虚拟内存模型
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【操作系统百科】内存回收
Linux 内存回收是 VM 最复杂的子系统之一。本文讲 active/inactive LRU、kswapd 与 direct reclaim、watermark 三线、swappiness 的真实含义、MGLRU 改造、memcg 回收与 PSI。
【操作系统百科】交换
swap 还值得开吗?本文讲 swap area 基础、swap cache、zram 压缩内存、zswap 前端压缩池、swappiness 的真实含义、容器里的 swap 策略,以及为什么现代 Android 全靠 zram 不靠磁盘。
【操作系统百科】Slab/SLUB 分配器
buddy 只管页粒度(4K+),内核大多数对象只有几十到几百字节。slab/SLUB 在 buddy 之上做对象级缓存。本文讲 slab 历史、SLUB 接手、SLOB 退场、kmem_cache、per-CPU cache、KASAN 集成。
【操作系统百科】用户态分配器
glibc malloc、tcmalloc、jemalloc、mimalloc 各有哲学。本文讲 arena、thread cache、size class、madvise 返还策略、碎片与 RSS 膨胀、如何根据负载选分配器。