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》

相关推荐
2301_803538952 小时前
CentOS版本差异详解和系统信息查看方法
linux·运维·centos
灰灰老师2 小时前
Docker部署Tomcat9
java·linux·docker·tomcat
Cx330❀2 小时前
【Qt 核心机制篇】深度解析 Qt 信号与槽(Signals & Slots)机制:从底层原理、实战演练到 Lambda 进阶
linux·开发语言·c++·人工智能·qt·ubuntu
田里的水稻2 小时前
OE_临时配置网络_linux系统终端命令行ip setting
linux·网络·tcp/ip
Cx330❀2 小时前
【Linux网络】从零构建高性能UDP服务器:从Echo到英译汉业务级实现
大数据·linux·服务器·开发语言·网络·c++·udp
Amnesia0_02 小时前
传输层协议UDP和TCP
linux·网络·tcp/ip·udp
minji...2 小时前
Linux 高级IO(三)多路转接之poll,poll的原理,poll版本的TCP服务器的实现
linux·服务器·网络·select·多路转接·epoll·poll
小此方2 小时前
Re:Linux系统篇(二十四)进程篇·九:进程从创建到退出的底层机制与写时拷贝全解
linux·运维·驱动开发
艾莉丝努力练剑2 小时前
【Linux网络】Linux 网络编程:传输层TCP(二)
linux·运维·服务器·网络·tcp/ip·计算机网络