Linux Kernel Utilization Clamping简介
随着linux内核调度技术的不断演进,目前存在多个调度类(stop、deadline、rt、cfs、idle)以满足不同性质和要求的任务(task)的调度需求。对于用户空间来说,完全公平调度器(CFS)和实时调度器(RT)是绝大多数任务所使用的,但是基于POSIX Priority算法不足以支撑关于选核和调频的调度器特性。关于任务的性质、性能/功耗需求用户空间拥有足够的信息,那么若将用户空间关于任务的信息传递给内核任务调度器,则能够更好的帮忙调度器进行任务的调度。Utilization Clamping(uclamp)便是这样一种机制。
一、Utilization Clamping(uclamp)
Utilization翻译过来是利用率、使用率的意思,存在CPU Utilization和Task Utilization两个维度的跟踪信号。CPU Utilization用于指示CPU的繁忙程度,内核调度器使用此信号驱动CPU频率的调整(schedutil governor生效时);
Task Utilization用于指示一个task对CPU的使用量,表明一个task是“大”还是“小”,此信号可以辅助内核调度器进行选核操作。但是用PELT负载跟踪算法得到的task util与用户空间期望有时候会出现分裂,比如对于控制线程或UI线程,PELT计算出的util可能较小,认为是“小”task,而用户空间则希望调度器将控制线程或UI线程看作“大”task,以便被调度到高性能核运行在高频点上使任务更快更及时的完成处理。同样地,对于某些长时间运行的后台task,eg:日志记录,PELT计算出的task util可能很大,认为是“大”task,但是对于用户空间来说,此类task对于完成时间要求并不高,并不希望被当作“大”task,以利于节省系统功耗和缓解发热。
uclamp提供了一种用户空间对于task util进行限制的机制,通过该机制用户空间可以将task util钳制在[util_min, util_max]范围内,而cpu util则由处于其运行队列上的task的uclamp值决定。通过将util_min设置为一个较大值,使得一个task看起来像一个“大”任务,使CPU运行在高性能状态,加速任务的处理,提升系统的性能表现;对于一些后台任务,通过将util_max设置为较小值,使其看起来像一个“小”任务,使CPU运行在高能效状态,以节省系统的功耗。
二、schedtune VS uclamp
Android Kernel 5.4以前,存在一个schedtune feature,也提供了与uclamp类似的功能。
schedtune与uclamp都是由ARM公司的Patrick Bellasi主导开发,uclamp作为schedtune的替代方案,弥补了schedtune种种不足,使得uclamp最终合入mainline kernel。

三、软件架构
用户空间进程管理服务将相关task的util clamp值通过适当接口传递到内核空间,调度器基于用户空间提供的信息通过schedutil驱动频率的调整,也可以基于该信息为task选择适当的core。

四、软件实现

五、用户空间接口
- system-wide API
proc/sys/kernel/sched_util_clamp_min
proc/sys/kernel/sched_util_clamp_max
全局设置值,用于限制per-task_group值和per-task值,使之不超过全局设置值,取值范围0 - SCHED_CAPACITY_SCALE。
- cgroup based API
cpu.uclamp.max
cpu.uclamp.min
基于cgroup实现的per-task group值,实现对相同性能/功耗需求的一组task的控制,该设置值会限制组内各个任务的per-task值。取值范围0.00 - 100.00,格式为两位小数精度的百分比值。
- per-task API
通过sched_setattr系统调用,每个任务都可以自主的设置各自的uclamp_min和uclamp_max,以满足自身的性能/功耗需求,但是该设置值会受制于cgroup设置值和系统全局设置值,取值范围0 - SCHED_CAPACITY_SCALE。
六、桶化算法

对于一个cpu来说,其运行队列rq上可能同时存在几个task(running/runnable),那么如何计算cpu的util_min和util_max则非常关键。uclmap使用桶化算法实现这种计算。
将[0 SCHED_CAPACITY_SCALE]划分为UCLAMP_BUCKETS个区间,每个区间看作一个桶,桶具有两个成员value、tasks,

