整理丨诺亚
出品 | 51CTO技术栈(微信号:blog51cto)
近日,一位Linux内核工程师出于兴趣用Rust编写了一个Linux调度器。
这位来自Ubuntu制造商Canonical的工程师名叫Andrea Righi。他在X(推特)上发文谈到,他利用圣诞假期进行了这项实验。没想到这个只是“出于好玩”而进行的项目却带来了意外惊喜。
初步结果显示:通过sched_ext实现并基于eBPF技术、能够在运行时加载的Rust调度器具有很大的潜力和希望。
1、令人意外的结果:Rust版超越默认版
“结果让我很惊讶。它不仅能够正常工作,而且在某些负载(例如游戏)下甚至可以超越Linux内核默认的EEVDF调度器。”
Righi表示,尽管仍处于原型阶段,但它成功完成了使命,即“证明在用户空间实现运行的工作调度器是可行的,并且在某些特定条件下甚至可以超越Linux默认调度器的性能”。
他还分享了一段视频:一个简单的电脑游戏Terraria正常运行,同时该机器正在后台进行内核编译。
基于广大吃瓜群众的要求,Righi将Linux默认调度器和Rust版调度器的内核构建时间和游戏性能进行了比对。
截图:来自X@arighi
可以看到,其中:
- linux sched:内核构建280s,Terraria ~每秒30帧
- rustland:内核构建361s,Terraria ~每秒60帧
也就是说,切换到Rust版调度器后,游戏画面提升到了每秒60帧,是之前的两倍,而同期内核编译只是多花了约30%的构建时间。由此可见,“scx_rustland”调度器在游戏中表现的确优于Linux内核默认调度器。
Righi已将相关代码托管在了GitHub上。感兴趣的朋友可以继续关注其未来的发展方向。
2、内核调度器之争:Linux需要更多的调度器吗?
Linux内核调度器负责执行一项关键任务,即分配给应用程序一段段的CPU时间,旨在确保每个应用程序都能公平地获得执行时间。
通常,这一目标是通过使用完全公平调度(Completely Fair Scheduler, CFS)算法来实现的。(注:CFS算法致力于平衡各个应用程序对处理器资源的需求,以达到整体系统性能最优化的效果。)
尽管Linux的“一刀切”式调度器在过去很长一段时间内表现出色,但在如今分布式计算环境日益复杂、IT环境异构化加剧的背景下,可能需要对其进行更新升级。
当传统的单一调度策略难以满足现实需求时,人们在寻求更多破局的路径,比如,通过引入如BPF这样的技术来实现更加灵活、可扩展且针对性更强的调度机制。
简单说明一下BPF。所谓BPF,是Berkeley Packet Filter的缩写。BPF提供了一种当内核或应用特定事件发生时候,执行一段代码的能力。BPF 采用了虚拟机指令规范,所以也可以看作一种虚拟机实现,使我们可以在不修改内核源码和重新编译的情况下,提供一种扩展内核的能力的方法。
2013 年由技术大牛Alexei Starovoitov 向Linux社区提交了重新实现BPF的内核补丁,相关工作于2014年正式并入Linux 内核主线。此举将其扩展成了通用的执行引擎,称为eBPF,其可以完成多种任务,包括用来创建先进的性能分析工具。
LWN.Net首席编辑Jonathan Corbett在今年2月评论道:“将BPF引入内核CPU调度器只是时间问题。”
Corbett解释说,基于BPF的调度器之所以有意义,有多个原因:它使得尝试新的调度方法变得更加容易。如今的系统远比过去几十年要复杂得多,因此需要更多领域特定和针对性的调度解决方案(例如针对游戏和网络应用的调度器)。此外,它还能为开发者提供一种针对其自身应用程序优化CPU使用方式的方法。
而Righi开发的scx_rustland是对sched_ext这一实验性Linux内核特性的实现,sched_ext允许运行可在内核中创建并加载的基于BPF的内核线程调度器。该特性由来自Meta和Google的一组工程师以及其他内核社区成员共同研发,并希望有一天能将其合并到Linux内核的核心代码库中。
值得注意的是,并非Linux社区中的每个人都支持动态调度这一理念,其中包括Linus Torvalds本人。Linux调度器维护者Peter Zijlstra在评论sched_ext的首次发布时提到:“我讨厌这一切”,并补充道,鉴于替代调度器引入的复杂性,Torvalds曾否决了之前关于此类调度器的所有尝试。
此外,AMD和Google两家公司也提出了各自的替代调度器方案。这些举措表明,在如何优化Linux内核调度以适应更复杂异构环境的问题上,业内依旧各执一词。
3、使用Rust,真的会比C更有优势吗?
近年来,在编程语言界,Rust的存在感越来越强。不少公司、个人都开始对使用内存安全的Rust进行关键任务开发产生了浓厚兴趣,以取代可能意外引入安全漏洞的C语言。
此前,我们也曾在《Linux 诞生32年:“暴君”Linus 平和了》一文中报道过,Torvalds对于在内核中使用Rust持开放态度。他曾谈到,从明年开始会着手将Rust引入驱动程序、甚至是某些主要子系统,总之“Rust确实有成为内核重要部分的趋势”。
因此,在Linux新闻网站Phoronix报道Righi的工作时,将关注点放在了Rust的使用上。让这篇文章引起讨论的焦点从调度器本身挪开,集中到了关于使用Rust而非C语言是否更有优势上面。
有人质疑:“这个调度器到底有何与众不同,使其表现出了实质性的差异?是因为它尚未完成还是确实因为它更优秀?因为我不相信Rust本身会比C语言更好。究竟有什么是在Rust中能做而在C中做不到的呢?”
有人更是直接指出,调度器的设计始终涉及权衡取舍。显然,这款为游戏优化的调度器牺牲了一些其他功能以换取更好的游戏性能。
当然也有人对此持更为积极的态度。在Hacker News讨论中,有网友写道:“这篇新闻告诉我们的是,Rust实现的调度器在这一领域可以与C语言实现相媲美。这一消息为我们解锁了更多选择,无论是C语言调度器还是Rust调度器,意味着Linux社区在处理各种工作负载时可以获得更好的体验。”
而对于Righi本人,他在接受媒体采访时表示,Rust提供了极大的灵活性,这使他能够迅速启动并推进这个项目。
“我不能说Rust在性能提升方面贡献巨大,但它让我能够在几周内编写出这个调度器,同时实现和重用了优雅的高级抽象,并在我需要的时候能够深入到底层细节。”
参考链接:
https://www.phoronix.com/news/Rust-Linux-Scheduler-Experiment
https://thenewstack.io/bpf-opens-a-door-to-linux-dynamic-scheduling-maybe-with-rust/