LWN:补全EEVDF调度器!

CFS的覆灭,Linux新调度器EEVDF详解 总结了EEVDF论文和Linux内核实现中关键逻辑的推导,着重强调代码逻辑和论文公式之间的关系。 阅读详情
AI摘要

文章讲述了Linux内核6.6引入的EEVDF调度器的最新进展,包括行为调整、修复工作和新功能,如帮助延迟敏感任务的功能,以及时间片控制的改进。作者PeterZijlstra回归后提交的补丁旨在使调度更加公平且对延迟敏感任务更友好。

关注了就能看到更多这么棒的文章哦~

Completing the EEVDF scheduler

By Jonathan Corbet
April 11, 2024
ChatGLM translation
https://lwn.net/Articles/969062/

最早虚拟截止时间优先(EEVDF, Earliest Virtual Deadline first)调度器已作为 6.6 内核的一个选项合并了。这代表了对 Linux 系统中 CPU 调度方式的重大改变,但自那以后,EEVDF 相关领域一直相对安静。然而,调度器开发者 Peter Zijlstra 在长时间离开后回归,就带来了一系列补丁,旨在完成 EEVDF 工作。除了一些修复工作外,这项工作还包括一个显著的行为改变和一个旨在帮助对延迟(latency)敏感的任务的新功能。

快速回顾 EEVDF

EEVDF 调度器的工作是将可用的 CPU 时间平均分配给系统中所有可运行的任务(假设所有任务具有相同的优先级)。如果有四个相同优先级的任务争夺 CPU,那么每个任务都将获得 25%的份额。每个任务被分配一个虚拟运行时间,表示其分配的 CPU 份额;在四个任务的例子中,虚拟运行时间可以被视为以 25%的墙上时钟速度运行的时钟。当任务运行时,内核计算任务的虚拟运行时间与实际运行时间之间的差值;其结果被称为“滞后(lag)”。滞后值是正数就意味着任务缺少了 CPU 时间,而负值则表示任务获得了超出其份额的时间。

如果一个任务的滞后值为零或更大,则被视为“可运行(eligible)”;每当 CPU 调度器必须选择要运行的任务时,它会从可运行任务集里面进行选择。对于这些任务中的每一个,都会计算一个虚拟截止时间(virtual deadline),方法是将其剩余的时间片(time slice)加到其成为可运行状态的时间上。虚拟截止时间最早的任务将被选择运行。由于较长的时间片会导致虚拟截止时间较晚,因此具有较短时间片的任务(通常是延迟敏感的)倾向于首先运行。

举个例子可能有助于理解滞后是如何在决策中起作用的。假设有三个 CPU 密集型任务,分别称为 A、B 和 C,它们都在同一时间开始。在它们中任何一个运行之前,它们的滞后值都为零:


ABC
Lag:0ms0ms0ms

由于没有任务的 lag 值为负,所有任务都是可运行的。如果调度器选择 A 作为第一个运行的任务,并且使用 30 毫秒的时间片(随便选择一个数字),如果 A 运行直到时间片用尽,滞后情况将如下所示:


ABC
Lag:-20ms10ms10ms

在这 30ms 内,每个任务都本应得到 10ms(总时间的三分之一)的 CPU 时间。A实际上获得了 30ms,因此它积累了-20ms 的滞后值;其他两个任务由于没有获得任何 CPU 时间,所以滞后了 10ms,反映了它们应该获得的 10ms CPU 时间。

任务 A 不再是可运行的,所以调度器将不得不选择其他任务中的一个。如果给 B 一个 30ms 的时间片,并且 B 使用它,情况变为:


ABC
Lag:-10ms-10ms20ms

再次,每个任务都赚得了对应于其应得 CPU 时间的 10ms 的滞后值,并且 B 运行了 30ms。现在只有 C 是可运行的,所以调度器的下一个决定是很容易的。

可以从上面的表格中看到 EEVDF 调度器的一个特性,即系统中所有滞后值的总和始终为零。

滞后和睡眠

