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.
Até a próxima !!
Nenhum comentário:
Postar um comentário