LWN:为 sched_ext 引入子调度器

Linux内核学习总目录:版本锚定与子系统映射指南 Linux内核是一个持续演进的巨型软件系统,其核心概念如内存管理、进程调度、文件系统等,均随版本迭代发生结构性变化。理解这些机制的前提,是掌握其演进原理与版本适配逻辑——例如slab分配器在SLAB/SLUB/SLQB间的演进,或shrink_slab函数参数从v4.19到v6.1的语义迁移。这种技术价值在于规避因版本错配导致的调试失效,支撑真实场景下的内核模块开发、性能调优与故障定位。本文聚焦构建可信、可验证、可维护的内核知识体系,以版本锚定和子系统映射为双核心,提供面向工程实践的路径组织方法。 阅读详情

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

Jonathan Corbet
 Gemini translation
 原文链接:https://lwn.net/Articles/1056014/ 

可扩展调度类(extensible scheduler class,简称 sched_ext)允许安装由一组 BPF 程序构建的自定义 CPU 调度器。它在 6.12 内核版本中的合并,使内核摆脱了此前一直采用的“一刀切”调度方式;现在,任何系统都可以拥有针对其工作负载进行优化的专用调度器。然而,在任何给定的机器内部,它仍然是“一刀切”的:整个系统只能加载一个调度器。来自 Tejun Heo 的 sched_ext 子调度器(sub-scheduler)补丁系列旨在改变这一现状,允许在单个系统上运行多个 CPU 调度器。 

sched_ext 的构建基于这样一个理念:没有哪个调度器能针对它可能遇到的所有工作负载都进行优化。子调度器的工作扩展了这一理念,认为没有任何调度器——甚至是 sched_ext 调度器——能够为给定系统可能运行的每种工作负载都提供最优性能。正如补丁说明(cover letter)中所说: 

“应用程序通常拥有通用调度器无法掌握的特定领域知识。数据库系统了解查询优先级和锁持有者的关键性。虚拟机监控器可以与客户机调度器协作,并智能地处理 vCPU 放置。游戏引擎知道渲染截止日期以及哪些线程是对延迟敏感的关键线程。” 

运行单一工作负载的系统也可以运行针对该工作负载优化的专用调度器。但系统所有者往往希望系统保持繁忙,这意味着在同一台机器上运行多个工作负载。如果同一系统上的两个工作负载能从不同的调度算法中受益,那么其中至少有一个最终会出现性能不佳的情况。 

解决方案是允许将 sched_ext 调度器附加到控制组(control groups)。系统中的每个任务都将由附加到其所在控制组(或最近的祖先组)的调度器管理。内核长期以来一直支持 CPU 控制器(CPU controller),允许管理员跨控制组分配 CPU 资源。有趣的是,子调度器功能并不依赖于 CPU 控制器;相反,它直接与控制组机制绑定。因此,CPU 控制器仍然负责每个组获得多少 CPU 时间,而子调度器则负责管理这些 CPU 时间如何被其各自组内的进程使用。 

附带调度器的控制组最多可以嵌套四层。在控制组层级结构中,任何要作为另一个调度器父节点的调度器,在编写时都必须考虑到这一职责。只有在父调度器允许的情况下,将子调度器附加到控制组的操作才会成功。父调度器还控制何时调用子调度器的 dispatch() 回调函数。该回调指示调度器选择下一个要运行的任务,并将其添加到特定 CPU 的分发队列(dispatch queue)中。换句话说,父调度器控制给定工作负载(由控制组表示)何时可以运行,子调度器控制构成该工作负载的进程如何访问 CPU,而 CPU 控制器则负责它们运行可用的 CPU 时间总量。 

内核导出了大量的 kfuncs(内核函数),允许 sched_ext 程序对调度器及其下运行的进程进行操作。这些 kfuncs 需要进行通用化处理,以便它们不再是操作“唯一的”调度器,而是操作相应的子调度器。运行多个调度器的系统还必须格外小心,确保这些调度器之间互不干扰。例如,代表给定调度器运行的 BPF 程序不应能够影响——甚至看到——可能存在的任何其他调度器。因此,sched_ext kfuncs 的通用化必须以维护整个系统安全性和健壮性的方式进行。 