滞后计算仅跟可运行的任务相关;如果一个 task 睡眠了一天,那实际上也并没有错过它的虚拟运行时间(因为它没有),因此它不会积累出巨大的滞后值。然而,当任务入睡时,调度器会保留任务的当前滞后值,并在任务唤醒时从该值开始继续。因此,如果一个任务在入睡前已经超出了其分配的时间,那么它将在之后被唤醒时为此付出代价。

然而,会有这样一种情况,此时保留任务的滞后值可能没有意义。那个刚睡了一天的任务真的应该因为昨天被允许运行得有点超过其分配而受到惩罚吗?很明显,迟早,任务的滞后值应该恢复为零。但是何时恢复并不完全清楚。正如 Zijlstra在这个系列的补丁中指出的,在睡眠时立即把滞后值忘掉,就能使任务能够在时间片结束时(其滞后可能为负)短暂入睡,结果是它们获得了更多的 CPU 时间。简单地随时间来对滞后值进行衰减也不会有多大作用,他总结说,因为滞后值与虚拟运行时间相关,而虚拟运行时间以不同(并且变化的)速度在流逝。

解决方案是在虚拟运行时间内对正在睡眠的任务的滞后值进行衰减。在补丁集中,这个想法的实现挺有趣的。当一个任务入睡时,它通常会从运行队列中被删除,以便调度器无需再考虑它。但是,通过这个新的补丁,一个去睡觉的/不合格的/进程将会留在队列中,但被标记为“延迟出队(deferred dequeue)”。由于它是不合格的,所以它不会被选择执行,但它的滞后值将根据经过的虚拟运行时间而增加。一旦滞后变为正数,调度器将注意到任务并将其从运行队列中移除。

这个实现的结果是,短暂入睡的任务将无法摆脱负的滞后值,但长时间入睡的任务最终将被免除其滞后值的债务。有趣的是,正的滞后值将被无限期地保留,直到任务再次运行。

时间片控制

如上所述,具有较短时间片的任务将具有更早的虚拟截止时间,导致调度器更早地选择它们。但是,在当前的内核中,当调度器寻找要运行的新任务时,这种隐式的优先级只有在实际任务醒来时才会生效。如果一个具有较短时间片的延迟敏感任务醒来,它可能仍然必须等待当前任务用尽其时间片(可能很长)才能运行。然而,Zijlstra 的补丁系列通过允许一个任务在其虚拟截止时间更早时抢占另一个任务来改变这一点。这种改变为短时间片任务执行节奏的一致性更好,同时可能稍微降低了长时间运行任务的速度。

然而,还有一个问题:如何指定某个任务应该获得较短的时间片?在当前的内核中,非实时进程无法告诉内核其时间片应该是多少,因此这组补丁系列添加了这个能力。具体来说,一个任务可以使用sched_setattr()系统调用,在 sched_attr 结构的 sched_runtime 字段中传递所需的片段时间(以纳秒为单位)。在当前的内核中,这个字段只用于截止时间调度。通过这个补充,任何任务都可以请求更短的时间片,这将导致它更早地运行,可能更频繁地运行。然而,如果请求的时间片太短,任务将经常被抢占,总体运行速度会变慢。

时间片的允许范围为 100 微秒到 100 毫秒。对于感兴趣的人来说,Zijlstra 已经用 ASCII-art 图在这个补丁的变更日志中说明了各种时间片选择的结果。

这些改动处于相对早期阶段,似乎需要修订几版才能被合并。问题的之一是尚未处理与控制组的交互,这方面可能完全无法正常工作。但是一旦细节得到处理,EEVDF 调度器应该能准备好来供更广泛的使用了。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

7fd13f47f1ffa84ca4f1136703555318.jpeg

EEVDF代码详解(一) EEVDF是由Peter Zijlstra提出并在kernel-6.6中合入主线的调度算法,已经替代CFS成为Linux kernel中普通进程的默认调度器。基本介绍可参考,本文针对EEVDF中的一些关键代码进行讲解。 阅读详情

相关推荐

Linux调度器大换血:EEVDF如何解决CFS的时延痛点(附配置调优指南)

