LWN:Linux 新的 EEVDF 调度器!

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

CFS调度器自2007年以来在Linux内核中负责大部分进程的CPU时间分配,但并非无懈可击。PeterZijlstra提出的EEVDF调度器旨在改善延迟问题,提供一种不依赖启发式方法的新策略。EEVDF结合公平性和虚拟截止日期来优化调度,尤其对延迟敏感的进程更为友好,有望简化内核中的调度代码。

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

An EEVDF CPU scheduler for Linux

By Jonathan Corbet
March 9, 2023
DeepL assisted translation
https://lwn.net/Articles/925371/

内核的完全公平调度器(CFS, completely fair scheduler)管理着大多数 Linux 系统上运行的大多数进程的 CPU 时间分配决策。CFS 在 2007 年的 2.6.23 版本中被合并,并且经过无数次的不断调整,至今已经能很好处理了这个工作了。不过,CFS 并不完美,有些情况它还是处理得有些问题。由 Peter Zijlstra 发布的 EEVDF 调度器就提供了一种新的可能性,同时减少了它对那些脆弱的启发式方法的依赖。

CFS and scheduling constraints

CFS 的关键设计目标之一可以从它的名字中,也就是公平性,要确保系统中的每个进程都能公平地得到它的应有的 CPU 时间。这个目标是通过跟踪每个进程获得多少时间,然后找出那些获得的 CPU 时间比其他进程要少的进程来执行从而实现的。其中每个进程的运行时间都是要用 "nice" 优先级值来做一下调整从而计算得出的。换句话说,CFS 是一个加权的公平排队调度器(weighted fair queuing scheduler)。

事实证明,fairness 足以解决许多 CPU 调度问题。然而,除了公平分配 CPU 时间之外,调度程序还要考虑许多其他约束条件。例如,它应该要能让系统内存 cache 最大化利用起来,这需要尽量减少进程在 CPU 之间的移动。但与此同时,如果有工作要做的话,它又应该让所有的 CPU 都忙起来。电源管理也是一个复杂的问题;有时候不可以采用最有利于系统吞吐量的最佳决策,因为需要保护电池寿命。。那些 hybrid 系统(所有的 CPU 不全都是一样的)又增加了更多的复杂性,等等等等。

有一个需要改进的地方就是对于那些有明确 latency 要求的工作的处理。一些进程可能不需要大量的 CPU 时间,但当它们确实需要 CPU 时,要求能尽快拿到。其他进程可能需要更多的 CPU 时间,但如果有必要的话,可以等待一会儿再拿到 CPU。CFS 并没有给进程提供什么方法可以表达他们的 latency 要求;nice 值(优先级)可以用来给进程更多的 CPU 时间,但这不是一回事。实时调度类(realtime scheduling class)可以用在对延迟要求很高的工作上,但如果希望采用 realtime class 来调度运行,这需要有特权才可以实现,而且实时进程会严重影响系统其他部分的运行。

现在缺少的是一种方法,可以确保一些进程能够快速访问 CPU,而不一定让这些进程会获得超过其公平份额的 CPU 时间。作为解决这个问题的一个尝试,已经有一组 latency nice patch 在讨论了一段时间。它们可以让严格的 latency 要求的 CFS 进程能在想要运行时跳过队列直接获得 CPU。这些 patch 确实是有效的,但 Zijlstra 认为可能有一个更好的方法来解决这个问题。

Introducing EEVDF

EEVDF 全称 “Earliest Eligible Virtual Deadline First” 调度算法,它并不是什么新事物,是在 1995 年由 Ion Stoica 和
Hussein Abdel-Wahab 在 1995 年的论文中描述过。它的名字就暗示,它是跟内核的 deadline scheduler 所使用的 Earliest Deadline First algorithm 很类似。但是这里的差异是,EEVDF 不是一个 realtime 时调度程序,所以工作方式不一样。理解 EEVDF 需要掌握几个(相对)简单的概念。

EEVDF 跟 CFS 一样,试图把可用的 CPU 时间公平地分配给正在争夺它的那些进程。例如,如果有五个进程试图在一个 CPU 上运行,那么每个进程应该得到 20%的可用时间。每个进程的 nice 值可以用来调整其公平时间的计算结果,nice 值较低(因此优先级较高)的进程有权获得更多的 CPU 时间,而牺牲那些具有较高 nice 值的进程。这些内容都是以前就有的概念。

我们来考虑一下一秒钟时长的一个时间段;在这段时间内,我们的五个进程中,每个进程应该得到 200ms 的 CPU 时间。由于一些原因,没能按照安排来做到,其中一些进程得到了过多的时间,而另一些进程则被缩短了。EEVDF 会对每个进程计算出该进程应该得到的时间和它实际得到的时间之间的差异。这个差异被称为 "lag"。lag 值为正的进程就没有得到公平的份额,应该比 lag 值为负的过程要更早调度。

