Linux 6.2 近日合并了一個(gè)重要補(bǔ)丁,該補(bǔ)丁能夠?qū)⒁粋€(gè)核心內(nèi)核函數(shù)速度提升 715 倍。
從合并的注釋可知,貢獻(xiàn)此補(bǔ)丁的維護(hù)者 Zhen Lei 來自華為,他將 kallsyms_lookup_name () 的平均查找性能提高了 715 倍,從而使內(nèi)核里面舊實(shí)現(xiàn)的時(shí)間復(fù)雜度從 O (n) 升級(jí)到 O (log (n)),大幅減少查找時(shí)間,同時(shí)還保留了 /proc/kallsyms 上舊的實(shí)現(xiàn)支持。 kallsyms_lookup_name () 函數(shù)用于根據(jù)名稱查找符號(hào)的地址,并可用于查找內(nèi)核符號(hào)表中的任何符號(hào)。
Zhen Lei 曾在較早的補(bǔ)丁中描述了kallsyms_lookup_name () 的優(yōu)化思路:
目前,要搜索一個(gè)符號(hào),我們需要將 'kallsyms_names' 中的符號(hào)一個(gè)一個(gè)展開,然后使用展開后的字符串進(jìn)行比較。這種算法的時(shí)間復(fù)雜度是 O (n)。
如果我們像地址一樣按升序?qū)γQ進(jìn)行排序,則可以使用二分查找。這種算法的時(shí)間復(fù)雜度是 O (log (n))。
為了不改變 “/proc/kallsyms” 的實(shí)現(xiàn),表 kallsyms_names [] 仍然按照升序與地址一一對(duì)應(yīng)存儲(chǔ)。
添加數(shù)組 kallsyms_seqs_of_names [],以排序后的 names 序號(hào)為索引,對(duì)應(yīng)的內(nèi)容為排序后的地址序號(hào)。例如:假設(shè) NameX 在數(shù)組 kallsyms_seqs_of_names [] 中的索引為 'i',kallsyms_seqs_of_names [i] 的內(nèi)容為 'k',則 NameX 對(duì)應(yīng)的地址為 kallsyms_addresses [k]。kallsyms_names [] 中的偏移量是 get_symbol_offset (k)。
請(qǐng)注意,使用此方法內(nèi)存使用量將增加 (4 * kallsyms_num_syms) 字節(jié),接下來的兩個(gè)補(bǔ)丁將減少 (1 * kallsyms_num_syms) 字節(jié)并正確處理 CONFIG_LTO_CLANG=y 的情況。
性能測(cè)試結(jié)果:(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 倍。
因此,該補(bǔ)丁帶來的唯一缺點(diǎn)是將內(nèi)存占用量增加 3 * kallsyms_num_syms。 Linux 6.2 的模塊代碼還包含一個(gè)小的啟動(dòng)優(yōu)化,將啟動(dòng)時(shí)間縮短了大約 30 毫秒。 相關(guān)鏈接:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=3ba2c3ff98ea8bfb219288dbacf2a23a902c751b
審核編輯 :李倩
-
Linux
+關(guān)注
關(guān)注
87文章
11357瀏覽量
210833 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4350瀏覽量
63131
原文標(biāo)題:華為開發(fā)者貢獻(xiàn)Linux內(nèi)核補(bǔ)丁,將核心內(nèi)核函數(shù)速度提升715倍
文章出處:【微信號(hào):OSC開源社區(qū),微信公眾號(hào):OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
《HarmonyOS第一課》煥新升級(jí),賦能開發(fā)者快速掌握鴻蒙應(yīng)用開發(fā)
飛凌嵌入式ElfBoard ELF 1板卡-Linux內(nèi)核移植之內(nèi)核簡(jiǎn)介
嵌入式工程師都在找的【Linux內(nèi)核調(diào)試技術(shù)】建議收藏!
HarmonyOS NEXT應(yīng)用元服務(wù)開發(fā)Intents Kit(意圖框架服務(wù))事件推薦開發(fā)者測(cè)試
技術(shù)洞見|RISC-V IOMMU 的 Scalable 提案 (GIPC) 及 Linux 技術(shù)路線

deepin社區(qū)亮相第19屆中國Linux內(nèi)核開發(fā)者大會(huì)
深度解析linux HID核心

linux驅(qū)動(dòng)程序如何加載進(jìn)內(nèi)核
Linux內(nèi)核測(cè)試技術(shù)

Linux內(nèi)核中的頁面分配機(jī)制

歡創(chuàng)播報(bào) 華為宣布鴻蒙內(nèi)核已超越Linux內(nèi)核
使用 PREEMPT_RT 在 Ubuntu 中構(gòu)建實(shí)時(shí) Linux 內(nèi)核

評(píng)論