cfs调度类深入解刨——最新内核细节分析3

上一篇《cfs调度类深入解刨------最新内核细节分析2》中讲述了"代理调度运行"设计用意及延迟出列的实现方式,主要在任务优先级反转方面下了大功夫。

本篇文章讲述kernel 7.1版本中的dl服务器的实现技术与背景及deadline的调度原理。

dl服务器(dl_server)

deadline调度类

系列文章列表

dl服务器(dl_server)

dl服务器(dl_server)属于kernel 6.8版本deadline调度类新增的功能,用于解决普通或低优先级任务在实时cpu中得不到运行时间的问题。dl服务器自身也是一个dl调度实体(dl服务器与其它dl调度实体的区别是dl_se->dl_server = 1),在选取dl任务(更详细的说法是选取dl调度实体,返回dl调度实体的任务结构)时,如果选到的dl调度实体是dl服务器,则调用dl服务器初始化时传入的函数,以cfs调度类的dl服务器为例,通过fair_server_pick_task函数(pick_task_fair)从根cfs_rq队列向下遍历选择合适的任务,实际上征用了dl服务器名额运行。

在sched_init_smp->sched_init_dl_servers函数中,可以看到内核为每个cpu的fair_server(cfs调度任务的dl服务器)进行初始化,明确指明它是一个dl服务器。

cfs调度类的dl服务器在cfs任务入列函数中启动,需要满足刚进入函数时cfs_rq层级任务数量为0并且经过遍历(入列,更新权重)rq队列的cfs_rq层级任务数量等于或大于1个。

cfs调度类的dl服务器在更新当前任务函数(update_curr和update_curr_idle,同时包括cfs任务和延迟出列任务)中剩余可运行时间减去本次运行的时间,当本周期内剩余可运行时间小于等于0时则设置为限流状态,等下个周期刷新时间。

cfs调度类的dl服务器相关值:

dl_runtime 50*NSEC_PER_MSEC 任务在1000毫秒(1秒)周期内,被允许消耗的最大CPU(rq队列)时钟时间配额为50毫秒

dl_deadline 1000*NSEC_PER_MSEC 相对截止时间。意味着任务在每个周期开始被唤醒后,必须在接下来的 1000 毫秒内,找机会把它的 50 毫秒预算跑完

dl_period 1000*NSEC_PER_MSEC 任务的循环周期。每隔1000毫秒,任务的运行预算就会被"重新充值(Replenish)"

runtime 本周期剩余可运行时间

deadline 绝对截止时间(基于rq队列时钟)

dl_throttled 限流状态标记

dl_defer 延迟清扫,cfs_rq队列任务数量为0,但因为"延迟出列"红黑树上还有睡眠任务,dl_defer 状态就会被激活,参考dl_server_update_idle函数

dl_se->dl_bw=to_ratio(dl_se->dl_period,dl_se->dl_runtime); 长期带宽占用 50ms / 1000ms = 5%

dl_se->dl_density=to_ratio(dl_se->dl_deadline,dl_se->dl_runtime); 微观紧迫密度 50ms / 1000ms = 5%

https://lwn.net/Articles/934415/

根据lwn文章的内容说明,dl服务器的出现是为了解决实时任务的CPU使用率限制在(默认情况下)95%,剩余的5%留给优先级较低的任务,而这5%因为"某个实时任务确实需要长时间占用所有可用CPU时间"只能用于空闲时间的问题。

"大多数情况下,这种限流机制不会造成问题。在一个设计合理的实时系统中,实际的实时任务占用的 CPU 时间应该远低于 95%,因此限流机制实际上不会发生。但是,如果某个实时任务确实需要长时间占用所有可用CPU时间,那么实时限流就可能成为一个问题。尤其值得注意的是,即使没有优先级较低的任务等待运行,限流机制也会发生。在这种情况下,调度器不会运行仍然需要CPU的实时任务,而是会强制系统进入空闲状态。这种空闲时间是限流机制实现方式带来的一个不受欢迎的缺陷,而不是一个理想的特性。"

dl服务器利用高于实时任务优先级的因素,在每个周期开始被唤醒后,必须在接下来的1000毫秒内,找机会把它的50毫秒预算跑完,较为理想的解决了剩余的5%留给优先级较低的任务的问题。

deadline调度类

deadline调度类属于简易的eevdf版本(也可以说eevdf仿制的deadline调度类),在每个cpu具有一个dl_rq队列,dl_rq队列同样具有一颗红黑树保存任务调度实体的节点,还是按照截止日期的大小排列树中的顺序(调度顺序)。

但deadline调度类还有独特的一面,比如在根域(root_domain)中有cpu过载这么一说,比如实时任务和dl任务他们通常情况下一个cpu同时只存在或待运行的只能有一个任务,超过一个任务则这个cpu标记为过载并记录在rt或dl过载掩码中。

deadline调度类维护了cpudl结构,主要包括free_cpus掩码(哪些cpu没有dl任务)和elements(dl cpu子项),elements用于记录根域内不同cpu的绝对截止时间,用于快速寻找最适合放置新dl任务的cpu。

elements结构采用二叉树形式摆放cpu,截止时间越小的cpu越靠近根节点(确保堆顶(idx=0)始终是截止时间最早的任务),每当cpu设置或清理都会根据上升或下降方向将cpudl结构中的cpu,dl,idx更新到合适的elements位置。

系列文章列表

《cfs调度类深入解刨------核心结构的用意》

《cfs调度类深入解刨------核心结构细节分析》

《cfs调度类深入解刨------最新内核细节分析1》

《cfs调度类深入解刨------最新内核细节分析2》

相关推荐
A小辣椒1 小时前
TShark:Wireshark CLI 功能
linux
A小辣椒5 小时前
TShark:基础知识
linux
AlfredZhao7 小时前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao21 小时前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334661 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪1 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5202 天前
Linux 11 动态监控指令top
linux
不会C语言的男孩2 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言