事实上,当且仅当计算出的 lag 值大于或等于零时,才认为这个进程是 "合格的(eligible)";任何具有负值的 lag 值的进程都都没有资格运行。对于任何不合格的过程,在未来的某个时间,它有权得到的时间逐渐增长,赶上它实际得到的时间,于是可以再次成为合格的进程;这个时间就被称为 "合格时间(eligible time)"。

因此,lag 值的计算是 EEVDF 调度器中的一个关键部分,大部分的 patch set 都是为了能正确得到这个值。即使使没有完整的 EEVDF 算法,也可以利用一个进程的 lag 值来将其公平地放在运行队列中;lag 值较高的进程应该先运行,从而以使整个系统的 lag 值比较均匀。

另一个起作用的因素是 "虚拟截止日期(virtual deadline)",它是一个进程应该得到其应有的 CPU 时间的最早时间。这个期限的计算方法是将一个进程分配的时间片与它的合格时间值相加。一个拥有 10ms 时间片的进程,如果其合格时间(eligible time)是未来 20ms,那么它的 virtual deadline 就是未来 30ms

EEVDF 的核心理念就可以从它的名字中看出,它将首先运行那些具有最早的 virtual deadline 的进程。因此,调度选择是结合了 fairness(用于计算合格时间的 lag 值)以及每个进程当前有用的时间值来共同决定的。

Addressing the latency problem

有了这个框架之后,对 latency 敏感的进程的优先调度就自然而然地实现好了。当调度器在计算每个进程的时间片时,它会考虑到该进程分配的 latency-nice 值;一个具有较低的 latency-nice 值的进程(也就意味着更严格的 latency 要求)的进程将得到一个更短的时间片。对 latency 相对漠不关心的进程将得到较长的时间片。请注意,给任何两个进程的 CPU 时间(具有相同的 nice 值)将是相同的,但低延迟的进程将获得更多更短小的时间片段。

前面说过,virtual deadline 是通过将时间片加上 eligible time 而计算出来的。这将导致具有较短时间片的进程可以具有更近的 virtual deadline,因此也会被首先执行。对延迟敏感的进程,通常不需要大量的 CPU 时间,而是希望能快速响应事件;而没有延迟要求的进程将被给予更长的运行时间
片,这可以帮助提高吞吐量。不再需要那些启发式的复杂规则来解决这个问题。

不过,要想让一篇学术论文的内容能在 Linux 内核中成为一个表现良好的实现,这还有很多工作要做。Zijlstra 才开始对他的 EEVDF 调度器进行 benchmark 测试;他的初步结论是:"有一些变好了,一些变坏了,但没有什么迹象表明这个方向是完全错误的"。一些结果 "似乎表明 EEVDF 的调度比 CFS 更稳定,并且有很多延迟方面的优势"。

虽然这显然是一个很好的起点,但 Zijlstra 承认仍有相当多的工作要做。但是,他说,"如果我们能做到这一点,我们就可以删除一大堆让人不舒服的启发式代码",用一个定义得更好的策略来取代它。这不是一个小的改动,他补充说:"它完全重塑了最基本的 scheduler、placement、preemption、picking 等等所有的机制。它们唯一的共同点是,它们都是基于 virtual time 的调度器。"

不用说,这样一个根本性的改动不太可能被快速合入内核。幸运的是,目前的 patch 将 EEVDF 作为一个选项,可以跟 CFS 并列。这样就可以进行更广泛的测试,而不需要实际取代当前的调度器。CPU 调度器必须为几乎任何人们可以想象得到的场景都做出正确的选择,包括内核可以支持的所有各种系统,这就表明,哪怕只对它做一些小改动,人们也有可能看到有一些场景变得更差了,更何况这样一个打改动。因此,在考虑用 EEVDF 取代 CFS 之前,必须先进行大量的测试。至于合适才能见到这件事情发生,我们并没有什么已知的 deadline,无论是不是 virtual 的。

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

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

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

format,png

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:补全EEVDF调度器!

关注了就能看到更多这么棒的文章哦~Completing the EEVDF schedulerBy Jonathan CorbetApril 11, 2024ChatGLM translationhttps://lwn.net/Articles/969062/最早虚拟截止时间优先(EEVDF, Earliest Virtual Deadline first)调度器已作为 6.6 内核的一个选项合并...

Linux News搬运工 1375

内核新特性功能跟踪

内核一直发展很快,每次看release note 有一些自己感兴趣或者未知的记录下。

平面到立体 450

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

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

m0_50499434的博客 2011

T100服务端接口实战:从注册到日志排查的全链路开发指南

