Linux 6.2 近日合并了一個重要補丁,該補丁能夠將一個核心內核函數速度提升 715 倍。
從合并的注釋可知,貢獻此補丁的維護者 Zhen Lei 來自華為,他將 kallsyms_lookup_name () 的平均查找性能提高了 715 倍,從而使內核里面舊實現的時間復雜度從 O (n) 升級到 O (log (n)),大幅減少查找時間,同時還保留了 /proc/kallsyms 上舊的實現支持。 kallsyms_lookup_name () 函數用于根據名稱查找符號的地址,并可用于查找內核符號表中的任何符號。
Zhen Lei 曾在較早的補丁中描述了kallsyms_lookup_name () 的優化思路:
目前,要搜索一個符號,我們需要將 'kallsyms_names' 中的符號一個一個展開,然后使用展開后的字符串進行比較。這種算法的時間復雜度是 O (n)。
如果我們像地址一樣按升序對名稱進行排序,則可以使用二分查找。這種算法的時間復雜度是 O (log (n))。
為了不改變 “/proc/kallsyms” 的實現,表 kallsyms_names [] 仍然按照升序與地址一一對應存儲。
添加數組 kallsyms_seqs_of_names [],以排序后的 names 序號為索引,對應的內容為排序后的地址序號。例如:假設 NameX 在數組 kallsyms_seqs_of_names [] 中的索引為 'i',kallsyms_seqs_of_names [i] 的內容為 'k',則 NameX 對應的地址為 kallsyms_addresses [k]。kallsyms_names [] 中的偏移量是 get_symbol_offset (k)。
請注意,使用此方法內存使用量將增加 (4 * kallsyms_num_syms) 字節,接下來的兩個補丁將減少 (1 * kallsyms_num_syms) 字節并正確處理 CONFIG_LTO_CLANG=y 的情況。
性能測試結果:(x86)
Before:
min=234, max=10364402, avg=5206926
min=267, max=11168517, avg=5207587
After:
min=1016, max=90894, avg=7272
min=1014, max=93470, avg=7293
kallsyms_lookup_name () 的平均查找性能提高了 715 倍。
因此,該補丁帶來的唯一缺點是將內存占用量增加 3 * kallsyms_num_syms。 Linux 6.2 的模塊代碼還包含一個小的啟動優化,將啟動時間縮短了大約 30 毫秒。 相關鏈接:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=3ba2c3ff98ea8bfb219288dbacf2a23a902c751b
審核編輯 :李倩
-
Linux
+關注
關注
87文章
11511瀏覽量
213808 -
函數
+關注
關注
3文章
4381瀏覽量
64876
原文標題:華為開發者貢獻Linux內核補丁,將核心內核函數速度提升715倍
文章出處:【微信號:OSC開源社區,微信公眾號:OSC開源社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
華為正式啟動HarmonyOS 6開發者Beta
如何配置和驗證Linux內核參數
物聯網工程師為什么要學Linux?
樹莓派4 性能大比拼:標準Linux與實時Linux 4.19內核的延遲測試

云端AI開發者工具的核心功能
《HarmonyOS第一課》煥新升級,賦能開發者快速掌握鴻蒙應用開發
飛凌嵌入式ElfBoard ELF 1板卡-Linux內核移植之內核簡介
嵌入式工程師都在找的【Linux內核調試技術】建議收藏!
HarmonyOS NEXT應用元服務開發Intents Kit(意圖框架服務)事件推薦開發者測試
技術洞見|RISC-V IOMMU 的 Scalable 提案 (GIPC) 及 Linux 技術路線

deepin社區亮相第19屆中國Linux內核開發者大會
linux驅動程序如何加載進內核
Linux內核中的頁面分配機制

評論