动态调频
这篇只按当前真实 bin/cpu/<SoC>.json 字段解释模式调频,不讲线程匹配本身。
1. 动态调频到底管什么
它主要管:
- 每个模式的频率上下限
- governor 参数
cpusetcpuctl- 模式级功能开关
- 付费版的
dynamic_tuning
它不负责线程名匹配。线程识别和绑核请看 BPF自定义线程。
2. 主要文件
动态调频主文件是:
bin/cpu/<SoC>.json
例如:
bin/cpu/SM8850.jsonbin/cpu/SM8750.jsonbin/cpu/MT6991.json
3. 免费版和付费版的真实区别
免费版
免费版 SoC JSON 当前主线字段是:
versionpowersave / balance / performance / fastcpu_policiescpusetcpuctlfeaturessched_boostsched_configstune_topapp
免费版当前没有单独的模式级 dynamic_tuning 对象主线,文档不该按付费版写法硬套过去。
付费版
付费版 SoC JSON 在上面这些基础上,额外主线支持:
- 模式级
dynamic_tuning cpu_policies[].dynamic_tuningcpu_policies[].optimum_freqfeatures.dynamic_tuningfeatures.fasfeatures.custom_threadfeatures.dynamic_thread_scheduler
4. 模式名逐个说明
当前主线模式通常是:
powersavebalanceperformancefast
每个模式对象下面都会放一套自己的频率和功能开关。
5. 模式对象里的字段逐个解释
cpu_policies
- 每个 cluster 的调频策略数组
- 每项常见字段:
clustergovernormax_freqmin_freqparams
- 付费版还常见:
optimum_freqdynamic_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_freqhispeed_freqhispeed_loadrtg_boost_freqzone_max_util_pctboostup_rate_limit_usdown_rate_limit_uspl
cpu_policies[].dynamic_tuning
- 付费版 cluster 级动态调频参数
- 当前支持:
target_loadstarget_loadload_marginenableddebug_log
6. 其它常见模式字段
cpuset
- 控制各类 task group 允许跑到哪些 CPU
- 当前常见项:
backgroundsystembackgroundforegroundtopapp
cpuctl
- 控制各类 task group 的
uclamp和 shares - 当前常见组:
backgroundsystembackgroundforegroundtopapp
- 每组当前常见字段:
uclamp_minuclamp_maxlatency_sensitiveshares
features
- 模式级功能开关
免费版当前主线常见:
scheduler_masterbpf_threadscene_categorybase_profile
付费版当前主线常见:
scheduler_masterdynamic_tuningfascustom_threaddynamic_thread_schedulerscene_categorybase_profile
dynamic_tuning
- 付费版模式级动态调频对象
- 当前支持:
enabledtarget_loadstarget_loadload_margindebug_log
sched_boost
- 可选的调度 boost 配置
- 当前常见字段:
top_boostboost
sched_config
- 可选的调度迁移阈值
- 当前常见字段:
downmigrateupmigrategroup_downmigrategroup_upmigrate
stune_topapp
- 顶层 top-app 的 stune 配置
- 当前常见字段:
prefer_idleboost
7. target_loads 是什么
当前付费版 dynamic_tuning.target_loads 是一条字符串规则,不是数组。
例如:
"target_loads": "65 1747200:70 2438400:75 3187200:80"它表示不同频点对应的目标负载阈值,运行时会解析成分段 ceiling 规则。
8. 免费版普通调频到底怎么理解
免费版虽然没有付费版那套模式级 dynamic_tuning 主对象,但并不代表"不能调频"。
免费版当前主线仍然会真实吃这些东西:
cpu_policies[].governorcpu_policies[].max_freqcpu_policies[].min_freqcpu_policies[].paramscpusetcpuctl
也就是说,免费版的"普通调频"本质上还是:
- 先选每个 cluster 用哪个 governor
- 再给这个 governor 写参数
- 再用
max_freq / min_freq卡住这个模式允许的频率范围
你给的频率列表目录:
bin/cpu/频率列表/8550.txtbin/cpu/频率列表/8650.txtbin/cpu/频率列表/8750.txtbin/cpu/频率列表/8850官.txtbin/cpu/频率列表/mt6991.txt
已经能直接看出两件事:
- 每个 policy 支持哪些真实频点
- 每个 policy 当前内核到底暴露了哪些 governor 和参数
所以免费版如果想调"基础调频",最稳的顺序通常是:
- 先看对应 SoC 的频率列表,确认这个 cluster 真正支持哪些频率
- 再看
bin/cpu/<SoC>.json里当前模式写了哪个 governor - 再调这个 governor 对应的
params - 最后再看
max_freq / min_freq有没有把空间卡死
9. 常见 governor 现在都是什么
不同 SoC 暴露的 governor 会不一样,但按你给的频率列表,当前最常见的是:
waltuagschedutilconservativepowersaveperformancescxsugov_ext
可以这样理解:
walt
- 高通平台当前最常见主线之一
- 常配
hispeed_*、rtg_boost_freq、boost、zone_max_util_pct - 更像"按负载和前台热点线程行为快速抬频"的主力 governor
uag
- 也是高通平台常见 governor
- 常配
hispeed_freq、hispeed_load、target_loads、soft_limit_freq - 更偏"在 util 跟踪基础上加一套更细的提速和软上限控制"
schedutil
- 更通用的 governor
- 当前最常见参数就是
rate_limit_us - 好处是简单,坏处是可调面通常比
walt / uag小
conservative
- 老式保守调速器
- 常见参数是
up_threshold、down_threshold、freq_step、sampling_rate - 典型特点是升频偏慢、更保守
powersave
- 追求低功耗
- 通常没有单独参数目录,或者几乎没什么可调项
- 一般就是尽量压低频率
performance
- 追求性能优先
- 通常也没有复杂参数目录
- 更偏直接顶住高频或尽量少降频
scx
- 新一点的平台会看到
- 当前频率列表里常见参数是
apply_freq_immediately、soft_freq_cur、soft_freq_max、soft_freq_min、target_loads - 更像额外包了一层"软频点限制"和即时应用策略
sugov_ext
- 在部分平台会替代
walt / uag - 当前你给的
mt6991.txt里常见参数很少,主要是:up_rate_limit_usdown_rate_limit_us
- 可以理解成是更轻量的扩展版 util governor
要特别注意:
- 不是所有设备都有
uag - 不是所有设备都有
walt scx / sugov_ext更像新平台或特定内核分支特有- 文档里不能把某个 governor 当成"所有设备通用"
10. 常见 governor 参数怎么读
下面这些字段,是当前免费版普通调频和付费版 SoC 配置里最常见、也最值得解释的。
| 字段 | 常见 governor | 作用理解 |
|---|---|---|
hispeed_freq | walt、uag | 负载抬升后优先跳到的参考频点 |
hispeed_cond_freq | walt | 触发 hispeed_freq 前的条件频点门槛 |
hispeed_load | walt、uag | 负载达到多少时更积极触发提频 |
rtg_boost_freq | walt | 前台渲染/RTG 热线程更容易拉到的参考频点 |
target_loads | walt、uag、scx | 分段目标负载表;值越低通常越激进 |
target_load | 付费版 dynamic_tuning | 没命中更细分段时的默认目标负载 |
load_margin | 付费版 dynamic_tuning | 负载容差;越大通常越保守 |
boost | walt | 额外 util/调频偏置;正值更激进,负值更保守 |
zone_max_util_pct | walt | 分段限制 util 对频率上探的上限规则 |
up_rate_limit_us | walt、uag、sugov_ext | 升频最短间隔;越小越容易快速抬频 |
down_rate_limit_us | walt、uag、sugov_ext | 降频最短间隔;越大越不容易立刻降频 |
rate_limit_us | schedutil | schedutil 的统一调速节流间隔 |
down_threshold | conservative | 低于多少负载才倾向降频 |
up_threshold | conservative | 高于多少负载才倾向升频 |
freq_step | conservative | 每次升降频走多大步长 |
sampling_rate | conservative | 负载采样周期 |
pl | walt | 平台特定附加参数,常和高通内核行为绑定 |
optimum_freq | 付费版 cpu_policies[] | 付费版更偏好的工作频点参考值 |
enabled | 付费版 dynamic_tuning | 是否启用这条动态调频逻辑 |
如果想快速抓重点,可以这样记:
- 想改"多快升频",先看
hispeed_*和up_rate_limit_us - 想改"多慢降频",先看
down_rate_limit_us - 想改"整条分段响应曲线",先看
target_loads - 想改"保守还是激进",重点看
boost / target_load / load_margin - 想改"绝对不准超过哪里",最后再看
max_freq
11. 按平台举例的速查表
下面这张表只按你给的频率列表目录总结当前常见情况,用来帮助快速判断"这个 SoC 大概要看哪类 governor 和参数"。
| 平台 | 当前常见 cluster 形态 | 当前主 governor 倾向 | 常见可见 governor | 阅读重点 |
|---|---|---|---|---|
8550 | 3 + 4 + 1 | uag | uag / walt / conservative / schedutil / powersave / performance | 重点看 uag 的 hispeed_* / target_loads / soft_limit_freq |
8650 | 2 + 3 + 2 + 1 | walt | walt / uag / conservative / schedutil / powersave / performance | 重点看 walt 的 boost / hispeed_* / target_loads,再对照 uag |
8750 | 6 + 2 | walt | scx / walt / conservative / schedutil / powersave / performance | 重点看 walt 和新出现的 scx |
8850 | 6 + 2 | walt | walt / conservative / schedutil / powersave / performance | 重点看 walt 的 hispeed_cond_freq / zone_max_util_pct |
mt6991 | 4 + 3 + 1 | sugov_ext | scx / sugov_ext / conservative / schedutil / powersave / performance | 重点看 sugov_ext 的升降频节流和 scx 的软频点参数 |
如果想更快定位,可以直接这样记:
8550- 更像
uag主场
- 更像
8650walt与uag并存,但当前主 governor 已偏walt
8750walt还是主线,但开始明显看到scx
8850- 还是
walt主线,只是参数更偏新一代高通写法
- 还是
mt6991- 风格明显不同,重点不再是
walt / uag,而是sugov_ext / scx
- 风格明显不同,重点不再是
8550 速看
从频率列表能看到:
- 当前主 governor 是
uag - 同时仍保留
walt big和prime簇都有单独 boost 频率
最值得先看的参数:
hispeed_freqhispeed_loadtarget_loadssoft_limit_frequp_rate_limit_us / down_rate_limit_us
适合这样调:
- 想让
8550少一点乱冲高频,先看soft_limit_freq - 想让响应快一点,先看
hispeed_freq - 想整体曲线柔和一点,再看
target_loads
8650 速看
从频率列表能看到:
- 当前主 governor 已是
walt - 但
uag仍然存在 prime簇有多档 boost 频率
最值得先看的参数:
boosthispeed_freqhispeed_loadrtg_boost_freqtarget_loads
适合这样调:
- 想提首帧或前台交互响应,先看
boost和rtg_boost_freq - 想改进入高频的门槛,先看
hispeed_load - 想改不同簇的行为差异,再对照
uag的soft_limit_freq
8750 速看
从频率列表能看到:
- 当前主 governor 是
walt - 新增了
scx walt已常见hispeed_cond_freq和zone_max_util_pct
最值得先看的参数:
hispeed_cond_freqhispeed_freqzone_max_util_pctscx.target_loadsscx.soft_freq_min / soft_freq_max
适合这样调:
- 想限制某个频段以上的继续猛冲,先看
zone_max_util_pct - 想让
scx更早或更晚介入,先看它的target_loads - 想控软上限,不要先硬砍
max_freq,可以先试soft_freq_max
8850 速看
从频率列表能看到:
- 当前主 governor 是
walt - 没再暴露
uag schedutil.rate_limit_us很小,说明平台对快速响应更敏感
最值得先看的参数:
hispeed_cond_freqhispeed_freqrtg_boost_freqzone_max_util_pctschedutil.rate_limit_us
适合这样调:
- 想减小高频过冲,先看
zone_max_util_pct - 想让
big / prime更晚进入高档,先看hispeed_cond_freq - 想换回更通用的行为,再观察
schedutil是否足够
mt6991 速看
从频率列表能看到:
- 当前主 governor 是
sugov_ext - 同时保留
scx - 平台不走典型高通
walt / uag主线
最值得先看的参数:
sugov_ext.up_rate_limit_ussugov_ext.down_rate_limit_usscx.target_loadsscx.soft_freq_minscx.soft_freq_max
适合这样调:
- 想改升降频节奏,先动
sugov_ext的两个 rate limit - 想做软频点限制,优先看
scx.soft_freq_min / soft_freq_max - 不要把
mt6991生搬硬套成高通那套walt参数逻辑
12. 什么时候该改动态调频
适合:
- 觉得某模式升频太猛或太慢
- 想改频率地板或天花板
- 想改
cpuset/cpuctl - 想改付费版
dynamic_tuning
不适合:
- 某个线程绑核不对
- 某个线程 RT 级别不对
- 某个同名线程要单独补规则
这些都该去改线程 JSON。
13. 一句话理解
动态调频就是:
用
SoC JSON决定每个模式的频率地板、频率天花板、task group 行为和 governor 响应;免费版主看普通调频参数,付费版再额外叠加真正的dynamic_tuning与fas功能开关。