本文提供了一份T100服务端接口开发的全链路实战指南。从程序注册与框架签出开始,详细讲解了接口的数据结构设计、核心业务逻辑编写,到最终的部署上线与调用验证。文章重点分享了如何利用日志文件高效定位和排查接口问题,帮助开发者快速掌握T100接口开发的关键步骤与实用技巧。

weixin_28831399的博客 297

M1/M2 Mac用户看过来:不装VirtualBox,用PD虚拟机也能跑ENSP的保姆级教程

本文为M1/M2 Mac用户提供了一份不依赖VirtualBox,使用Parallels Desktop虚拟机运行ENSP的详细指南。通过ARM架构的Win10镜像选择、组件替代方案和网络配置优化,实现ENSP核心功能的高效运行,特别适合网络工程师在苹果芯片设备上进行网络模拟。

weixin_28683065的博客 411

Ubuntu大佬神操作!Rust版Linux调度器秀麻了,性能远超C!

近日,一位Linux内核工程师出于兴趣用Rust编写了一个Linux调度器。这位来自Ubuntu制造商Canonical的工程师名叫Andrea Righi。他在X(推特)上发文谈到,他利用圣诞假期进行了这项实验。没想到这个只是“出于好玩”而进行的项目却带来了意外惊喜。初步结果显示:通过sched_ext实现并基于eBPF技术、能够在运行时加载的Rust调度器具有很大的潜力和希望。

IT界那些事儿 322

不用标注数据!用SAM 3零成本搞定遥感图像分割:SegEarth-OV3保姆级上手教程

本文介绍了如何利用SAM 3和SegEarth-OV3实现零标注遥感图像分割,提供从环境配置到结果优化的完整教程。通过开放词汇语义分割技术,用户无需标注数据即可快速获得专业级分割结果,适用于光伏板统计、灾害评估等场景。

weixin_30415113的博客 583

LWN:定制调度器来暴露并发bug!

关注了就能看到更多这么棒的文章哦~Exposing concurrency bugs with a custom schedulerBy Daroc AldenFebruary 5, 2025FOSDEMGemini-1.5-flash translationhttps://lwn.net/Articles/1007689/Jake Hillion在FOSDEM上做了一个关于使用sched...

Linux News搬运工 852

5分钟搞定Nano-Banana图片编辑API对接:从Base64编码到生成图片全流程

本文详细介绍了如何快速对接Nano-Banana图片编辑API,基于gemini-2.5-flash-image-preview模型,从环境准备、Base64编码到API调用的全流程。通过实战示例和优化技巧,帮助开发者高效集成AI图片处理能力,提升产品竞争力。

dog123的博客 259

别再自己造轮子了!用MONAI Model Zoo里的预训练模型,5分钟搞定医学影像AI项目

本文介绍了如何利用MONAI Model Zoo中的预训练模型快速搭建医学影像AI项目,大幅节省开发时间和计算资源。通过实战案例展示了UNet、DenseNet121等核心模型的应用技巧,帮助临床医生和研究者5分钟内启动高质量医学影像分析,特别适合小样本场景下的病灶分割和分类任务。

weixin_33704234的博客 238

LWN:用SCHED_EXT和IOCost改进性能!

关注了就能看到更多这么棒的文章哦~Improving performance with SCHED_EXT and IOCostBy Daroc AldenApril 1, 2024SCALEChatGLM translationhttps://lwn.net/Articles/966618/在今年的SCALE大会上,来自 Meta 的 Dan Schatzberg 和 Tejun Heo 先后连...

Linux News搬运工 979

大学生智能车竞赛初次尝试经验分享--1(硬件绘制电路,pcb部分)

本人机械电子专业大二暑假参加全国大学生智能车竞赛,之前参加过一些其他类型的比赛有一点基础,由于之前疫情影响所以做智能车比赛断代了,没有学长带也没有思路,从一开始的一头雾水逐渐摸索出我感觉比较实用的经验。 一.首先是硬件的准备工作: 1.硬件部分与要自己设计需要的电路制成pcb。推荐使用Altium Designer20,AD比较常用所以有多实用的教学视频,另外需要自己了解布线规则,包括信号线,电源线常用的宽度 一些电源电路,驱动电路建议用multisim仿真,没有问题再进行制版 单片机有关的需要仿真

weixin_52679034的博客 9831

LWN 2025内核年度回顾:调度器、文件系统与BPF演进方向

操作系统内核的发展,始终牵动着服务器性能、云原生稳定性与基础设施的可观测能力。理解内核下一代演进方向,是系统工程师做出正确技术选型的前提。近年来,内核开发从追求新功能转向精细化调优,调度器在混合负载下的公平性与延迟控制、内存管理在回收机制上的水线调节、IO栈在异步路径上的深度优化,共同构成了性能突破的关键支点。同时,随着Rust安全抽象逐步落地、BPF在追踪与网络场景扮演更重要角色,以及文件系统在稳定与兼容之间的平衡,内核正在从功能堆叠进入工程成熟期。LWN2025年度回顾揭示的正是这些底层变化与趋势,为内

