Ingo Molnar, un reconocido promotor inmobiliario Linux El desarrollador del kernel y el autor del planificador de tareas CFS (Completely Fair Scheduler) lo propusieron para su discusión en la lista de correo de desarrolladores del kernel. Linux Una serie de parches que afectan a más de la mitad de los archivos del código fuente del kernel y que proporcionan un aumento del 50 al 80 % en la velocidad de reconstrucción completa del kernel, según la configuración. Esta optimización es notable porque incluye el mayor conjunto de cambios en la historia del desarrollo del kernel: 2297 parches propuestos para su inclusión a la vez, que modifican más de 25 000 archivos (10 000 archivos de cabecera en los directorios "include/" y "arch/*/include/" y 15 000 archivos de código fuente).
La ganancia de rendimiento se logra cambiando el método de procesamiento de archivos de encabezado. Cabe señalar que a lo largo de treinta años de desarrollo del kernel, el estado de los archivos de encabezado ha adquirido un aspecto deprimente debido a la presencia de una gran cantidad de dependencias cruzadas entre archivos. La reestructuración del archivo de encabezado tomó más de un año y requirió una reelaboración significativa de la jerarquía y las dependencias. Durante la reestructuración, se trabajó para separar las definiciones de tipos y las API para diferentes subsistemas del kernel.
Entre los cambios realizados: separar los archivos de encabezado de alto nivel entre sí, eliminar las funciones en línea que vinculan los archivos de encabezado, separar los archivos de encabezado por tipos y API, garantizar el ensamblaje por separado de los archivos de encabezado (alrededor de 80 archivos tenían dependencias indirectas que interferían con el ensamblaje, expuestos a través de otros archivos de encabezado), adición automática de dependencias a archivos “.h” y “.c”, optimización paso a paso de 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 objeto.
Como resultado, el trabajo realizado permitió reducir el tamaño de los archivos de encabezado procesados en la etapa de posprocesamiento en 1-2 órdenes de magnitud. Por ejemplo, antes de la optimización, el uso del archivo de encabezado “linux/gfp.h” daba 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. U otro ejemplo: al preprocesar el archivo “kernel/pid.c” sin parche, se incluyen 94 mil líneas de código, la mayoría de las cuales no se utilizan en pid.c. La separación de los archivos de encabezado hizo posible reducir tres veces la cantidad de código procesado, reduciendo el número de líneas procesadas a 36 mil.
Cuando el kernel fue completamente reconstruido con el comando “make -j96 vmlinux” en un sistema de prueba, la aplicación de 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 los ensamblajes. Con una compilación incremental, el efecto de la optimización es aún más notable: el tiempo para reconstruir el kernel después de realizar cambios en los archivos de encabezado ha disminuido 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).
Fuente: opennet.ru