本文深入探讨了Linux新一代EEVDF调度器如何解决传统CFS调度器在时延敏感型任务处理中的不足。通过引入Eligible Time和Deadline Time机制,EEVDF在保持公平性的同时显著提升了实时任务响应能力。文章详细解析了EEVDF算法原理,并提供了生产环境配置调优指南,帮助开发者优化音视频处理、高频交易等时延敏感场景的性能表现。

xxx12的博客 921

LWN:Linux 新的 EEVDF 调度器!

关注了就能看到更多这么棒的文章哦~An EEVDF CPU scheduler for LinuxBy Jonathan CorbetMarch 9, 2023DeepL assisted translationhttps://lwn.net/Articles/925371/内核的完全公平调度器(CFS, completely fair scheduler)管理着大多数 Linux 系统上运行的大...

Linux News搬运工 4370

从EEVDF到UCLAMP:Qualcomm Linux调度器背后的设计哲学与实战调优

本文深入探讨了Qualcomm在QCS6490/QCS5430平台上如何通过EEVDF调度算法和UCLAMP机制优化Linux内核调度器,实现性能与能效的平衡。文章详细解析了这些技术在工业视觉和边缘计算等场景中的应用,并提供了实战调优指南,帮助开发者提升系统性能。

weixin_29279153的博客 293

Linux 进程的一生(二):从 CFS 到 EEVDF,调度器的演进与原理

回顾了 Linux 进程调度器的演进,从早期的 O(n) 调度算法,到 O(1) 调度器,再到目前主流的 CFS,并分析了 EEVDF 在 CFS 之上的改进。

m0_50499434的博客 2011

SpringBoot+Vue实现图片上传

SpringBoot+Vue实现图片上传

叶♥璃 2730

普通人也能看懂的Transformer源代码解释(PyTorch)

Transformer源代码解释之PyTorch篇 章节 词嵌入 位置编码 多头注意力 搭建Transformer 在这里插入图片描述 词嵌入 Transformer本质上是一种Encoder,以翻译任务为例,原始数据集是以两种语言组成一行的,在应用时,应是Encoder输入源语言序列,Decoder里面输入需要被转换的语言序列(训练时)。一个文本常有许多序列组成,常见操作为将序列进行一些预处理(如词切分等)变成列表,一个序列的列表的元素通常为词表中不可切分的最小词,整个文本就是一个大列表,元素为一个一

qq_50974223的博客 4167

未来的拥塞控制与 Linux EEVDF 调度器

之前的调度器之所以引入那么多 “启发式” 把戏都不尽人意,就因为无论多么大的权重,很容易被那些来无影去无踪,不易捕捉的 “紧急” 小事不停打断,比如 hardirq,softirq,做过系统运维的都知道,一旦 hardirq 不均衡,softirq 高了,系统就抖动了,这是不公平的根源,也是低效的根源,但一直以来 Linux 调度器都没有把这些 “闪客” 纳入管理,这次 EEVDF 做到了,我觉得这就是一个四象限调度器。因此,难点是如何将上述算法迭代得更优秀,而不是如何钻空子。,未来该如何,谈谈我的看法。

TCP/IP 1万+

4D毫米波雷达

详解4D成像毫米波雷达

sangba2019的博客 2391

An EEVDF CPU scheduler for Linux

任务调度器是内核的一部分,当有很多任务可以选择时,任务调度器决定下一个运行哪个任务,其角色对于达到良好的性能和延迟至关重要。以前的算法,名为CFS,已在Linux 2.6.23中合并。在6.6版本中,它被一个使用新算法的代码替代,该算法被称为EEVDF("最早可用虚拟截止日期优先")。

weixin_49382066的博客 785

ESP-SPARKBOT AI 智能机器人:v1.2 全流程复刻指南

本文介绍 ESP-SPARKBOT AI 智能机器人 v1.2 版本的全流程复刻,包含 PCB 、3D 打印、固件烧录、常见问题解决、参考资料等

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 9249

【WRF-FDDA】观测 Obs nudging 的配置与使用说明(中)

WRF-FDDA

WW、forever的博客 280

eevdf 内核调度器 源码分析 (1)