weixin_29611239的博客 261

JavaScript实现边缘检测Canny(附完整源码)

JavaScript实现边缘检测Canny(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 705

STM32F103 -- LIN从机通讯 -- 程序代码 -- 详细讲解版(2万字长文)

主要代码分为3个文件,usart文件是对GPIO端口和串口Lin模式的初始化,lin_buffer文件是对串口环形缓冲区的编写,lin_driver文件是Lin从机模式驱动代码。通过这三个文件的代码便可实现STM32F103的LIN从机通讯。

晴朗luo的博客 1万+

LWN:OSPM 2025 报道——第三天!

很显然,这并非总是可取的,因此,当一个运行队列(run queue)的利用率超过 CPU 容量(capacity)的 80% 时,EAS 会自动停用,并回退到传统的容量感知负载均衡(load balancing)模式。因此,调度器会将捐赠者出队(dequeue),然后将其添加到其等待的锁的持有者任务关联的一个列表中。对我们所有人来说,应该清楚的是,仅依靠 Android 发布周期中的测试是不够的,并且存在将回归(regressions)引入主线(mainline)EAS/uclamp 代码的风险。

Linux News搬运工 1128

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

LWN:高层级服务质量(QoS)接口

此外,用户对比了 Windows 和 Linux 的系统健壮性,强调即便在极端负载下,系统也应保留足够的 CPU 和内存资源用于鼠标移动和启动终端,以避免用户在遇到失控程序时只能强行重启。它提供了四个 QoS 级别供程序选择:用户交互(user interactive,用于更新程序界面的任务)、用户发起(user initiated,用于用户正在进行的操作)、实用工具(utility,用于应及时发生但不会直接影响用户的任务)以及后台(background,用于对延迟没有特殊要求的任务)。

Linux News搬运工 97

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Linux QoS接口解析:EEVDF调度与性能优化实践

服务质量(QoS)是操作系统资源管理的核心技术,通过优先级调度、带宽保障等机制确保关键任务性能。Linux内核近年来引入EEVDF调度器,采用虚拟截止时间等创新算法,相比传统CFS调度器可提升30%的突发负载响应速度。本文重点解析高层级QoS接口设计,包括qos_set/qos_adjust等系统调用,以及min_bw、max_latency等核心参数。该技术特别适用于视频处理、实时数据库等混合负载场景,实测显示可降低55%的网络延迟。结合cgroup与EEVDF调度器,开发者能实现更精细化的资源控制,如为

weixin_42568801的博客 237

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

6.6内核版本主要特性

2023年10月29日星期天,Linux 6.6发布。

weixin_49382066的博客 1313

2025年Linux生态全景:内核Rust化、Wayland成熟与供应链安全

操作系统是数字世界的基础设施,而Linux则是最广泛的选择。内核作为核心组件,其演进方式决定了整个生态的稳定性与创新能力。近年来,内存安全成为关键议题,Rust for Linux从尝试走向实践,推动驱动开发进入新阶段;同时,桌面环境历经多年迭代,Wayland终于补齐了从显示服务到音频管理的最后一公里,使普通用户无需折腾即可获得完整的图形体验。在安全方面,供应链攻击的威胁促使社区构建可复现构建与SBOM等常态化防御设施。AI时代的算力调度更是深度绑定Linux内核,从GPU驱动到本地推理均以Linux为默

weixin_27330481的博客 90

2025年开源生态深度回顾:内核、容器与AI推理的底层演进

操作系统和云原生技术是数字世界的基石,内核调度器决定了系统在多任务下的公平与延迟,而容器运行时则支撑起现代应用的交付与隔离。随着AI推理负载进入基础设施层,GPU显存管理、网络带宽与调度策略成为新的工程挑战。开源生态在2025年展现出从底层到上层的协同进化:Linux内核持续吸纳Rust模块以提升内存安全,Kubernetes通过Gateway API和结构化日志打磨生产级体验,供应链安全则从口号转变为CI流水线中的默认策略。本年度回顾基于LWN的深度报道,梳理了发行版、桌面环境、开发环境容器化以及社区治理

weixin_31102231的博客 245

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

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

TCP/IP 1万+

An EEVDF CPU scheduler for Linux

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

weixin_49382066的博客 785

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

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

father_yingying的博客 2112

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

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

2503_90541313的博客 1354
上一篇: LWN:软中断处理的启发式规则!
下一篇: Zephyr:资源有限系统商的模块化OS!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值