为此,许多 kfuncs 已通过增加一个隐式参数(implicit argument)得到了增强,使它们能够访问与运行任务相关联的 bpf_prog_aux 结构;通过该结构,它们可以获取指向应处理的子调度器数据的指针。BPF 程序本身永远不需要指定它们正在操作哪个调度器,也没有能力操作除其所属调度器之外的任何其他调度器。内核能够确保它们始终与正确的子调度器绑定。 

同样,必须防止 sched_ext 程序操作非其实现的调度器管辖下的进程。内核已经在进程任务结构中维护了一个结构(struct sched_ext_entity),其中包含使用 sched_ext 管理每个任务所需的信息。新补丁系列在该结构中添加了一个新字段(名为 sched),指向控制该任务的(子)调度器。任何对进程进行操作的 kfunc 都可以利用这一信息来确保该进程确实处于尝试进行更改的调度器的管辖之下。 

sched_ext 的设计初衷是防止出现故障的调度器造成过大损害。当检测到运行中的调度器出现问题时(例如,一个可运行任务未能在合理时间内分发到 CPU),该调度器将被置于“旁路模式”(bypass mode)。当有意关闭调度器时,也会进入此模式。在旁路模式下,调度器将被停用,其下运行的所有任务都将被置于一个简单的 FIFO(先入先出)调度器管理之下。在当前的内核中,这种旁路调度器是全局性的。 

然而,在拥有多个调度器的系统中,允许一个子调度器将进程抛入全局 FIFO 队列可能会干扰其他子调度器。因此,当使用子调度器时,如果存在父调度器,它将继承进入旁路模式的子调度器中的任务。反之,如果父调度器进入旁路模式,层级结构中其下的任何调度器也将被置于旁路模式。 

当前的补丁集(第 1 版,尽管在 2025 年 9 月也发布过一个 RFC 版本)还不是一个完整的实现。它主要涵盖了分发路径(dispatch path)——即给定调度器将任务发送到 CPU 执行的过程。然而,在分发之前还有几个重要的阶段,本系列补丁尚未涉及: 

  • select_cpu() 回调在任务首次唤醒时被调用。调度器应决定如何处理该任务,包括为其选择运行的 CPU(尽管在此阶段选择并非最终决定)。

  • enqueue() 回调将实际把任务放入分发队列。该队列可能是特定 CPU 的本地分发队列,也可能是调度器维护的其他队列,任务稍后将从这些队列放入 CPU 本地队列。

为了实现完整的子调度器方案,显然需要完善这些回调路径。不过,目前已有的内容足以展示整个设计的运作方式。目前已经有一个 scx_qmap 调度器的修改版本,它既能作为父调度器运行,也能作为子调度器运行;它以一种相对简单的形式展示了调度器本身需要进行的更改类型。 

如前所述,这是一项处于早期阶段的工作,尚未完成。因此,人们不应指望在短时间内就能看到内核支持子调度器。然而,不难想象这一功能对于运行多种工作负载的系统是多么有用,因此会有明确的动力推动其最终完成。届时,“一刀切”的调度模型将被远远抛在身后。 

LWN 评论概述:

一些读者探讨了应用程序捆绑专用调度器的前景,以及子调度器在简化新调度器测试方面的潜力。 

具体而言: 

  • 应用程序捆绑调度器?

     有人猜测未来是否会出现自带调度器的应用程序。这听起来合乎逻辑,因为开发者最了解其软件的行为,提供一个合理的默认调度器并允许用户进一步定制,可以更好地榨取系统性能。

  • 测试新调度器:

     另一个优势在于测试。开发者可以在受限的 cgroup 中运行新调度器,而不必担心在开发早期阶段因调度器故障导致整个系统崩溃。

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

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

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

Linux 7.2 正式上线,这次更新藏着不少硬核技术 Linux 内核又迎来了一次重要更新。8 月 16 日,Linus Torvalds 正式宣布 Linux 7.2 发布。这一版本并没有把重点放在某一个特别显眼的桌面功能上,而是把大量工作放在了 CPU 调度、内存管理、文件系统、存储 I/O、网络以及硬件支持这些更底层的地方。其中最值得关注的变化,是经过长期开发后终于进入 Linux 7.2 的 Cache Aware Scheduling,也就是缓存感知调度。 阅读详情

