Linus Torvalds ha expresado su disposición para incluir en el núcleo Linux 6.11, cuya liberación se espera a finales de septiembre, parches que implementan el mecanismo "sched_ext" (SCX), que permite usar eBPF para crear planificadores de CPU que abarcan prácticamente todos los aspectos de la planificación de la ejecución de tareas y la distribución de recursos de CPU. Tales planificadores pueden ser cargados dinámicamente y ejecutados dentro del núcleo de Linux en una máquina virtual eBPF, en la que, gracias a la aplicación de la compilación JIT, el bytecode se traduce en instrucciones de máquina y se ejecuta con el rendimiento del código compilado.
Los parches propuestos implementan una nueva clase de planificación SCHED_EXT, para la cual se define la prioridad de llamada por el núcleo entre las clases SCHED_IDLE y SCHED_NORMAL, lo que impide que los manejadores BPF vinculados a SCHED_EXT afecten a las tareas ya asignadas al planificador de tareas estándar (SCHED_NORMAL), pero permite la vinculación de tareas individuales a SCHED_EXT o el traslado para el procesamiento de todos los procesos que tienen una prioridad inferior a la ejecución en tiempo real. Si no hay manejadores BPF vinculados a SCHED_EXT, todos los procesos trasladados a la clase SCHED_EXT serán procesados mediante el planificador SCHED_NORMAL. La operación de los manejadores BPF se centra en el análisis de las colas de tareas en espera de ejecución en la CPU (una cola global y una cola por cada núcleo de CPU), y la selección de la tarea que debe recibir recursos de CPU al liberar un núcleo de CPU.
El mecanismo sched_ext simplifica la creación de planificadores específicos para ciertas tareas, permite experimentar con varias técnicas y estrategias de planificación, así como crear rápidamente prototipos funcionales y reemplazar planificadores sobre la marcha en infraestructuras de trabajo. Por ejemplo, con sched_ext se puede crear un planificador que tenga en cuenta la especificidad de una aplicación determinada y cambie dinámicamente su estrategia de planificación en función del estado del sistema y otros factores adicionales.
En la actualidad, ya se están desarrollando alrededor de diez planificadores basados en sched_ext, cuya lógica de planificación de tareas se define en el espacio de usuario y se carga en el núcleo en forma de programas BPF:
- scx_layered — un planificador híbrido de tareas que divide las tareas en capas, cada una de las cuales aplica su propia estrategia de planificación. Por ejemplo, scx_layered permite destacar en una capa separada algunas tareas para las que se proporcionarán ciertos recursos garantizados de CPU, o elevar la prioridad de aplicaciones específicas. El planificador es desarrollado por la empresa Meta. La lógica de generación de BPF en el espacio del usuario está escrita en el lenguaje Rust.
- scx_rustland — un planificador optimizado para elevar la prioridad de tareas interactivas en comparación con tareas que demandan intensivamente CPU. Por ejemplo, en la prueba de lanzamiento del juego Terraria simultáneamente con la compilación del núcleo, el planificador scx_rustland permitió lograr un FPS más alto en el juego que al utilizar el planificador predeterminado EEVDF. El proyecto es desarrollado por un empleado de Canonical. La lógica de generación de BPF en el espacio del usuario está escrita en el lenguaje Rust.
- scx_lavd — una implementación del algoritmo de planificación de tareas LAVD (Latency-criticality Aware Virtual Deadline), que considera la relevancia de reducir las latencias para tareas específicas y utiliza información sobre el progreso de los procesos al tomar decisiones sobre la distribución de recursos de CPU. El planificador es desarrollado por las empresas Igalia y Valve para reducir las latencias en videojuegos y tareas interactivas. La lógica de generación de BPF en el espacio del usuario está escrita en el lenguaje Rust.
- scx_rusty, scx_rlfifo, scx_mitosis — ejemplos de planificadores con componentes en el espacio del usuario en el lenguaje Rust, que implementan un balanceo entre grupos de tareas en función de la carga, el planificador FIFO más simple y un planificador para asignar grupos de tareas a núcleos de CPU.
- scx_central, scx_flatcg, scx_nest, scx_pair, scx_qmap, scx_simple, scx_userland — ejemplos de planificadores con componentes en el espacio del usuario en el lenguaje C, que ilustran diversas funcionalidades de sched-ext.
Originalmente, el mecanismo sched_ext fue propuesto para revisión por los desarrolladores del núcleo en 2022, tras lo cual se publicaron seis revisiones del parche. A pesar de la falta de soporte en el núcleo principal, se ofrece la posibilidad de instalar sched_ext a través de paquetes adicionales en distribuciones como Ubuntu, Arch Linux, Fedora y NixOS. Canonical está considerando incluir componentes de sched-ext en Ubuntu 24.10, mientras que Valve trabaja en la integración de sched_ext en Steam Deck. En Meta, el programador basado en sched_ext ya se utiliza en la infraestructura laboral.
Google está experimentando con el uso de su propio marco ghOSt, que permite influir en las decisiones del programador de tareas mediante programas BPF. Actualmente, se ha iniciado el trabajo de portación de ghOSt a sched_ext. Google también está desarrollando un puerto de sched_ext para ChromeOS con la intención de utilizarlo para activar el programador híbrido scx_layered a fin de reducir la latencia sin recurrir a extensiones para trabajar en tiempo real. Oculus está desarrollando un puerto de sched_ext para Android.
Fuente: opennet.ru
