Fast Kernel Headers, un conjunto de parches que aceleran la compilación del Kernel en un 50-80%
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.