Power management and ACPI options > CPU Frequency scaling
Default CPUFreq governor (schedutil) --->
Default CPUFreq governor (ondemand) --->
CPU 调频策略
CPU 调频模块主要分为 3 块:
为所有支持CPUfreq 提供了通用的代码基础结构和用户空间API。它定义了其他组件在其中运行的基本框架
CPUFreq Governor
曾经使用过的governor ,
让 CPU 跑在最低频率
它是在 Android 中引入的。它在每一个 CPU 上都注册了一个 idle notifier。当 CPU 退出 idle 状态时,interactive 就会缩减采样频率,从而可以快速响应负载变化。其他情况下,会根据当前 CPU 负载调整频率,这一点和 ondemand 类似。
总结起来,对于像 ondemand,conservation,interactive 含有调频逻辑的 governor,都包含一个共同的部分 - 负载采样,需要每隔一定时间就计算一次 CPU 负载。进而进行调频。然而,这样可能会有频率上提升的延时。对于 CPU 的负载,没有谁比调度器还清楚的了。所以 cpufreq governor 完全没必要自己去做负载采样,应该从内核调度器那里获取。而基于调度器的 cpufreq governor 就是这样引出来的。
schedutil
内核调度器中的 CFS 调度类是通过 PELT(per entity load tracking) 来统计各个 Task 的负载(capacity),并映射到 0 ~ 1024(最大值可在编译时指定)。内核当中的负载均衡就是通过这些统计值来平衡各个 CPU 之间的任务。而基于调度器的 cpufreq governor 的主要原理就是把各个 CPU 的 capacity 映射到 CPU 频率,来完成调频动作,capacity 越高,当前 CPU 负载越高,所以频率也调的很高。
而当前内核社区中,已经有两个成形的方案。一个是 ARM 和 Linaro 主导的项目 - cpufreq_sched,属于 EAS 的一部分。而另外一个 Intel 主导的项目 - schedutil。
而 schedutil就是利用这个负载变化回调机制,通过 cpufreq_add_update_util_hook 注册回调函数,当 CPU 负载出现变化的时候,就会触发 schedutil sugov_update 进行调频动作。
我的建议是用 pstate 驱动
Featured Collection
Popular Ranking
Popular Events
Power management and ACPI options > CPU Frequency scaling
Default CPUFreq governor (schedutil) --->
Power management and ACPI options > CPU Frequency scaling
Default CPUFreq governor (ondemand) --->
CPU 调频策略
CPU 调频模块主要分为 3 块:
为所有支持CPUfreq 提供了通用的代码基础结构和用户空间API。它定义了其他组件在其中运行的基本框架
CPUFreq Governor
曾经使用过的governor ,
让 CPU 跑在最低频率
它是在 Android 中引入的。它在每一个 CPU 上都注册了一个 idle notifier。当 CPU 退出 idle 状态时,interactive 就会缩减采样频率,从而可以快速响应负载变化。其他情况下,会根据当前 CPU 负载调整频率,这一点和 ondemand 类似。
总结起来,对于像 ondemand,conservation,interactive 含有调频逻辑的 governor,都包含一个共同的部分 - 负载采样,需要每隔一定时间就计算一次 CPU 负载。进而进行调频。然而,这样可能会有频率上提升的延时。对于 CPU 的负载,没有谁比调度器还清楚的了。所以 cpufreq governor 完全没必要自己去做负载采样,应该从内核调度器那里获取。而基于调度器的 cpufreq governor 就是这样引出来的。
schedutil
内核调度器中的 CFS 调度类是通过 PELT(per entity load tracking) 来统计各个 Task 的负载(capacity),并映射到 0 ~ 1024(最大值可在编译时指定)。内核当中的负载均衡就是通过这些统计值来平衡各个 CPU 之间的任务。而基于调度器的 cpufreq governor 的主要原理就是把各个 CPU 的 capacity 映射到 CPU 频率,来完成调频动作,capacity 越高,当前 CPU 负载越高,所以频率也调的很高。
而当前内核社区中,已经有两个成形的方案。一个是 ARM 和 Linaro 主导的项目 - cpufreq_sched,属于 EAS 的一部分。而另外一个 Intel 主导的项目 - schedutil。
schedutil
而 schedutil就是利用这个负载变化回调机制,通过 cpufreq_add_update_util_hook 注册回调函数,当 CPU 负载出现变化的时候,就会触发 schedutil sugov_update 进行调频动作。