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
+關注
關注
88文章
11760瀏覽量
219036 -
函數
+關注
關注
3文章
4417瀏覽量
67513
原文標題:華為開發者貢獻Linux內核補丁,將核心內核函數速度提升715倍
文章出處:【微信號:OSC開源社區,微信公眾號:OSC開源社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
內核.config文件:嵌入式開發的“底層配置密碼”,90%的開發者都在靠它掌控系統核心
Linux內核編碼風格權威總結:從縮進到底層設計,讓你的代碼更“內核味”
深入RK3588內核:rockchip_linux_defconfig的作用與調試價值
Linux系統內核參數調優實戰指南
【「Linux 設備驅動開發(第 2 版)」閱讀體驗】+讀內核處理的核心輔助函數
深入Linux內核:進程調度的核心邏輯與實現細節
GCC -O0?編譯內核:調試黨的?“救命神器”,這些優勢?90%?開發者沒吃透!
基于 DR1M90 的 Linux-RT 內核開發:從編譯配置到 GPIO / 按鍵應用實現(1)
Linux內核printk日志級別全解析:從參數解讀到實操配置
華為開發者貢獻Linux內核補丁,將核心內核函數速度提升715倍
評論