Skip to content

动态调频

这篇只按当前真实 bin/cpu/<SoC>.json 字段解释模式调频,不讲线程匹配本身。

1. 动态调频到底管什么

它主要管:

  1. 每个模式的频率上下限
  2. governor 参数
  3. cpuset
  4. cpuctl
  5. 模式级功能开关
  6. 付费版的 dynamic_tuning

它不负责线程名匹配。线程识别和绑核请看 BPF自定义线程

2. 主要文件

动态调频主文件是:

  1. bin/cpu/<SoC>.json

例如:

  1. bin/cpu/SM8850.json
  2. bin/cpu/SM8750.json
  3. bin/cpu/MT6991.json

3. 免费版和付费版的真实区别

免费版

免费版 SoC JSON 当前主线字段是:

  1. version
  2. powersave / balance / performance / fast
  3. cpu_policies
  4. cpuset
  5. cpuctl
  6. features
  7. sched_boost
  8. sched_config
  9. stune_topapp

免费版当前没有单独的模式级 dynamic_tuning 对象主线,文档不该按付费版写法硬套过去。

付费版

付费版 SoC JSON 在上面这些基础上,额外主线支持:

  1. 模式级 dynamic_tuning
  2. cpu_policies[].dynamic_tuning
  3. cpu_policies[].optimum_freq
  4. features.dynamic_tuning
  5. features.fas
  6. features.custom_thread
  7. features.dynamic_thread_scheduler

4. 模式名逐个说明

当前主线模式通常是:

  1. powersave
  2. balance
  3. performance
  4. fast

每个模式对象下面都会放一套自己的频率和功能开关。

5. 模式对象里的字段逐个解释

cpu_policies

  • 每个 cluster 的调频策略数组
  • 每项常见字段:
    • cluster
    • governor
    • max_freq
    • min_freq
    • params
  • 付费版还常见:
    • optimum_freq
    • dynamic_tuning

cpu_policies[].cluster

  • 这条策略作用到哪个 cluster

cpu_policies[].governor

  • 当前模式下要写入的 governor

cpu_policies[].max_freq

  • 这个 cluster 的频率天花板

cpu_policies[].min_freq

  • 这个 cluster 的频率地板

cpu_policies[].optimum_freq

  • 付费版常见字段
  • 表示更偏向的工作频率参考点

cpu_policies[].params

  • governor 参数对象
  • 当前文件常见项有:
    • hispeed_cond_freq
    • hispeed_freq
    • hispeed_load
    • rtg_boost_freq
    • zone_max_util_pct
    • boost
    • up_rate_limit_us
    • down_rate_limit_us
    • pl

cpu_policies[].dynamic_tuning

  • 付费版 cluster 级动态调频参数
  • 当前支持:
    • target_loads
    • target_load
    • load_margin
    • enabled
    • debug_log

6. 其它常见模式字段

cpuset

  • 控制各类 task group 允许跑到哪些 CPU
  • 当前常见项:
    • background
    • systembackground
    • foreground
    • topapp

cpuctl

  • 控制各类 task group 的 uclamp 和 shares
  • 当前常见组:
    • background
    • systembackground
    • foreground
    • topapp
  • 每组当前常见字段:
    • uclamp_min
    • uclamp_max
    • latency_sensitive
    • shares

features

  • 模式级功能开关

免费版当前主线常见:

  1. scheduler_master
  2. bpf_thread
  3. scene_category
  4. base_profile

付费版当前主线常见:

  1. scheduler_master
  2. dynamic_tuning
  3. fas
  4. custom_thread
  5. dynamic_thread_scheduler
  6. scene_category
  7. base_profile

dynamic_tuning

  • 付费版模式级动态调频对象
  • 当前支持:
    • enabled
    • target_loads
    • target_load
    • load_margin
    • debug_log

sched_boost

  • 可选的调度 boost 配置
  • 当前常见字段:
    • top_boost
    • boost

sched_config

  • 可选的调度迁移阈值
  • 当前常见字段:
    • downmigrate
    • upmigrate
    • group_downmigrate
    • group_upmigrate

stune_topapp

  • 顶层 top-app 的 stune 配置
  • 当前常见字段:
    • prefer_idle
    • boost

7. target_loads 是什么

当前付费版 dynamic_tuning.target_loads 是一条字符串规则,不是数组。

例如:

json
"target_loads": "65 1747200:70 2438400:75 3187200:80"

它表示不同频点对应的目标负载阈值,运行时会解析成分段 ceiling 规则。

8. 免费版普通调频到底怎么理解

免费版虽然没有付费版那套模式级 dynamic_tuning 主对象,但并不代表"不能调频"。

免费版当前主线仍然会真实吃这些东西:

  1. cpu_policies[].governor
  2. cpu_policies[].max_freq
  3. cpu_policies[].min_freq
  4. cpu_policies[].params
  5. cpuset
  6. cpuctl

也就是说,免费版的"普通调频"本质上还是:

  1. 先选每个 cluster 用哪个 governor
  2. 再给这个 governor 写参数
  3. 再用 max_freq / min_freq 卡住这个模式允许的频率范围

