—— 完 ——
龍蜥開源Plugsched:首次實現 Linux kernel 排程器熱升級 | 龍蜥技術
Plugsched 是 Linux 核心排程器子系統熱升級的 SDK, 它可以實現在不重啟系統、應用的情況下動態替換排程器子系統,毫秒級 downtime 。Plugsched 可以對生產環境中的核心排程特性動態地進行增、刪、改,以滿足不同場景或應用的需求,且支援回滾。
那麼
Plugsched 誕生的背景或者想要解決的問題是什麼?我們認為有以下 4 點:
-
應用場景不同,最佳排程策略不同。 應用種類極大豐富,應用特徵也是千變萬化 (throughput-oriented workloads, ?s-scale latency critical workloads, soft real-time, and energy efficiency requirements),使得排程策略的最佳化比較複雜,不存在“一勞永逸”的策略。因此,允許使用者定製排程器滿足不同的場景是必要的。
-
排程器迭代慢。 Linux 核心經過很多年的更新迭代,程式碼變得越來越繁重。排程器是核心最核心的子系統之一,它的結構複雜,與其它子系統緊密耦合,這使得開發和除錯變得越發困難。此外,Linux 很少增加新的排程類,尤其是不太可能接受非通用或場景針對型的排程器,上游社群在排程領域發展緩慢。
-
核心升級困難。排程器內嵌 (built-in)在核心中,上線排程器的最佳化或新特性需要升級核心版本。核心釋出週期通常是數月之久,這將導致新的排程器無法及時應用在生產系統中。再者,要在叢集範圍升級新核心,涉及業務遷移和停機升級,對業務方來說代價昂貴。
-
無法升級子系統。kpatch 和 livepatch 是函式粒度的熱升級方案,可修改能力較弱,不能實現複雜的邏輯改動;eBPF 技術在核心網路中廣泛應用,但現在排程器還不支援 ebpf hook,將來即使支援,也只是實現區域性策略的靈活修改,可修改能力同樣較弱。
-
與核心釋出解耦:排程器版本與核心版本解耦,不同業務可以使用不同排程策略;建立持續運維能力,加速排程問題修復、策略最佳化落地;提升排程領域創新空間,加快排程器技術演進和迭代
-
可修改能力強 :可以實現複雜的排程特性和最佳化策略,能人之所不能
-
維護簡單:不修改核心程式碼,或少量修改核心程式碼,保持核心主線乾淨整潔;在核心程式碼 Tree 外獨立維護非通用排程策略,採用 RPM 的形式釋出和上線
-
簡單易用:容器化的 SDK 開發環境,一鍵生成 RPM,開發測試簡潔高效
-
向下相容:支援老核心版本,使得存量業務也能及時享受新技術紅利
-
高效的效能:毫秒級 downtime,可忽略的 overhead。
Plugsched 應用案例
-
快速開發、驗證、上線新特性,穩定後放入核心主線
-
針對不同業務場景做定製最佳化,以 RPM 包的形式釋出和維護非通用排程器特性
-
統一管理排程器熱補丁,避免多個熱補丁之間的衝突而引發故障
應用案例 1:新增 Group Identity 排程特性
安裝該排程器模組後,在系統中建立兩個 cpu cgroup A 和 B,並繫結同一個 CPU,分別設定最高和最低優先順序,然後各自建立一個 busy loop 任務。理論上,當 A 中有任務執行時,B 中的任務會停止執行。此時用 top 工具檢視該 CPU 利用率,發現只有一個利用率是 100% 的 busy loop 任務,說明模組中的 Group Identity 特性已生效;而動態解除安裝該模組後,出現了兩個各佔 50% CPU 的 busy loop 任務,說明模組已經失效。
應用案例 2:與核心釋出解耦及定製化排程器
阿里雲某客戶使用的舊版本核心,由於該核心排程器對 load 的統計演算法不合理,導致 CPU 利用率過高,雖然修復補丁已經合入核心主線,但是新核心版本還未釋出,而且業務方也不打算更換核心,因為叢集中部署了大量的業務,升級核心成本較高。
那麼 Plugsched 該如何使用?
1、登陸雲伺服器後,先安裝一些必要的基礎軟體包:
# yum install anolis-repos -y # yum install podman kernel-debuginfo-$(uname -r) kernel-devel-$(uname -r) --enablerepo=Plus-debuginfo --enablerepo=Plus -y
2、建立臨時工作目錄,下載系統核心的 SRPM 包:
# mkdir /tmp/work # uname -r 4.19.91-25.2.an7.x86_64 # cd /tmp/work # wget
3、啟動並進入容器:
# podman run -itd --name=plugsched -v /tmp/work:/tmp/work -v /usr/src/kernels:/usr/src/kernels -v /usr/lib/debug/lib/modules:/usr/lib/debug/lib/modules docker.io/plugsched/plugsched-sdk # podman exec -it plugsched bash # cd /tmp/work
4、提取 4.19.91-25.1.al7.x86_64 核心原始碼:
# plugsched-cli extract_src kernel-4.19.91-25.2.an7.src.rpm ./kernel
5、進行邊界劃分與提取:
# plugsched-cli init 4.19.91-25.2.an7.x86_64 ./kernel ./scheduler
6、提取後的排程器模組程式碼在 ./scheduler/kernel/sched/mod 中,簡單修改 __schedule 函式,然後編譯打包成排程器 rpm 包:
diff --git a/kernel/sched/mod/core.c b/kernel/sched/mod/core.c index f337607..88fe861 100644 --- a/kernel/sched/mod/core.c +++ b/kernel/sched/mod/core.c @@ -3235,6 +3235,8 @@ static void __sched notrace __schedule(bool preempt) struct rq *rq; int cpu; + printk_once("scheduler: Hi, I am the new scheduler!\n"); + cpu = smp_processor_id(); rq = cpu_rq(cpu); prev = rq->curr; # plugsched-cli build /tmp/work/scheduler
7、將生成的 rpm 包複製到宿主機,退出容器,並安裝排程器包,排程器日誌顯示新修改的排程器已經生效:
# cp /usr/local/lib/plugsched/rpmbuild/RPMS/x86_64/scheduler-xxx-4.19.91-25.2.an7.yyy.x86_64.rpm /tmp/work # exit exit # rpm -ivh /tmp/work/scheduler-xxx-4.19.91-25.2.an7.yyy.x86_64.rpm # dmesg | tail -n 10 [ 878.915006] scheduler: total initialization time is 5780743 ns [ 878.915006] scheduler module is loading [ 878.915232] scheduler: Hi, I am the new scheduler! [ 878.915232] scheduler: Hi, I am the new scheduler! [ 878.915990] scheduler load: current cpu number is 64 [ 878.915990] scheduler load: current thread number is 626 [ 878.915991] scheduler load: stop machine time is 243138 ns [ 878.915991] scheduler load: stop handler time is 148542 ns [ 878.915992] scheduler load: stack check time is 86532 ns [ 878.915992] scheduler load: all the time is 982076 ns
Plugsched 主要包含兩大部分,第一部分是排程器模組邊界劃分與程式碼提取部分,第二部分是排程器模組熱升級部分,這兩部分是整個方案的核心。其整體設計方案如下:
圖2 plugsched 整體架構
首先進行的是排程器模組邊界劃分和程式碼提取流程,由於排程器本身並不是模組,因此需要明確排程器的邊界才能將它模組化。邊界劃分程式會根據邊界配置資訊(主要包含程式碼檔案、介面函式等資訊)從核心原始碼中將排程器模組的程式碼提取到指定目錄,然後開發人員可在此基礎上進行排程器模組的開發,最後編譯生成排程器 RPM 包,並可安裝在對應核心版本的系統中。安裝後會替換掉核心中原有的排程器,安裝過程會經歷以下幾個關鍵過程:
-
符號重定位: 解析模組對部分核心符號的訪問
-
棧安全檢查: 類似於 kpatch,函式替換前必須進行棧安全檢查,否則會出現當機的風險。plugsched 對棧安全檢查進行了並行和二分最佳化,提升了棧安全檢查的效率,降低了停機時間
-
介面函式替換: 用模組中的介面函式動態替換核心中的函式
-
排程器狀態重建: 採用通用方案自動同步新舊排程器的狀態,極大的簡化資料狀態的一致性維護工作
總結: 基於以上介紹,整體來看,Plugsched 使得排程器從核心中解放出來,開發人員可以對排程器進行專項定製,而不侷限於核心通用排程器;核心維護也變得更加輕鬆,因為開發人員只需要關注通用排程器的開發與迭代,定製化排程器可透過 RPM 包的形式進行釋出;核心排程器程式碼也會變得簡潔,無需再被各個場景的最佳化混淆起來。
未來,plugsched 會支援新版本核心和其它平臺,持續對其易用性進行最佳化,並提供更多的應用案例。最後,歡迎更多的開發者能參與到 plugsched 中。
加入龍蜥社群
加入微信群:新增社群助理-龍蜥社群小龍(微信:openanolis_assis),備註【龍蜥】與你同在;加入釘釘群:掃描下方釘釘群二維碼。歡迎開發者/使用者加入龍蜥社群(OpenAnolis)交流,共同推進龍蜥社群的發展,一起打造一個活躍的、健康的開源作業系統生態!
龍蜥社群( OpenAnolis)是由 企事業單位、高等院校、科研單位、非營利性組織、個人等在自願、平等、開源、協作的基礎上組成的非盈利性開源社群。龍蜥社群成立於 2020 年 9 月,旨在構建一個開源、中立、開放的Linux 上游發行版社群及創新平臺。
龍蜥社群成立的短期目標是開發龍蜥作業系統(Anolis OS)作為 CentOS 停服後的應對方案,構建一個相容國際 Linux 主流廠商的社群發行版。中長期目標是探索打造一個面向未來的作業系統,建立統一的開源作業系統生態,孵化創新開源專案,繁榮開源生態。
目前, 龍蜥OS 8.4 已釋出,支援 X86_64 、Arm64、LoongArch 架構,完善適配飛騰、海光、兆芯、鯤鵬、龍芯等晶片,並提供全棧國密支援。
歡迎加入我們,一起打造面向未來的開源作業系統!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70004278/viewspace-2885428/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 龍蜥白皮書精選:敏捷開發場景下的排程器熱升級 SDK敏捷
- 龍蜥開源核心追蹤利器 Surftrace:協議包解析效率提升 10 倍! | 龍蜥技術協議
- 萬里資料庫加入龍蜥社群,打造基於“龍蜥+GreatSQL”的開源技術底座資料庫SQL
- 技術門檻高?來看 Intel 機密計算技術在龍蜥社群的實踐 | 龍蜥技術Intel
- 龍蜥開發者說:首次觸電,原來你是這樣的龍蜥社群? | 第 8 期
- 龍蜥社群&龍蜥開發者獲CSDN2021年度技術影響力「年度開源專案」獎和「年度社群之星」
- 龍蜥利器:系統運維工具 SysAK的雲上應用效能診斷 | 龍蜥技術運維
- 龍蜥開發者說:海納百川,有容乃大,我在龍蜥社群的升級之旅 | 第 11 期
- 作業系統遷移難?Alibaba Cloud Linux 支援跨版本升級 | 龍蜥技術作業系統CloudLinux
- 全面升級!龍蜥自動化運維平臺 SysOM 2.0 可支援作業系統一站式遷移 | 龍蜥技術運維作業系統
- 助力Koordinator雲原生單機混部,龍蜥混部技術提升CPU利用率達60%|龍蜥技術
- 龍蜥社群高效能儲存技術 SIG 11 月運營回顧 | 龍蜥 SIG
- eBPF 雙子座:天使 or 惡魔?| 龍蜥技術eBPF
- 開源創新 源起潮“蜥”——龍蜥社群走進浪潮資訊 MeetUp 即將開幕
- 龍蜥社群&龍蜥理事長分獲 2023 開源創新榜“優秀開源社群、優秀開源人物”獎項
- 跨語言程式設計的探索 | 龍蜥技術程式設計
- InfoQ專訪龍蜥社群陳緒:從CentOS 停服說起,龍蜥作業系統的開源觀CentOS作業系統
- 永中軟體加入龍蜥社群,共建開源新生態
- 晟盾科技加入龍蜥社群,共建開源新生態
- 入門即享受!coolbpf 硬核提升 BPF 開發效率 | 龍蜥技術
- 基於 Coolbpf 的應用可觀測實踐 | 龍蜥技術
- 「龍蜥開發者說」徵稿啦!
- 龍頭整機廠商寶德加入,共建龍蜥社群開源新生態
- 依然順滑!Dragonwell 11如何改造全新垃圾回收器ZGC? | 龍蜥技術GoGC
- 喜報!龍蜥作業系統&龍蜥社群雙雙榮登2021“科創中國”開源創新榜!作業系統
- 鑑釋加入龍蜥社群,助力開源生態建設
- 效能提升 57% ,SMC-R 透明加速 TCP 實戰解析 | 龍蜥技術TCP
- 螞蟻安全科技 Nydus 與 Dragonfly 映象加速實踐 | 龍蜥技術Go
- Inspur KOS 龍蜥衍生版面向智慧新媒體轉型的探索與實踐 | 龍蜥案例
- 中電科技加入龍蜥社群,助力開源生態建設
- 龍蜥LoongArch架構研發全揭秘,龍芯開闢龍騰計劃技術合作新正規化架構
- 首次!龍蜥社群生態使用者實踐精選集釋出在即
- SysOM 案例解析:消失的記憶體都去哪了 !| 龍蜥技術記憶體
- 虛擬化解決方案 virtio 的技術趨勢與 DPU 實踐解讀 | 龍蜥技術
- 資料中心廠商超雲加入龍蜥社群,多款伺服器完成與龍蜥作業系統適配伺服器作業系統
- 華創視訊加入龍蜥社群,攜手共建開源新生態
- 龍蜥開發者說:我眼裡的龍蜥社群:一個包容的大家庭 | 第 10 期
- 雙龍賀歲,龍蜥 LoongArch GA 版正式釋出