土法炼钢兴趣小组的算法知识备份

【操作系统百科】cpufreq governors:频率调节

文章导航

分类入口
os
标签入口
#cpufreq#schedutil#hwp#amd-pstate#ondemand#p-state

目录

现代 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 架构

分层:

/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。

场景:

3.2 userspace

governor 不决策,用户态(一般系统工具)写 scaling_setspeed。已冷门。

3.3 ondemand(2002-2015 主力)

周期性采样 CPU 利用率,超阈值上跳到 max,低于阈值线性下降。

缺点:

3.4 conservative

ondemand 的温柔版:步进上升而不是直接到 max。省电但响应差。

3.5 schedutil(4.7+,现代默认)

与调度器深度耦合:直接用 PELT 的 util_avg 决定频率:

freq = max_freq * util / capacity * C

(C 是 headroom 系数,默认 1.25,留 25% 余量)

优势:

现在 Android、ChromeOS、Fedora 默认 schedutil。

四、Intel intel_pstate 与 HWP

4.1 intel_pstate 驱动

Intel 从 Sandy Bridge 开始提供自己的 pstate 控制路径,比 ACPI 准。支持两模式:

/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 的副作用

八、诊断与调优

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 控

十一、小结


至此子系列 C(调度器深度)完结,共 10 篇(19-28)。下一子系列 D:虚拟内存(12 篇,29-40)将从 VM 模型、x86/ARM 页表、TLB 工程讲到 huge pages、OOM、compaction、NUMA、anon vs file 内存的区别。


参考文献

工具


上一篇idle governors:空闲管理 下一篇虚拟内存模型

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-04-27 · os

【操作系统百科】内存回收

Linux 内存回收是 VM 最复杂的子系统之一。本文讲 active/inactive LRU、kswapd 与 direct reclaim、watermark 三线、swappiness 的真实含义、MGLRU 改造、memcg 回收与 PSI。

2026-04-28 · os

【操作系统百科】交换

swap 还值得开吗?本文讲 swap area 基础、swap cache、zram 压缩内存、zswap 前端压缩池、swappiness 的真实含义、容器里的 swap 策略,以及为什么现代 Android 全靠 zram 不靠磁盘。

2026-05-03 · os

【操作系统百科】Slab/SLUB 分配器

buddy 只管页粒度(4K+),内核大多数对象只有几十到几百字节。slab/SLUB 在 buddy 之上做对象级缓存。本文讲 slab 历史、SLUB 接手、SLOB 退场、kmem_cache、per-CPU cache、KASAN 集成。

2026-05-07 · os

【操作系统百科】用户态分配器

glibc malloc、tcmalloc、jemalloc、mimalloc 各有哲学。本文讲 arena、thread cache、size class、madvise 返还策略、碎片与 RSS 膨胀、如何根据负载选分配器。


By .