你给的频率列表目录:

  1. bin/cpu/频率列表/8550.txt
  2. bin/cpu/频率列表/8650.txt
  3. bin/cpu/频率列表/8750.txt
  4. bin/cpu/频率列表/8850官.txt
  5. bin/cpu/频率列表/mt6991.txt

已经能直接看出两件事:

  1. 每个 policy 支持哪些真实频点
  2. 每个 policy 当前内核到底暴露了哪些 governor 和参数

所以免费版如果想调"基础调频",最稳的顺序通常是:

  1. 先看对应 SoC 的频率列表,确认这个 cluster 真正支持哪些频率
  2. 再看 bin/cpu/<SoC>.json 里当前模式写了哪个 governor
  3. 再调这个 governor 对应的 params
  4. 最后再看 max_freq / min_freq 有没有把空间卡死

9. 常见 governor 现在都是什么

不同 SoC 暴露的 governor 会不一样,但按你给的频率列表,当前最常见的是:

  1. walt
  2. uag
  3. schedutil
  4. conservative
  5. powersave
  6. performance
  7. scx
  8. sugov_ext

可以这样理解:

walt

  • 高通平台当前最常见主线之一
  • 常配 hispeed_*rtg_boost_freqboostzone_max_util_pct
  • 更像"按负载和前台热点线程行为快速抬频"的主力 governor

uag

  • 也是高通平台常见 governor
  • 常配 hispeed_freqhispeed_loadtarget_loadssoft_limit_freq
  • 更偏"在 util 跟踪基础上加一套更细的提速和软上限控制"

schedutil

  • 更通用的 governor
  • 当前最常见参数就是 rate_limit_us
  • 好处是简单,坏处是可调面通常比 walt / uag

conservative

  • 老式保守调速器
  • 常见参数是 up_thresholddown_thresholdfreq_stepsampling_rate
  • 典型特点是升频偏慢、更保守

powersave

  • 追求低功耗
  • 通常没有单独参数目录,或者几乎没什么可调项
  • 一般就是尽量压低频率

performance

  • 追求性能优先
  • 通常也没有复杂参数目录
  • 更偏直接顶住高频或尽量少降频

scx

  • 新一点的平台会看到
  • 当前频率列表里常见参数是 apply_freq_immediatelysoft_freq_cursoft_freq_maxsoft_freq_mintarget_loads
  • 更像额外包了一层"软频点限制"和即时应用策略

sugov_ext

  • 在部分平台会替代 walt / uag
  • 当前你给的 mt6991.txt 里常见参数很少,主要是:
    • up_rate_limit_us
    • down_rate_limit_us
  • 可以理解成是更轻量的扩展版 util governor

要特别注意:

  1. 不是所有设备都有 uag
  2. 不是所有设备都有 walt
  3. scx / sugov_ext 更像新平台或特定内核分支特有
  4. 文档里不能把某个 governor 当成"所有设备通用"

10. 常见 governor 参数怎么读

下面这些字段,是当前免费版普通调频和付费版 SoC 配置里最常见、也最值得解释的。

字段常见 governor作用理解
hispeed_freqwaltuag负载抬升后优先跳到的参考频点
hispeed_cond_freqwalt触发 hispeed_freq 前的条件频点门槛
hispeed_loadwaltuag负载达到多少时更积极触发提频
rtg_boost_freqwalt前台渲染/RTG 热线程更容易拉到的参考频点
target_loadswaltuagscx分段目标负载表;值越低通常越激进
target_load付费版 dynamic_tuning没命中更细分段时的默认目标负载
load_margin付费版 dynamic_tuning负载容差;越大通常越保守
boostwalt额外 util/调频偏置;正值更激进,负值更保守
zone_max_util_pctwalt分段限制 util 对频率上探的上限规则
up_rate_limit_uswaltuagsugov_ext升频最短间隔;越小越容易快速抬频
down_rate_limit_uswaltuagsugov_ext降频最短间隔;越大越不容易立刻降频
rate_limit_usschedutilschedutil 的统一调速节流间隔
down_thresholdconservative低于多少负载才倾向降频
up_thresholdconservative高于多少负载才倾向升频
freq_stepconservative每次升降频走多大步长
sampling_rateconservative负载采样周期
plwalt平台特定附加参数,常和高通内核行为绑定
optimum_freq付费版 cpu_policies[]付费版更偏好的工作频点参考值
enabled付费版 dynamic_tuning是否启用这条动态调频逻辑

如果想快速抓重点,可以这样记:

  1. 想改"多快升频",先看 hispeed_*up_rate_limit_us
  2. 想改"多慢降频",先看 down_rate_limit_us
  3. 想改"整条分段响应曲线",先看 target_loads
  4. 想改"保守还是激进",重点看 boost / target_load / load_margin
  5. 想改"绝对不准超过哪里",最后再看 max_freq

11. 按平台举例的速查表

下面这张表只按你给的频率列表目录总结当前常见情况,用来帮助快速判断"这个 SoC 大概要看哪类 governor 和参数"。