相关推荐

【信息科学与工程学】【产品体系】第三十三篇 DPU/smartinic芯片中的学科知识03

需求实现DMA 与流边界检测优化​分级超时状态机(短/中/长)+ 积压计数 + 批量触发DMA 控制器优化​描述符预取(深度 4)+ 中断合并(阈值 8)Fence 语义正确性验证​RTL 断言 + C 语言序列号检测 + 性能对比 + 硬件计数器所有代码均为可综合 Verilog,已在仿真器中通过基本功能测试。在 FPGA 原型上运行上述 RTL,配合 ChipScope 观察 fence 时序在 BlueField-3 上运行 DOCA DPA 测试程序,对比加/不加 fence 的结果。

weixin_49199313的博客 275

LWN:再次推动 sched_ext!

关注了就能看到更多这么棒的文章哦~Another push for sched_extBy Jonathan CorbetMay 9, 2024ChatGLM translationhttps://lwn.net/Articles/972710/可扩展调度器类(extensible scheduler class,或称 "sched_ext")是一个综合性的框架,它可以支持将 CPU 调度器实现为...

Linux News搬运工 802

电感选型不当的代价:从纹波激增到系统失稳的深度剖析

本文深度剖析了电感选型不当对开关电源系统的严重影响。电感值过小会导致纹波电流激增、元件热应力加剧、EMI超标乃至MOSFET击穿;电感值过大则会引起环路响应迟滞、动态性能下降和轻载效率恶化。文章通过实测案例,强调了超越经典公式进行动态与容差考量的必要性,并提供了基于饱和电流、温升电流及环路测试的精准选型方法论,帮助工程师规避从纹波失控到系统失稳的潜在风险。

flink9streamer的博客 406

LWN:可扩展scheduler class!

关注了就能看到更多这么棒的文章哦~The extensible scheduler classBy Jonathan CorbetFebruary 10, 2023DeepL assisted translationhttps://lwn.net/Articles/922405/总是有人试图将 BPF 引入内核的 CPU 调度器领域,这只是一个时间问题。1月底,Tejun Heo 发布了一个由 3...

Linux News搬运工 964

【上海大学计算机组成原理实验报告】七、程序转移机制

学习实现程序转移的硬件机制//掌握堆栈寄存器的使用//手动方式实现子程序调用转移过程//手动方式实现子程序返回转移过程//编程实现`OUT`寄存器交替显示`11`和`55`//若要求`11`和`55`各显示`50`次后停机,应该如何修改程序?//根据实验指导书的相关内容,实验箱系统的程序转移硬件机制在于,当`LDPC`有效时,如果此时`DUBS`上的值就是转移的目标地址,则此目标地址被打入`PC`,从而实现程序的转移;若`LDPC`为`0`是附带条件的,就形成“条件转移”。

HackerKevon的博客 2471

在Window上安装和配置VTK9.x,并在QT项目中调试VTK是否可用

VTK+MSVC+Qt Creator + CMake配置

qq_42279379的博客 1000

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

平衡小车动力学建模

两轮自平衡小车由车体和双轮两部分组成,可以看成一个移动的倒立摆,分别对车轮和车体进行力学分析,建立动力学模型,最后,通过对两者的分析给出系统的状态空间表达式。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kjiPEUVJ-1679470559950)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20230322110521545.png)]

qq_23096319的博客 9053

Linux 7.2 发布:开发周期繁忙成果多,Igalia 贡献亮点足!

改进了 sched_ext 的可观测性,以便简化调试工作。遗憾的是,在 7.2 - rc7 测试周期间,该策略被报告存在一个紧急回归问题,因此默认策略仍为旧的先进先出(FIFO)调度器。此外,还为树莓派 4 和 5 的 GPU 实现了出色的运行时电源管理,改进了 sched_ext、futex 并修复了一些常规漏洞。该问题会在设备探测和断开连接期间,通过 `request_firmware` API 在 `kernfs` 创建和删除操作之间引发竞态条件,多年来在 syzbot 上产生了大量的漏洞报告。

IT界那些事儿 18

