整理丨諾亞
出品 | 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/