Linux prepara eBPF para crear programadores de tareas
Estamos a pocos días del lanzamiento de la versión estable de Linux 6.10, una versión que incluirá una serie de cambios bastante interesantes, asi como grandes mejoras en cuanto al soporte para dispositivos, funciones y más.
En su momento estaremos hablando sobre este lanzamiento, ya que la razón de este artículo es en referencia a la próxima versión que se espera de Linux que es la «Linux 6.11», un lanzamiento del cual se han dado a conocer algunos cambios que sí cuento con el tiempo suficiente, me encantaría poder abordarlos en otra publicación.
Bien, ahora pasando al punto del artículo, el cual es en referencia a un anuncio que realizo Linus Torvalds sobre su disposición para incluir en el kernel Linux 6.11, unos parches que implementan el mecanismo «sched_ext» (SCX).
Este mecanismo tiene como finalidad el utilizar eBPF para crear programadores de CPU dentro del kernel de Linux. Aquí hay un resumen de cómo funcionará:
- eBPF y Programadores de CPU: Con el uso de eBPF, los programadores de CPU pueden ser cargados dinámicamente y ejecutados dentro del kernel de Linux. La compilación Just-In-Time (JIT) traduce el código de bytes eBPF en instrucciones de máquina para su ejecución.
- Clase SCHED_EXT: esta es una nueva clase de programación, cuya prioridad de llamada del kernel se encuentra entre las clases SCHED_IDLE y SCHED_NORMAL. Los controladores BPF vinculados a SCHED_EXT pueden manejar tareas que tienen una prioridad inferior a la ejecución en tiempo real, sin afectar a las tareas ya adjuntas al programador normal SCHED_NORMAL.
- Funcionamiento: Los controladores BPF analizan colas de tareas en espera para ser ejecutadas en la CPU y seleccionan qué tarea asignar cuando se libera un núcleo de CPU. Si no hay controladores BPF activos en SCHED_EXT, las tareas se manejan utilizando el programador SCHED_NORMAL.
- Beneficios: El mecanismo sched_ext facilita la experimentación con diferentes técnicas y estrategias de programación de manera dinámica. Esto permite crear rápidamente prototipos funcionales de programadores y reemplazarlos sobre la marcha en entornos de producción. Por ejemplo, puede ajustarse para adaptarse a las características específicas de una aplicación y cambiar la estrategia de programación según el estado del sistema y otros factores.
Cabe mencionar que «sched_ext» se propuso inicialmente para la consideración de los desarrolladores del kernel en 2022, seguido de la publicación de seis revisiones del parche. A pesar de no estar soportado en el kernel principal, varias distribuciones como Ubuntu, Arch Linux, Fedora y NixOS ofrecen la instalación de «sched_ext» a través de paquetes adicionales. Canonical está considerando incluir componentes de «sched_ext» en Ubuntu 24.10, y Valve trabaja en su integración para el Steam Deck. En Meta, el programador basado en «sched_ext» ya se utiliza en infraestructura de producción.
Además de ello, se menciona que, actualmente, se están desarrollando aproximadamente una docena de programadores basados en «sched_ext», cada uno con lógica de programación de tareas definida en el espacio del usuario y cargada en el kernel mediante programas BPF.
- scx_layered: Un programador híbrido que divide las tareas en capas, cada una con su propia estrategia de programación. Permite asignar ciertas tareas a capas específicas con recursos de CPU garantizados o aumentar la prioridad de aplicaciones individuales. Desarrollado por Meta, su lógica en espacio de usuario está escrita en Rust.
- scx_rustland: Optimizado para priorizar tareas interactivas sobre las intensivas en CPU. Por ejemplo, mejora los FPS en el juego Terraria durante la compilación simultánea del kernel en comparación con el programador EEVDF estándar. Desarrollado por un empleado de Canonical, con lógica en Rust.
- scx_lavd: Implementa el algoritmo LAVD (Latency-criticality Aware Virtual Deadline), reduciendo la latencia en juegos de computadora y tareas interactivas al considerar la relevancia de reducir los retrasos y el progreso de los procesos. Desarrollado por Igalia y Valve, con lógica en Rust.
- scx_rusty, scx_rlfifo, scx_mitosis: Programadores que equilibran grupos de tareas según la carga, implementan un programador FIFO simple, y vinculan grupos de tareas a núcleos de CPU. Todos con componentes en Rust.
- scx_central, scx_flatcg, scx_nest, scx_pair, scx_qmap, scx_simple, scx_userland: Ejemplos de programadores con componentes en C, demostrando las diversas capacidades de «sched_ext».
Por último, cabe añadir que Google está experimentando con el uso de su propio marco, ghOSt, para influir en las decisiones del programador de tareas mediante programas BPF, y ha comenzado a migrar ghOSt a «sched_ext». Además, Google está desarrollando una adaptación de «sched_ext» para ChromeOS.
Fuente: https://lkml.org