配置某VLAN下ONU的二层互访(隔离)问题(解决OLT二层隔离问题)

问题:OLT的ONU节点之间在同一VLAN下的终端默认隔离,在确实需要互通的场景下如何解决。

symstandsun的博客 4564

【运动规划算法项目实战】Artificial Potential Field算法(附ROS C++代码)

在机器人行业中,路径规划是一个关键的任务,它涉及到如何让机器人在复杂的环境中安全而高效地移动。人工势场算法(Artificial Potential Field Algorithm)是一种常用的路径规划方法,它借鉴了物理学中的势能概念,通过模拟力的作用来引导机器人的移动。本文将详细介绍人工势场算法的原理、在路径规划中的应用、算法优缺点以及代码实现。人工势场算法基于两种势场:斥力场和引力场。斥力场使机器人远离障碍物,而引力场将机器人吸引到目标位置。

xiewf的博客 1万+

Linux内核学习路线:从入门到精通的系统化专栏指南

操作系统内核是管理硬件资源与提供系统服务的核心软件,其工作原理涉及进程调度、内存管理、文件系统与设备驱动等关键机制。理解内核如何协调CPU、内存与IO设备,是提升系统性能与排查底层问题的技术基础。在嵌入式开发、云计算与驱动开发等场景中,内核知识直接影响系统稳定性与资源利用率。本专栏以数据流向为主线,将Linux内核拆解为可独立消化的模块,从启动流程、内存管理到调试调优,结合可复现的实操案例,帮助开发者建立完整的底层知识体系。

weixin_34218890的博客 384

自动驾驶算法-滤波器系列(三)——不同运动模型(CV、CA、CTRV、CTRA)的建模和推导

CV & CA & CTRV & CTRA1. CV模型2. CA模型3. CTRV模型4. CTRA模型 1. CV模型 2. CA模型 3. CTRV模型 4. CTRA模型

weixin_41480034的博客 2万+

PdfCraft OCR 入门:5 分钟把扫描件 PDF 变成可搜索文档(完全离线)

扫描版 PDF 的本质是一整张图:里面的字选不中、复制不了,Ctrl+F 也永远搜不到。PdfCraft OCR 是这款纯 Rust 开源 PDF 工具箱里的"扫描与识别"功能,它给每个单词补上一层隐形文本——图像一个像素都不动,页面却从此能搜索、能复制。全程免费、完全离线,文件不会离开你的电脑。 读完这篇,你能做到三件事: - 对一个扫描件跑完一次完整的 OCR,并解释清楚每个参数在干什么

gitblog_00510的博客 249

Claude Code设置中文输出指南

Claude Code 的语言配置其实并不复杂,只要做好全局的默认设置,再加上一些小的提醒技巧,就能完全避免突然切换英文的问题,让你全程用中文流畅地和 AI 助手协作,不用再被语言问题打断工作节奏,真正提升开发效率。

篮球界最会写bug的人;程序猿中打球最菜的人。 2220

Camera2Demo

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

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 195

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

在Codex 让AI模型 拥有长期智能记忆

本文介绍Claude-Mem V15新功能——智能记忆召回,解决AI遗忘、重复提示、执行不一致等问题。通过本地部署claude-mem,实现自动记录决策(如数据库选型)、跨会话智能召回,支持记忆写入、检索、遗忘全流程闭环。相比传统记忆方案,其基于Hooks自动捕获工具调用,结构化存储,可追溯、可共享、可清理,显著提升工程效率与协作一致性,是长期项目中理想的“工作黑匣子”与“工程脑”。

米莱虾 265

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 117

Docker Compose:搭建本地多服务开发环境

从一个 Java API、PostgreSQL 和 Redis 开始,配置服务名、端口、环境变量、健康检查、数据卷和依赖关系。理解 Compose 文件如何被解析、项目如何隔离,以及哪些数据不能依赖“重建容器”保留,能够把个人开发环境整理成团队可复用的启动入口。

m0_62221377的博客 428

45-存储过程与函数

