Linux 7.4 corta de 268 s para 50 ms uma etapa do boot
O kernel 7.4 recebeu duas otimizações de algoritmo: flush de workqueue até 100 vezes mais rápido em máquinas grandes e busca binária no memblock.

Em 22 de outubro, Linus Torvalds incorporou ao Linux 7.4 uma mudança de Tejun Heo que torna de 10 a 100 vezes mais rápido o flush de uma workqueue ociosa em máquinas grandes. Três dias depois entrou o pull request do memblock, com um patch de Tarun Sahu, engenheiro do Google, que reduziu de cerca de 268 segundos para cerca de 50 milissegundos uma etapa do boot após um kexec. O 7.4 ainda está na janela de merge aberta depois do lançamento do 7.3, em 18 de outubro.¹ ² ³ ⁴ ⁷
Nos dois casos, o kernel percorria uma estrutura inteira para achar o pouco que importava: todas as CPUs possíveis no flush, todas as regiões de memória a partir do índice 0 no memblock. Os ganhos medidos vêm de cenários extremos: uma máquina de 192 CPUs num caso, centenas de milhares de regiões de memória no outro.
O flush deixa de visitar filas que ninguém usou
Uma workqueue é a fila em que o kernel deixa trabalho para depois.⁸ Quem a usa chama flush_workqueue() para esperar que os itens já enfileirados terminem. Desde um commit de escalabilidade para workqueues unbound, cada flush percorria uma estrutura por CPU possível (a pool_workqueue, ou pwq) e travava o lock do pool de cada uma, até três vezes por flush. Yao Kai relatou que a workqueue CIL do XFS, ligada ao log e esvaziada a cada log force, gastava até 64 microsegundos por flush nesse passeio numa máquina de 128 CPUs.²
Pular as filas ociosas sem mais cuidado não funcionava. O avanço da "cor" de trabalho de cada pwq impede que um item enfileirado em paralelo receba uma cor já aposentada sem que o flush o veja, o que deixaria um flush posterior terminar antes dele. Heo trocou a varredura total por um registro das pwqs ativas: cada workqueue ganhou, por nó NUMA, um lock, um espelho da cor de trabalho e uma lista. Uma pwq fica na lista até uma visita encontrar a fila vazia.²
As medições do commit usaram uma máquina de 192 CPUs e 2 nós:²
| Cenário | Antes | Depois |
|---|---|---|
| Flush de workqueue per-cpu ociosa | 40 mil/s | 4,2 milhões/s |
| Flush de workqueue unbound ociosa | 450 mil/s | 4,3 milhões/s |
| 16 threads enfileirando e dando flush, per-cpu | 30 mil/s | 110 mil/s |
| 16 threads enfileirando e dando flush, unbound | 60 mil/s | 180 mil/s |
A faixa de "10 a 100 vezes" descreve o flush ocioso: a conta dá cerca de 105 vezes no caso per-cpu e cerca de 9,6 vezes no unbound. No teste com 16 threads enfileirando e dando flush, o ganho fica em 3 a 4 vezes. Quando toda pwq está ativa, o flush não muda nas workqueues per-cpu e fica de 15% a 20% mais lento nas unbound. O caminho de enfileirar não mudou.² O commit não traz medição de vazão do XFS de ponta a ponta, apenas o custo do flush.
O memblock começa a busca no ponto certo
O memblock cuida da memória física nos primeiros instantes do boot, antes de o gerenciador de páginas existir, e mantém um array ordenado de regiões. As funções memblock_add_range() e memblock_isolate_range() varriam esse array desde o índice 0 a cada inserção. Com poucas regiões o custo some. Com centenas de milhares de regiões separadas, o custo cresce com o quadrado do número delas.⁴
O caso do commit é o KHO, que preserva memória e o estado guardado nela entre um kernel e o seguinte num kexec.⁶ Ao registrar centenas de milhares de folios separados uns dos outros, o KHO levava cerca de 268 segundos para recuperar a memória de 393 mil páginas. Sahu fez as duas funções começarem num índice achado por busca binária, o que reduz a busca do candidato de O(N) para O(log N), e a mesma etapa caiu para cerca de 50 ms. O commit também refaz memblock_search(), que tinha uma busca binária própria, em cima do novo auxiliar.⁴
Uma segunda medição, em escala menor, aparece na revisão. Dongli Zhang mandou o log de boot de uma máquina de 32 CPUs com THP desligado, que usa páginas de 4 KB. Antes do patch, o intervalo entre a linha de inicialização da memória, em 0,23 s, e a do SLUB, em 38,6 s, mostrava uma pausa de cerca de 38 segundos. Com o patch, o SLUB aparece em 0,51 s.⁵ Zhang testou a primeira versão do patch, e o log é o relato de um participante da lista, não um benchmark controlado.
Dev Jain perguntou na lista se a busca binária prejudicaria o caso comum. Sahu respondeu que em listas com menos de cerca de cem elementos a busca linear aproveita bem o cache, mas que o código roda no boot e a diferença de nanossegundos não pesa.⁵ O patch foi revisado por Pratyush Yadav e entrou pela árvore de Mike Rapoport, mantenedor do memblock.³ ⁴
Quem sente a diferença
O flush mais rápido aparece em servidores com muitas CPUs e workqueues que levam flush com frequência, como o log do XFS. Num notebook de poucos núcleos, há menos CPUs para percorrer, e o ganho tende a ser menor. A busca binária no memblock interessa a quem usa KHO e kexec com muita memória fragmentada, e os 268 s vêm do cenário de fragmentação pesada descrito pelo autor.
As duas mudanças só chegam às distribuições estáveis depois do lançamento do 7.4 e da adoção do novo kernel por elas. Até lá, o código pode mudar ao longo dos candidatos a lançamento.
Fontes
- The 7.3 kernel has been released · LWN.net · https://lwn.net/Articles/1101143/ · 18 out. 2026
- workqueue: Make flush_workqueue() visit only pwqs active since the last flush · Tejun Heo · git.kernel.org · https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f1639cde5f5c1bee25498ef988227ee8cf5ddb04 · 1 set. 2026
Mostrar mais 6 fontesOcultar fontes
- Merge tag 'memblock-v7.4-rc1' · Linus Torvalds · git.kernel.org · https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=394023fbe34fccec5d4db2576169d21e14c8d3d4 · 25 out. 2026
- memblock: use binary search to locate candidate regions · Tarun Sahu · git.kernel.org · https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=7933ad3f669670ca5f5f13de2b5cb0f92b91abf5 · 8 out. 2026
- Re: [PATCH] memblock: use binary search to locate candidate regions · Dongli Zhang (3 set. 2026) e Tarun Sahu (4 set. 2026) · lista kexec · http://www.mail-archive.com/[email protected]/msg41726.html · http://www.mail-archive.com/[email protected]/msg41745.html
- Kexec Handover Subsystem · documentação do kernel Linux · https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/core-api/kho/index.rst · acesso em 26 out. 2026
- Merge tag 'wq-for-7.4' · Linus Torvalds · git.kernel.org · https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=031cb4ccf803f15b73e153d71024d75031bef5f3 · 22 out. 2026
- Workqueue · documentação do kernel Linux · https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/core-api/workqueue.rst · acesso em 26 out. 2026