Ingo Morna ( Por Ingo Molnar Sí ), un conocido desarrollador de kernel de Linux, autor de CFS Task Scheduler (Completely Fair Scheduler), sugirió Una serie de parches utilizados para discutir la lista de correo de desarrollo del kernel de Linux, que afectan a más de la mitad de todos los archivos en el código fuente del kernel y aumentan la velocidad total de reconstrucción del kernel en un 50-80% según la configuración. La optimización implementada es muy significativa porque está relacionada con el mayor conjunto de cambios en la historia del desarrollo del kernel: se propusieron 2297 parches a la vez y se cambiaron más de 25,000 archivos (10,000 archivos de encabezado en el directorio) incluyen / «y» arch / * / include / «y 15.000 archivos fuente).
La mejora del rendimiento se logra cambiando el método de procesamiento de los archivos de encabezado. Vale la pena señalar que después de más de 30 años de desarrollo del kernel, el estado de los archivos de encabezado ha mostrado un estado frustrante debido a la existencia de una gran cantidad de dependencias cruzadas entre archivos. La reorganización del archivo de encabezado tomó más de un año y requirió un rediseño importante de la jerarquía y las dependencias. Durante la reorganización, se completó el trabajo de separar las definiciones de tipo y las API de los diferentes subsistemas del kernel.
Los cambios realizados incluyen: separar los archivos de encabezado avanzados entre sí, excluir las funciones en línea que enlazan archivos de encabezado, asignar archivos de encabezado a tipos y API, y proporcionar ensamblajes de archivos de encabezado separados (alrededor de 80 archivos tienen dependencias indirectas) que interferirán Ensamblar, expuestos a través de otros archivos de encabezado), agregue automáticamente dependencias a los archivos «.h» y «.c», optimice gradualmente los archivos de encabezado, use el modo «CONFIG_KALLSYMS_FAST = y» y combine selectivamente archivos C en bloques de ensamblaje para reducir el número de archivos de destino.
Por lo tanto, el trabajo realizado puede reducir el tamaño del archivo de encabezado procesado en la etapa de preprocesamiento en 1-2 órdenes de magnitud. Por ejemplo, utilizando el archivo de encabezado «linux / gfp.h» antes de la optimización, se agregaron 13543 líneas de código, incluidos 303 archivos de encabezado dependientes, y el tamaño se redujo a 181 líneas y 26 archivos dependientes después de la optimización. Otro ejemplo: cuando se preprocesó el archivo «kernel / pid.c» sin parchear, se conectaron 94.000 líneas de código, la mayoría de las cuales no se utilizaron en pid.c. Dividir el archivo de encabezado nos permite reducir la cantidad de código procesado en un factor de tres, reduciendo el número de líneas procesadas a 36,000 líneas.
Al usar el comando «make -j96 vmlinux» en el sistema de prueba para reconstruir completamente el kernel, la aplicación del parche mostró que el tiempo de compilación de la rama v5.16-rc7 se redujo de 231.34 segundos a 129.97 segundos (de 15.5 a 27.7 compilaciones por hora), y también mejora la eficiencia del uso de núcleos de CPU en el proceso de ensamblaje. Con la compilación incremental, el efecto de optimización es más obvio: el tiempo para reconstruir el kernel después de cambiar el archivo de encabezado se reduce significativamente (de 112% a 173%, dependiendo del archivo de encabezado que se cambie). Actualmente, la optimización solo se aplica a las arquitecturas ARM64, MIPS, Sparc y x86 (32 y 64 bits).