Em 24 de outubro, foi noticiado que uma proposta de otimização do memblock havia sido enviada em um pull request para o Linux 7.4. O patch de Tarun Sahu troca varreduras lineares por busca binária em duas funções usadas no início da inicialização do sistema. Para uma carga específica do Kernel Handover (KHO), Sahu relatou que a recuperação de memória caiu de cerca de 268 segundos para 50 milissegundos.

O papel do memblock no início da inicialização

O memblock gerencia a memória física antes de o alocador completo de páginas do Linux entrar em ação. A proposta altera buscas por regiões candidatas em mm/memblock.c, durante essa etapa inicial.

Esse trabalho ocorre antes da execução normal de aplicativos. O resultado relatado para o KHO, portanto, mede uma operação específica de recuperação de memória, não a duração total da inicialização nem o desempenho de programas em uso comum.

Como a busca muda em duas funções do memblock

O patch propõe usar busca binária em memblock_add_range() e memblock_isolate_range(). Em vez de percorrer a lista desde o início, o algoritmo procura a primeira região cujo fim ultrapassa o endereço inicial da faixa candidata.

Segundo a descrição de Sahu, varreduras lineares repetidas podem chegar a uma complexidade O(N²) quando a memória está muito fragmentada. A busca proposta tem complexidade O(N log N) no pior caso e O(N) para acréscimos sequenciais. Sahu também observa que a busca linear pode ser eficiente em listas pequenas, enquanto a mudança mira listas grandes e fragmentadas.

O que mede o resultado relatado para o KHO

Proposta de busca binária no memblock é enviada para Linux 7.4

Na carga KHO descrita por Sahu, com cerca de 393 mil páginas, a recuperação de memória levou aproximadamente 268 segundos antes da mudança e 50 milissegundos depois, segundo o autor do patch.

Medição e cenárioAntes da mudançaDepois da mudança
Recuperação KHO, cerca de 393 mil páginasCerca de 268 segundosCerca de 50 milissegundos

Outro relato de carga e seus limites

Dongli Zhang relatou um teste separado em um sistema com 32 CPUs e um nó, com THP desativado e páginas de 4K. No log dessa carga, o intervalo entre os marcadores mem-auto-init e SLUB foi de 38,355755 segundos antes da aplicação do patch e de 0,264273 segundo depois. Zhang também disse que, em várias rodadas, deixou de notar as pausas e os atrasos anteriores em sua carga de trabalho.

Esses valores são intervalos entre dois marcadores do log daquele sistema. A observação de Zhang não mede isoladamente o tempo gasto pelo memblock nem a inicialização completa do computador.