本文会从源码角度,简单分析eevdf(Earliest Eligible Virtual Deadline First)内核调度器。阅读本文需要一定cfs调度器的基础知识。

father_yingying的博客 2112

【软考高级架构】论文范文12——论生成式AI在软件开发中的应用与挑战

随着生成式AI技术的跨越式发展,以大语言模型为代表的生成式AI正在深刻改变软件开发的传统模式。在代码生成、测试构造、文档编写等环节,生成式AI展现出显著的效率提升潜力,但其应用也面临着代码质量不可控、安全漏洞植入、版权合规等严峻挑战。本文以笔者主导的某大型金融企业智能研发辅助平台建设项目为案例,围绕生成式AI在软件开发中的应用实践与应对挑战的策略展开论述。笔者担任系统架构师,负责平台架构设计、模型选型、质量保障机制及安全防线构建。

qq837993702的博客 275

EEVDF论文和要点简析

论文英文链接: https://citeseerx.ist.psu.edu/document?白话说明EEVDF的实现机制:重点讲清楚 ​和 ​是怎么算的。

远方雪的专栏 1219

Google Earth Engine(GEE)——将sentinel - 2影像所有波段重采样到10m分辨率 (resample 和 projection的使用)

影像重投影是将一个影像从一个坐标系投影到另一个坐标系的过程。这通常涉及到将像素从一个平面坐标系变换到另一个平面坐标系。这可以用于许多应用中,例如建立数字高程模型(DEM)和地图制图。影像重投影通常需要进行数学计算,包括转换矩阵和插值算法,以确保像素值的准确性和精度。这次我们将对哨兵2好数据中20m分辨率的波段,重采样到10m分辨率中,然后同一参与计算。

此星光明博客 3106

ICC2: 如何让CTS指定pin多长指定长度

这里create_clock不需要写到sdc里,在脚本里写就行,需要注意的是脚本里存在remove_clock_tree的话,add_buffer就要放remove_clock_tree后面,或者给guide buffer设don't touch也行。跟innovus的操作逻辑一样,如果要让tree上的某一点长长,要先考虑这个点后面的clock tree能正常balance。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?-5意味着长长5ns,相反正值意味着做短。

m0_61544122的博客 679

4 vCPU 实例达成 100 万 JSON API 请求/秒的优化实践

“性能工程” (Performance engineering)是个日渐流行的概念。顾名思义“性能工程”是包含在系统开发生命周期中所应用的一个技术分支,其目的就是确保满足非功能性的性能需求,例如:性能、可靠性等。由于现代软件系统变得日益复杂,我们在对抗性能这个凸显的挑战的时候往往显得无措手足,或者照本宣科的尝试一些偏方,寄希望奇迹发生;要么无止境的升级一切资源,试图以海量的资源对抗不确定的技术需求...

亚马逊云科技专栏 1122

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

CFS的完美进化版 -- EEVDF调度器简介

EEVDF(Earliest Eligible Virtual Deadline First),翻译为最早合格的虚拟截止日期优先。CFS调度算法根据其原理也可以解释为“最小虚拟时间优先”,因为其核心调度逻辑就是挑选vruntime最小的进程。而EEVDF现在将最小虚拟时间改为了最早虚拟截止日期,相同点就是都是用虚拟时间判断的,可以推断还是通过weight来对物理时间进行加权;不同之处就是用截至日期代替了之前的运行时间,截至日期从字面意思就可以判断其更强调调度延迟。

2503_90541313的博客 1354

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Linux CFS 的 EEVDF 算法:从 vruntime 到虚拟截止时间的调度优化

Linux 6.6引入EEVDF调度器替代CFS,带来三大革新:1)基于虚拟截止时间实现精确延迟控制;2)通过Lag机制自然处理睡眠任务公平性;3)支持用户态配置时间片(0.1-100ms)。EEVDF显著改善交互任务响应(5-10ms级),同时提供数据库负载调优能力,但需注意6.6+内核默认配置可能导致吞吐下降。开发者可通过sched_setattr()控制任务延迟,使用BPF工具监控调度行为,并根据场景调整PLACE_LAG等特性开关。