存在UCLAMP_MIN、UCLAMP_MAX两个桶集合,rq上所有task的uclamp_min值放入UCLAMP_MIN桶集合、uclam_max值放入UCLAMP_MAX桶集合。多个任务位于同一个桶内,桶的值按最大值聚合原则,即由uclamp值最大的task决定。桶与桶之间同样按最大值聚合原则,即cpu的uclamp值由value值最大的桶决定。这样可以保证高性能任务其性能需求始终能够得到满足。
七、总结
用户通过uclamp机制可以向内核调度器提供task相关信息辅助调度器更好的执行调度任务,使得对频率的调整更加合理、对核心的选择更加贴合任务的性质,最终使得整个系统在性能和功耗上均能实现收益。
Linux Kernel Utilization Clamping简介的更多相关文章
- 【嵌入式开发】 Linux Kernel 下载 配置 编译 安装 及 驱动简介
作者 : 韩曙亮 转载请出名出处 : http://blog.csdn.net/shulianghan/article/details/38636827 一. Linux 内核简介 1. 内核功能简介 ...
- Android HAL层与Linux Kernel层驱动开发简介
近日稍微对Android中的驱动开发做了一些简要的了解. HAL:Hardware Abstract Layer 硬件抽象层,由于Linux Kernel需要遵循GPL开源协议,硬件厂商为了保护自己硬 ...
- Linux Kernel 0.12 启动简介,调试记录(Ubuntu1804, Bochs, gdb)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- Linux kernel简介
内核体系设计分:单内核,微内核 windows是微内核设计. Linux是单内核设计,但充分借鉴了为微内核体系的优点,为内核引入了模块化机制. 内核的组成部分 kernel:内核核心,一般为bz压缩的 ...
- Linux Kernel sys_call_table、Kernel Symbols Export Table Generation Principle、Difference Between System Calls Entrance In 32bit、64bit Linux
目录 . sys_call_table:系统调用表 . 内核符号导出表:Kernel-Symbol-Table . Linux 32bit.64bit环境下系统调用入口的异同 . Linux 32bi ...
- 单步运行linux kernel ?
如果能给linux kernel打log,如果能单步运行,如果能像普通应用程序那样,step by step的查看程序跑哪里了.. 该多好?这是一个梦想,但从未实现过:因为那是kernel,不是应用程 ...
- Linux Kernel 2.6.28 以上有BUG,系统运行第208.5天down机
简介: 业务服务器有一台服务器出现意外down机,服务器ping 不通.无法登陆,本想通过公司KVM系统登陆系统重启解决,登陆KVM后发现系统屏幕打印大量的内核错误,KVM无法使用.无法发送重启服务器 ...
- How do I Find Out Linux CPU Utilization?
From:http://www.cyberciti.biz/tips/how-do-i-find-out-linux-cpu-utilization.html Whenever a Linux sys ...
- Linux 内核引导选项简介
Linux 内核引导选项简介 作者:金步国 连接地址:http://www.jinbuguo.com/kernel/boot_parameters.html 参考参数:https://www.cnbl ...
- Linux Kernel sys_call_table、Kernel Symbols Export Table Generation Principle、Difference Between System Calls Entrance In 32bit、64bit Linux【转】
转自:http://www.cnblogs.com/LittleHann/p/4127096.html 目录 1. sys_call_table:系统调用表 2. 内核符号导出表:Kernel-Sym ...
随机推荐
- sharding-jdbc 兼容 MybatisPlus的动态数据源
背景:之前的项目做读写分离的时候用的 MybatisPlus的动态数据做的,很多地方使用的@DS直接指定的读库或者写库实现的业务:随着表数据量越来越大,现在打算把比较大的表进行水平拆分,准备使用 Sh ...
- appium python 点击坐标 tap
appium python 点击坐标 tap 有时候定位元素的时候,你使出了十八班武艺还是定位不到,怎么办呢?(面试经常会问)那就拿出绝招:点元素所在位置的坐标 tap用法 1.tap是模拟手指点击, ...
- 【ECharts】04 数据交互
ECharts 异步加载数据 ECharts 通常数据设置在 setOption 中,如果我们需要异步加载数据,可以配合 jQuery等工具,在异步获取数据后通过 setOption 填入数据和配置项 ...
- [rCore学习笔记 021]多道程序与分时任务
写在前面 本随笔是非常菜的菜鸡写的.如有问题请及时提出. 可以联系:1160712160@qq.com GitHhub:https://github.com/WindDevil (目前啥也没有 导读 ...
- NVIDIA显卡如何进一步压榨性能 —— 开启单用户独享模式
开启单用户独享模式可以提高显卡利用率,但是最大的缺点就是开启后显卡中只能有一个用户的程序,其他用户的程序只能等待显卡中原有程序全部退出才可以使用显卡,因此该种模式只适合于个人电脑,不适合于服务器(没有 ...
- C#自定义快捷操作键的实现 - 开源研究系列文章
这次想到应用程序的快捷方式使用的问题. Windows已经提供了API函数能够对窗体的热键进行注册,然后就能够在窗体中使用这些注册的热键进行操作了.于是笔者就对这个操作进行了整理,将注册热键操作写成了 ...
- Atcoder ABC297 E-G
Atcoder ABC297 E-G E - Kth Takoyaki Set 链接: E - Kth Takoyaki Set 简要题意: 问题陈述 有 \(N\) 种章鱼烧出售.一个 \(i\) ...
- 一个能够生成 Markdown 表格的 Bash 脚本
哈喽大家好,我是咸鱼. 今天分享一个很实用的 bash 脚本,可以通过手动提供单元格内容和列数或者将带有分隔符的文件(如 CSV.TSV 文件)转换为 Markdown 表格. 源代码在文末哦!原文链 ...
- .NET 8 + Vue 3 极简 RABC 权限管理系统
前言 在日常工作中,几乎每家公司都需要一个后台管理系统来处理各种任务.为了帮助大家快速搭建这样一个系统,给大家介绍一个基于最新技术 .NET 8 和前端框架 Vue 3 实现的极简 RABC(基于角色 ...
- CSS学习(一)CSS和文档
应用样式的三种方式 外部样式表(link.@import) 嵌入式样式表(<style></style>) 行内样式 (html元素的属性为style的值作为样式) CSS的空 ...