Linux cgroups机制中的cpu/cpuset/schedtune子系统 跟linux/android进程调度策略有关,记录下各项功能参数的用法。
SchedTune
SchedTune是一项与CPU调频相关的性能提升技术,它实现为一个cgroup控制器。
这个控制器提供了一个名称为schedtune.boost
的配置参数,运行时系统可以使用它来更改该组中的进程的调度方式。
每当调整这个参数的时候,它会使受影响的进程看起来比实际更重(或更轻)。如果一个组被提升了25%,那么调度程序将期望它使用的CPU时间比它实际上要多25%,并且CPU频率调控器将相应地对处理器提速。因此,以这种方式“提升”进程不会影响其调度优先级,但会影响其最终运行的CPU的速度。
SchedTune扩展仅适用于负载较轻的系统。当系统饱和时,SchedTune应当自动禁用。
Pixel XL上/vendor/etc/init/init.rc
文件中的相关配置如下:
# set default schedTune value for foreground/top-app (only affects EAS)
write /dev/stune/foreground/schedtune.prefer_idle 1
write /dev/stune/top-app/schedtune.boost 10
write /dev/stune/top-app/schedtune.prefer_idle 1
write /dev/stune/rt/schedtune.boost 30
write /dev/stune/rt/schedtune.prefer_idle 1
可以看到,这里为rt
和 top-app
两个进程组设置了处理器提速。
schedtune提供了一套用户接口的工具,用于功耗-性能调节。schedtune是cgroup的一个子系统。所以在cgroup的mount节点下,stune分别为每个group,都提供了2个调节开关:
- schedtune.boost
boost的值用int型表示,范围为[0, 100]。
boost默认值为0,代表CFS调度器会工作在能耗最低的状态。这也意味着schedutil使task跑在最低的OPP。
boost值100,则表示调度器为工作在性能最高的状态,同时OPP也处在最大。
0-100的范围可以根据其他场景来进行适当调节。比如,优化交互的响应、电池电量变化等。
- schedtune.prefer_idle
这是一个控制调度器节省功耗优先,还是性能优先的flag。
默认值0,会让CFS调度器根据energy-aware wakeup策略来分配在group中的task。(功耗优先)
当值设为1,会让CFS调度器分配task时,有最小的wakeup延迟。(性能优先)
android平台下使用这个flag用来表示正在和用户交互的应用。
设为1的节点:
dev/stune/foreground/schedtune.prefer_idle
dev/stune/top-app/schedtune.prefer_idle
设为0节点:
dev/stune/background/schedtune.prefer_idle
dev/stune/rt/schedtune.prefer_idle
schedtune.prefer_idle
是一个标志位,它向调度器指示用户空间希望调度器更关注功耗或者更关注性能。当这个值设为1,表示希望调度器尽可能减少改组中进程唤醒延迟(倾向于性能)