平台当前常见 cluster 形态当前主 governor 倾向常见可见 governor阅读重点
85503 + 4 + 1uaguag / walt / conservative / schedutil / powersave / performance重点看 uaghispeed_* / target_loads / soft_limit_freq
86502 + 3 + 2 + 1waltwalt / uag / conservative / schedutil / powersave / performance重点看 waltboost / hispeed_* / target_loads,再对照 uag
87506 + 2waltscx / walt / conservative / schedutil / powersave / performance重点看 walt 和新出现的 scx
88506 + 2waltwalt / conservative / schedutil / powersave / performance重点看 walthispeed_cond_freq / zone_max_util_pct
mt69914 + 3 + 1sugov_extscx / sugov_ext / conservative / schedutil / powersave / performance重点看 sugov_ext 的升降频节流和 scx 的软频点参数

如果想更快定位,可以直接这样记:

  1. 8550
    • 更像 uag 主场
  2. 8650
    • waltuag 并存,但当前主 governor 已偏 walt
  3. 8750
    • walt 还是主线,但开始明显看到 scx
  4. 8850
    • 还是 walt 主线,只是参数更偏新一代高通写法
  5. mt6991
    • 风格明显不同,重点不再是 walt / uag,而是 sugov_ext / scx

8550 速看

从频率列表能看到:

  1. 当前主 governor 是 uag
  2. 同时仍保留 walt
  3. bigprime 簇都有单独 boost 频率

最值得先看的参数:

  1. hispeed_freq
  2. hispeed_load
  3. target_loads
  4. soft_limit_freq
  5. up_rate_limit_us / down_rate_limit_us

适合这样调:

  1. 想让 8550 少一点乱冲高频,先看 soft_limit_freq
  2. 想让响应快一点,先看 hispeed_freq
  3. 想整体曲线柔和一点,再看 target_loads

8650 速看

从频率列表能看到:

  1. 当前主 governor 已是 walt
  2. uag 仍然存在
  3. prime 簇有多档 boost 频率

最值得先看的参数:

  1. boost
  2. hispeed_freq
  3. hispeed_load
  4. rtg_boost_freq
  5. target_loads

适合这样调:

  1. 想提首帧或前台交互响应,先看 boostrtg_boost_freq
  2. 想改进入高频的门槛,先看 hispeed_load
  3. 想改不同簇的行为差异,再对照 uagsoft_limit_freq

8750 速看

从频率列表能看到:

  1. 当前主 governor 是 walt
  2. 新增了 scx
  3. walt 已常见 hispeed_cond_freqzone_max_util_pct

最值得先看的参数:

  1. hispeed_cond_freq
  2. hispeed_freq
  3. zone_max_util_pct
  4. scx.target_loads
  5. scx.soft_freq_min / soft_freq_max

适合这样调:

  1. 想限制某个频段以上的继续猛冲,先看 zone_max_util_pct
  2. 想让 scx 更早或更晚介入,先看它的 target_loads
  3. 想控软上限,不要先硬砍 max_freq,可以先试 soft_freq_max

8850 速看

从频率列表能看到:

  1. 当前主 governor 是 walt
  2. 没再暴露 uag
  3. schedutil.rate_limit_us 很小,说明平台对快速响应更敏感

最值得先看的参数:

  1. hispeed_cond_freq
  2. hispeed_freq
  3. rtg_boost_freq
  4. zone_max_util_pct
  5. schedutil.rate_limit_us

适合这样调:

  1. 想减小高频过冲,先看 zone_max_util_pct
  2. 想让 big / prime 更晚进入高档,先看 hispeed_cond_freq
  3. 想换回更通用的行为,再观察 schedutil 是否足够

mt6991 速看

从频率列表能看到:

  1. 当前主 governor 是 sugov_ext
  2. 同时保留 scx
  3. 平台不走典型高通 walt / uag 主线

最值得先看的参数:

  1. sugov_ext.up_rate_limit_us
  2. sugov_ext.down_rate_limit_us
  3. scx.target_loads
  4. scx.soft_freq_min
  5. scx.soft_freq_max

适合这样调:

  1. 想改升降频节奏,先动 sugov_ext 的两个 rate limit
  2. 想做软频点限制,优先看 scx.soft_freq_min / soft_freq_max
  3. 不要把 mt6991 生搬硬套成高通那套 walt 参数逻辑

12. 什么时候该改动态调频

适合:

  1. 觉得某模式升频太猛或太慢
  2. 想改频率地板或天花板
  3. 想改 cpuset / cpuctl
  4. 想改付费版 dynamic_tuning

不适合:

  1. 某个线程绑核不对
  2. 某个线程 RT 级别不对
  3. 某个同名线程要单独补规则

这些都该去改线程 JSON。

13. 一句话理解

动态调频就是:

SoC JSON 决定每个模式的频率地板、频率天花板、task group 行为和 governor 响应;免费版主看普通调频参数,付费版再额外叠加真正的 dynamic_tuningfas 功能开关。