匿名块跑完就没了,想下次再用只能复制粘贴。给块起个名字存进数据库,就成了存储过程与函数:一次编译、处处调用、权限收口,还能让 Java 侧少拼 SQL。这篇讲封装、调用、限制与排错的完整套路。CREATE OR REPLACE 覆盖式创建,事务由调用方控制;参数三模式 IN 只进、OUT 只出、IN OUT 双向,OUT 参数调用时要备好变量接;调用三姿势 EXEC、CALL、匿名块,命名传参=>最清晰;函数必有 RETURN,想在 SQL 里调用就不能碰 DML 和事务控制;

yuhou25的博客 152

AI全栈实战 | 3.9-01 爬虫入门:requests 加 BeautifulSoup 三分钟跑通,但 90% 的人栽在这 4 个“礼貌“问题上

⚠️:本文内容仅用于。请遵守目标站点的服务条款与相关法律法规,不得对目标服务造成负担,不得采集、传播个人隐私数据。技术是中性的,边界在你手里。爬虫的入门技术(requests 发请求 + BeautifulSoup 解析)三分钟就能学会。真正区分"会用爬虫"和"会做爬虫的人"的,是这篇我们跑通"请求→解析→存储"的最小闭环,然后重点把"合规与礼貌"这根弦给你绷上。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 393

数据库乐观锁深度解析:MySQL、PostgreSQL 实战 + Spring Boot 集成指南

Oracle 提供了ORA_ROWSCN伪列(System Change Number),记录最后修改行的 SCN,类似 PostgreSQL 的xmin。实践中通常仍使用 version 字段方案,逻辑与 MySQL 完全相同。-- Oracle:通过 ORA_ROWSCN 实现乐观锁-- 更新时比对 SCN// 自定义注解// AOP 切面@Aspect@Component@Slf4jtry {

yjc_1111的专栏 399

数据库主键选型指南:BIGINT vs VARCHAR

主键选型关乎数据库性能与架构演进。BIGINT(如雪花算法)在顺序写入、二级索引开销和分布式生成上优势显著,适合高并发核心链路;而传统 VARCHAR UUIDv4 因随机性导致频繁页分裂、存储膨胀,性能堪忧。UUIDv7 通过时间戳有序性实现高效追加写入,结合 BINARY(16) 存储可兼顾性能与安全,成为现代微服务新选择。关键在于:主键应稳定、无业务含义,优先选用趋势递增的紧凑类型,并根据场景合理采用双主键模式或 ULID 等替代方案。

小李同学的博客 300

自动化运维选型:四条技术路线的能力边界,以及它们为什么不能互相替代

自动化运维怎么选型?拆解配置管理、基础设施即代码、作业调度与场景化编排四条技术路线边界,分析账本归属与时间语义差异,给出四种架构组合与判断点,帮企业看清为何不能互相替代。

trainsignalcn的专栏 324

不用再为文本搜索单独维护一套系统!全文检索深度解析

为了给商品、客服工单或者企业知识库增加一个搜索框,企业往往需要在业务数据库之外,再部署一套Elasticsearch。数据库保存商品、订单和用户等真实业务数据,搜索引擎保存另一份文本索引;两套系统之间,还需要通过CDC、消息队列或者同步程序持续传输数据。一个看似简单的搜索需求,最后可能变成两套集群、两份数据和一条必须保持稳定的数据链路。由此产生的问题并不少:数据库已经完成更新,搜索结果却可能尚未同步;业务查询同时涉及文本、库存、权限和订单状态时,应用需要在两个系统之间来回组合结果;

TiDB 社区干货传送门 207

48-逻辑结构表空间段区块

默认 10%,意思是块里的空闲空间低于 10% 时就不再插入新行,留着给已有行的 UPDATE 变胖用。注意 INSERT 过程中每次申请新区,都是一次潜在的空间报错点,如果表空间满了,此刻就会抛 ORA-01653。剩下的空间被谁占了?段的每个区可以落在表空间的任一数据文件,所以 2T 的表在 32G 单文件上限(smallfile)的世界里照样能活——多加文件就行。,一张只有两个 CLOB 字段的表,实际在库里是三个段(表段 + 两个 LOBSEGMENT),空间统计漏算 LOB 段是新手常犯的错。

yuhou25的博客 284
上一篇: LWN:让swap机制现代化:引入 swap table
下一篇: LWN:使用 Eurydice 将 Rust 编译为可读的 C 代码
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值