Ingo Molnar, un conocido desarrollador del kernel de Linux y autor de CFS Task Scheduler propuso para la discusión de la lista de correo de desarrollo del kernel de Linux una serie de parches, que afectan a mÔs de la mitad de todos los archivos en la fuente del kernel y proporciona un aumento en la velocidad total de reconstrucción del núcleo de 50-80% dependiendo de la configuración.
La optimización implementada es notable porque estÔ asociada con la adición del mayor conjunto de cambios en la historia del desarrollo del kernel: se propusieron incluir 2297 parches a la vez, cambiando mÔs de 25 mil archivos.
La ganancia de rendimiento se logra cambiando el mƩtodo de manejo de archivos de encabezado. Cabe seƱalar que durante treinta aƱos de desarrollo del kernel, el estado de los archivos de encabezado ha adquirido una forma deprimente debido a la presencia de una gran cantidad de dependencias cruzadas entre archivos.
La reestructuración de los archivos de encabezado tomó mĆ”s de un aƱo y requirió un rediseƱo significativo de la jerarquĆa y las dependencias. Durante la reestructuración, se trabajó para separar las definiciones de tipo y las API para los diferentes subsistemas del kernel.
Me complace anunciar la primera versión pĆŗblica de mi nuevo proyecto Ā«Fast Kernel HeadersĀ» en el que he estado trabajando desde finales de 2020, que es una reelaboración integral de la jerarquĆa de encabezados y las dependencias de encabezados del kernel de Linux , con el doble objetivo de :
ā acelerar la construcción del kernel (ambos tiempos absolutos e incrementales de construcción)
ā desacoplamiento de tipo del subsistema y la API de definiciones entre sĆ
Como la mayorĆa de los desarrolladores del kernel saben, hay alrededor de ~10,000 encabezados .h principales en el kernel de Linux, en las jerarquĆas include / y arch/*/include/. En los Ćŗltimos mĆ”s de 30 aƱos, se han convertido en un conjunto complicado y doloroso de dependencias cruzadas que llamamos cariƱosamente āInfierno de la dependenciaā.
Entre los cambios realizados se encuentran: separación de archivos de encabezado de alto nivel entre sĆ, exclusión de funciones en lĆnea que vinculan archivos de encabezado, asignación de archivos de encabezado para tipos y API, provisión de un conjunto separado de archivos de encabezado (alrededor de 80 archivos tenĆan dependencias indirectas que interfieren con el ensamblaje, expuestos a travĆ©s de otros archivos de encabezado), adición automĆ”tica de dependencias a los archivos Ā«.hĀ» y Ā«.cĀ», optimización paso a paso de los archivos de encabezado, uso del modoĀ»CONFIG_KALLSYMS_FAST=yĀ», consolidación selectiva de archivos C en bloques de ensamblaje para reducir el nĆŗmero de archivos de objetos.
Como resultado, el trabajo realizado permitió reducir el tamaƱo de los archivos de encabezado procesados āāen la etapa posterior al preprocesamiento en 1-2 órdenes de magnitud.
- Por ejemplo, antes de la optimización, el uso del archivo de encabezado Ā«linux/gfp.hĀ» dio como resultado la adición de 13543 lĆneas de código y la inclusión de 303 archivos de encabezado dependientes y despuĆ©s de la optimización, el tamaƱo se redujo a 181 lĆneas y 26 archivos dependientes.
- Otro ejemplo: al preprocesar el archivo Ā«kernel/pid.cĀ» sin parche, se conectan 94 mil lĆneas de código, la mayorĆa de las cuales no se utilizan en pid.c. Dividir los archivos de encabezado nos permitió reducir la cantidad de código procesado tres veces, reduciendo el nĆŗmero de lĆneas procesadas a 36 mil.
Cuando el núcleo se reconstruyó por completo con el comando «make -j96 vmlinux» en el sistema de prueba, la aplicación de los parches mostró una reducción en el tiempo de compilación de la rama v5.16-rc7 de 231,34 a 129,97 segundos (de 15,5 a 27,7 compilaciones por hora) y también aumentó la eficiencia del uso de núcleos de CPU durante la compilacion.
Con una compilación incremental, el efecto de optimización es aún mÔs notable: el tiempo para reconstruir el núcleo después de realizar cambios en los archivos de encabezado se ha reducido significativamente (del 112 % al 173 %, dependiendo del archivo de encabezado que se cambie).
Actualmente, las optimizaciones solo estƔn disponibles para arquitecturas ARM64, MIPS, Sparc y x86 (32 y 64 bits).
Finamente si estƔs interesado en poder conocer mƔs al respecto, puedes consultar los detalles en el siguiente enlace.