望获实时Linux系统 346

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Linux CFS 的 sched_base_slice:EEVDF 算法的基础时间片配置

Linux 6.8+内核引入EEVDF调度器取代CFS,其核心参数sched_base_slice(默认0.75ms)直接影响任务调度优先级和系统性能。EEVDF通过虚拟截止时间机制实现更精确的延迟控制,适用于不同场景:交互式应用(0.5-1ms)、混合负载(1-2ms)和批处理(4-10ms)。调试可通过/sys/kernel/debug/sched/base_slice_ns调整,Linux 6.12+还支持sched_setattr()进行每任务定制。性能测试工具推荐schbench和stress-n

望获实时Linux系统 437

Linux 6.6 RC 1 发布,还没加上 Bcachefs

Linux 6.6 亮点包括 EEVDF 调度器、有利于 AMD 芯片 CPU 的工作队列变更、DRM CI 实验、KSMBD 不再是实验性质、HP BIOS 设置驱动程序,内核 make xconfig 的 Qt6 端口,新声音硬件支持,Stadia 控制器震动支持,添加了 Intel IVSC 驱动程序,AMD Dynamic Boost Control, ReiserFS 被宣布过时,更好地防止 NVIDIA 专有驱动行为失控以及最终添加了 Intel Shadow Stack 支持。

Jdjdjjdjdjdje的博客 301

内核调度客制化利器:SCHED_EXT

一、前言今年年初,宋宝华老师发表了一篇对2023年内核技术总结的文章《熠熠生辉 | 2023 年 Linux 内核十大技术革新功能》。有兴趣的伙伴可以点击蓝色字体链接回顾。文章提及的10个技术中,与CPU任务调度器核心相关的内容,一共有两个,分别是可扩展调度类以及EEVDF调度算法。EEVDF调度算法的大名,相信大家并不陌生,它对统治内核任务调度多年的CFS调度策略发起了变革。CFS调度策略自Li...

内核工匠 6627

Linux CFS 的 pick_next_entity:EEVDF 算法的任务选择实现

Linux 6.6内核引入EEVDF调度器取代CFS,实现重大变革。EEVDF基于虚拟截止时间和lag机制,通过eligibility检查确保公平性,优化低延迟场景表现。核心改进包括:1) 引入lag概念确保任务公平性;2) 基于deadline的增强型RB-tree实现高效调度;3) 支持per-task时间片配置。相比CFS,EEVDF在容器混部、实时音视频等场景表现更优,解决了"睡眠者利用"等问题。本文详细解析了pick_next_entity等核心函数实现,并提供了性能调优建议和

望获实时Linux系统 395

Linux调度器演进:从O(1)到CFS再到EEVDF

公平——每个进程都应得到它应得的 CPU 时间效率——不能为了公平把 CPU 浪费在调度本身响应——交互式任务不能因为公平而卡顿原始调度器的巧妙(counter 衰减)、O(1) 的工程智慧(位图优先级数组)、CFS 的理论优雅(理想多任务 CPU 的模拟)、EEVDF 的精确建模(lag + VD)——每一代都在三条原则之间找到了一个新的平衡点。理解了这个演化脉络,你就理解了操作系统调度器设计语言的完整语法。

在渔村里看AI,偶尔捕点新鲜的。 550

eevdf 内核调度器 源码分析 (3)

上一篇文章介绍了当进程睡眠或就绪时,eevdf调度器的处理,本篇文章介绍eevdf调度器如何选择下一个运行的进程,包括睡眠抢占的逻辑。一个pick_eevdf函数,eevdf的核心逻辑展现的淋漓尽致,当然它还是做了一定妥协,给任务一个最短运行时间。至此eevdf的基本逻辑就分析完成了,那么这样做的好处是什么,为什么会,哪些场景会优于cfs?关注一下, 下一篇文章会进行分析。

father_yingying的博客 1594
上一篇: LWN:如何确定采用dlopen()方式引入了哪些依赖!
下一篇: LWN:关于两个麻烦驱动的故事!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值