Foi publicado um conjunto de patches que aceleram a construção do kernel Linux em 50-80%

Ingo Molnar, um conhecido desenvolvedor de kernel Linux e autor do agendador de tarefas CFS (Completely Fair Scheduler), propôs para discussão na lista de discussão de desenvolvedores de kernel Linux uma série de patches que afetam mais da metade de todos os arquivos nas fontes do kernel e fornecem um aumento na velocidade de uma reconstrução completa do kernel em 50-80% dependendo das configurações. A otimização implementada se destaca por estar associada ao acréscimo do maior conjunto de mudanças na história do desenvolvimento do kernel - 2297 patches foram propostos para inclusão de uma vez, alterando mais de 25 mil arquivos (10 mil arquivos de cabeçalho no “incluir /” e “arch/*/include/” e 15 mil arquivos com textos fonte).

O ganho de desempenho é obtido alterando o método de processamento dos arquivos de cabeçalho. Observa-se que ao longo de trinta anos de desenvolvimento do kernel, o estado dos arquivos de cabeçalho assumiu uma aparência deprimente devido à presença de um grande número de dependências cruzadas entre arquivos. A reestruturação do arquivo de cabeçalho levou mais de um ano e exigiu uma reformulação significativa da hierarquia e das dependências. Durante a reestruturação, foi feito um trabalho para separar definições de tipo e APIs para diferentes subsistemas de kernel.

Entre as mudanças feitas: separar arquivos de cabeçalho de alto nível entre si, eliminar funções inline que vinculam arquivos de cabeçalho, separar arquivos de cabeçalho por tipos e APIs, garantir montagem separada de arquivos de cabeçalho (cerca de 80 arquivos tinham dependências indiretas interferindo na montagem, expostas através outros arquivos de cabeçalho), adição automática de dependências a arquivos “.h” e “.c”, otimização passo a passo de arquivos de cabeçalho, uso do modo “CONFIG_KALLSYMS_FAST=y”, consolidação seletiva de arquivos C em blocos de montagem para reduza o número de arquivos de objeto.

Como resultado, o trabalho realizado permitiu reduzir o tamanho dos arquivos de cabeçalho processados ​​​​na fase de pós-pré-processamento em 1 a 2 ordens de grandeza. Por exemplo, antes da otimização, o uso do arquivo de cabeçalho “linux/gfp.h” resultou na adição de 13543 linhas de código e na inclusão de 303 arquivos de cabeçalho dependentes, e após a otimização o tamanho foi reduzido para 181 linhas e 26 arquivos dependentes. Ou outro exemplo: ao pré-processar o arquivo “kernel/pid.c” sem patch, são incluídas 94 mil linhas de código, a maior parte das quais não é utilizada no pid.c. A separação dos arquivos de cabeçalho permitiu reduzir em três vezes a quantidade de código processado, reduzindo o número de linhas processadas para 36 mil.

Quando o kernel foi completamente reconstruído com o comando “make -j96 vmlinux” em um sistema de teste, a aplicação de patches mostrou uma redução no tempo de construção do branch v5.16-rc7 de 231.34 para 129.97 segundos (de 15.5 para 27.7 compilações por hora) e também aumentou a eficiência do uso de núcleos de CPU durante montagens. Com uma compilação incremental, o efeito da otimização é ainda mais perceptível - o tempo para reconstruir o kernel após fazer alterações nos arquivos de cabeçalho diminuiu significativamente (de 112% para 173% dependendo do arquivo de cabeçalho que está sendo alterado). Atualmente, as otimizações estão disponíveis apenas para arquiteturas ARM64, MIPS, Sparc e x86 (32 e 64 bits).

Fonte: opennet.ru

Adicionar um comentário