FERRAMENTAS LINUX: O Kernel Linux 6.2 acelera uma função - kallsyms_lookup_name() em 715x

quarta-feira, 14 de dezembro de 2022

O Kernel Linux 6.2 acelera uma função - kallsyms_lookup_name() em 715x

 

Como um belo presente de Natal, o código mesclado hoje ao kernel  Linux 6.2 acelera uma função do núcleo do kernel em um fator de 715x.

A atualização do código dos módulos para as notas do ciclo do Kernel Linux 6.2 na mesclagem :

O Tux obtém para o natal uma melhoria no desempenho médio de pesquisa de kallsyms_lookup_name() em 715x graças ao trabalho de Zhen Lei, que atualizou nossa antiga implementação de O(n) para O(log(n)), mantendo também o antigo suporte de implementação em /proc/kallsyms.

A única penalidade foi aumentar o consumo de memória em 3 * kallsyms_num_syms.

A função kallsyms_lookup_name() é usada para procurar o endereço de um símbolo com base em seu nome e pode ser usada para procurar qualquer símbolo dentro da tabela de símbolos do kernel.

Zhen Lei da Huawei descreveu a otimização kallsyms_lookup_name em uma postagem de patch anterior :

Atualmente, para procurar um símbolo, precisamos expandir os símbolos em 'kallsyms_names' um por um e, em seguida, usar a string expandida para comparação. Está ligado).

Se classificarmos os nomes em ordem crescente, como endereços, também podemos usara pesquisa binária. É O(log(n)).

Para não alterar a implementação de "/proc/kallsyms", a tabela kallsyms_names[] ainda é armazenada em uma correspondência um-para-um com o endereço em ordem crescente.

Adicione a matriz kallsyms_seqs_of_names[], ela é indexada pelo número de sequência dos nomes classificados e o conteúdo correspondente é o número de sequência dos endereços classificados. Por exemplo: Suponha que o índice de NameX no array kallsyms_seqs_of_names[] seja 'i', o conteúdo de kallsyms_seqs_of_names[i] seja 'k', então o endereço correspondente de NameX é kallsyms_addresses[k]. O deslocamento em kallsyms_names[] é get_symbol_offset(k).

Observe que o uso de memória aumentará em (4 * kallsyms_num_syms) bytes, os próximos dois patches reduzirão (1 * kallsyms_num_syms) bytes e lidarão adequadamente com o caso CONFIG_LTO_CLANG=y. 
Resultados do teste de desempenho: (x86)

Antes:

min=234, max=10364402, media=5206926

min=267, max=11168517, media=5207587

Depois:

min=1016, max=90894, avg=7272

min=1014, max=93470, avg=7293

O desempenho médio de pesquisa de kallsyms_lookup_name() melhorou 715x

Esta é uma grande vitória para kallsyms_lookup_name e presente de Natal com o Kernel Linux 6.2.

O código dos módulos para o Kernel Linux 6.2 também contém uma pequena otimização de inicialização, diminuindo cerca de 30 ms do tempo de inicialização.






Fonte

Até a próxima !!

Nenhum comentário:

Postar um comentário