12 月 14 日消息:Linux 6.2 今日合并了來自華為鄭磊(Zhen Lei,音譯)的代碼,將核心內核功能的速度提高了 715 倍。
在合并代碼模塊介紹中寫道:“得益于 Zhen Lei 的代碼,Tux(Linux 的吉祥物,這里指 Linux)在 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 [],它以排序后的名字的序列號為索引,對應的內容是排序后的地址的序列號。
例如,假設 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 平臺上):
之前:
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 一次重大改進,也是 Linux 6.2 的圣誕禮物。