IT之家 12 月 14 日消息,Linux 6.2 今日合并了來自華為鄭磊(Zhen Lei,音譯)的代碼,將核心內(nèi)核功能的速度提高了 715 倍。
在合并代碼模塊介紹中寫道:“得益于 Zhen Lei 的代碼,Tux(Linux 的吉祥物,這里指 Linux)在 kallsyms_lookup_name () 平均查找性能提高了 715 倍,將我們的舊實現(xiàn)從 O (n) 升級到 O (log (n)),同時還保留了 / proc / kallsyms 上的舊實現(xiàn)支持”。
IT之家了解到,kallsyms_lookup_name () 函數(shù)用于根據(jù)一個符號的名稱查詢其地址,并可用于內(nèi)核符號表內(nèi)任何符號的查詢。
華為的 Zhen Lei 在之前的補丁貼中描述了對 kallsyms_lookup_name 的優(yōu)化:
目前,為了搜索一個符號,我們需要將 'kallsyms_names' 中的符號逐一展開,然后使用展開后的字符串進(jìn)行比較。這是 O (n)。
如果我們像地址一樣將名字按升序排序,我們也可以使用二進(jìn)制搜索。而這就是 O (log (n))。
為了不改變“/proc/ kallsyms”的實現(xiàn),表 kallsyms_names [] 仍然以升序與地址一一對應(yīng)的方式存儲。
增加數(shù)組 kallsyms_seqs_of_names [],它以排序后的名字的序列號為索引,對應(yīng)的內(nèi)容是排序后的地址的序列號。
例如,假設(shè) NameX 在數(shù)組 kallsyms_seqs_of_names [] 中的索引是 'i',kallsyms_seqs_of_names [i] 的內(nèi)容是 'k',那么 NameX 的對應(yīng)地址是 kallsyms_addresses [k]。kallsyms_names [] 中的偏移是 get_symbol_offset (k)。
注意,內(nèi)存使用量將增加 (4 * kallsyms_num_syms) 字節(jié),接下來的兩個補丁將減少 (1 * kallsyms_num_syms) 字節(jié)并正確處理 CONFIG_LTO_CLANG=y 的情況。
性能測試結(jié)果(在 x86 平臺上):
之前:
min=234, max=10364402, avg=5206926
min=267, max=11168517, avg=5207587
之后:
min=1016, max=90894, avg=7272
min=1014, max=93470, avg=7293
kallsyms_lookup_name () 的平均查詢性能提高了 715 倍。這是 kallsyms_lookup_name 一次重大改進(jìn),也是 Linux 6.2 的圣誕禮物。
廣告聲明:文內(nèi)含有的對外跳轉(zhuǎn)鏈接(包括不限于超鏈接、二維碼、口令等形式),用于傳遞更多信息,節(jié)省甄選時間,結(jié)果僅供參考,IT之家所有文章均包含本聲明。