英戈·莫爾納, 著名的 Linux 內核開發人員和 CFS 任務計劃程序的作者 為 Linux 內核開發郵件列表討論提出了一些補丁,這些補丁影響了內核源代碼中一半以上的文件,並根據配置提供了 50 -80% 的整體內核重建速度提升。
實施的優化 值得注意的是,它與添加最大的變更集有關 在內核開發的歷史上:他們開始一次包含 2297 個補丁,更改了超過 25 個文件。
性能提升 是通過改變頭文件處理方式來實現的. 需要注意的是,在內核發展的三十年中,由於文件之間存在大量的交叉依賴,頭文件的狀態已經呈現出慘淡的態勢。
頭文件的重組耗時一年多, 需要對層次結構和依賴關係進行重大重新設計. 在重組期間,我們將不同內核子系統的類型定義和 API 分開。
我很高興地宣布我自 2020 年底以來一直在從事的新“Fast Kernel Headers”項目的第一個公開版本,這是對 Linux 內核頭層次結構和頭文件依賴項的全面改造,具有雙重目標:
- 加速內核構建(絕對和增量構建時間)
– 子系統類型和 API 定義相互解耦
正如大多數內核開發人員所知,Linux 內核中有大約 10,000 個主要的 .h 頭文件,位於 include / 和 arch/*/include/ 層次結構中。 在過去的 30 多年裡,它們已經演變成一組複雜而痛苦的交叉依賴,我們親切地稱之為“依賴地獄”。
所做的更改包括: 將高級頭文件相互分離, 排除鏈接頭文件的內聯函數,映射類型和 API 的頭文件,提供一組單獨的頭文件(大約 80 個文件具有乾擾彙編的間接依賴關係,通過其他文件頭文件暴露),自動添加依賴關係到“.h”和“.c”文件,逐步優化頭文件,使用“CONFIG_KALLSYMS_FAST = y”模式,選擇性地將C文件合併到彙編塊中以減少目標文件的數量。
結果, 所做的工作允許減少已處理的頭文件的大小在後預處理階段提高了 1-2 個數量級。
- 比如優化前,使用頭文件“linux/gfp.h”導致增加了13543行代碼,包含了303個依賴頭文件,優化後大小減少到181行,依賴文件26個。
- 再比如:預處理未打補丁的“kernel/pid.c”文件,連接了94行代碼,其中大部分沒有在pid.c中使用。 拆分頭文件使我們可以將處理的代碼量減少三倍,將處理的行數減少到 36。
當在測試系統上使用“make -j96 vmlinux”命令完全重建內核時,補丁顯示 v5.16-rc7 分支的編譯時間從 231,34 減少到 129,97,15,5 秒(從 27,7 到 XNUMX 次構建)小時)並且還提高了構建過程中 CPU 核心的使用效率。
使用增量構建,優化效果更加明顯:更改頭文件後重新構建內核的時間顯著減少(從 112% 減少到 173%,具體取決於更改的頭文件)。
優化目前僅適用於 ARM64、MIPS、Sparc 和 x86(32 位和 64 位)架構。
很好 如果您有興趣了解更多信息,您可以在中查看詳細信息 以下鏈接。