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》

相关推荐
GeW8 小时前
新质生产力路线图Linux、数据库、国产化替代一次讲透
linux
aningx10 小时前
cachyos 从 GRUB 切换到 rEFInd
linux
第404号工位12 小时前
40块钱二手瘦客户端,如何跑满家庭物联网中枢?(拒绝Docker爆盘实录)
linux·架构·node.js
骑着蜗牛撵大象32714 小时前
Linux 进程间通信之管道:从 pipe() 的内核语义到 FIFO 落地排错
android·java·linux·系统编程·fifo·管道·进程间通信
..Dauntless..14 小时前
【Linux】一切皆文件和缓冲区
linux·运维·服务器
QMCY_jason14 小时前
x86 ubuntu2204 无gui 安装 openeuler 2203 aarch64版本
linux·运维·服务器
重生之小比特14 小时前
【Linux系统】12 进程程序替换 自定义Shell 命令行解释器
linux·运维·服务器
あ-15 小时前
CubeSandBox配置CubeMaster CPU 超分
linux·运维·服务器
Escalating_xu15 小时前
【Linux 网络编程】TCP Socket 编程(上):从 listen、accept 到完整回显通信
linux·网络·tcp/ip
老秦包你会15 小时前
Linux第十课---------Linux信号
linux