Contáctenos

info@serverion.com

Explicación de PREEMPT_RT: Características del kernel en tiempo real

Explicación de PREEMPT_RT: Características del kernel en tiempo real

PREEMPT_RT transforma el kernel de Linux en un sistema operativo en tiempo real, garantizando la sincronización precisa de tareas críticas. Totalmente integrado en Linux 6.12 (publicado el 20 de septiembre de 2024), habilita capacidades en tiempo real para arquitecturas como x86, ARM64 y RISC-V. Esto es lo que necesita saber:

  • Características principales:
    • Reemplaza los spinlocks tradicionales con cerraduras inactivas preemptibles.
    • Convierte los controladores de interrupciones en subprocesos, haciéndolos programables y preemptibles.
    • Implementa la herencia de prioridad para abordar problemas de inversión de prioridad.
    • Hace que las operaciones RCU (Lectura-Copia-Actualización) sean totalmente preemptivas.
  • Aplicaciones:
    • Se utiliza en industrias como la automotriz, la robótica, las telecomunicaciones y los dispositivos médicos donde la sincronización precisa es fundamental.
    • Alimenta sistemas como herramientas de automatización industrial, controles de vuelo y entornos de alojamiento que requieren servidores privados virtuales de baja latencia.
  • Configuración:
    • Permitir CONFIG_PREEMPT_RT en la configuración del kernel.
    • Ajuste la configuración como CONFIG_NO_HZ_LLENA y CONFIG_RCU_BOOST para un rendimiento óptimo.
    • Utilice herramientas como prueba cíclica para medir la latencia y validar el rendimiento.

PREEMPT_RT prioriza la sincronización sobre el rendimiento, lo que hace que Linux sea ideal para aplicaciones donde los plazos son innegociables. Es un punto de inflexión para las industrias que exigen un rendimiento determinista.

Características principales de PREEMPT_RT: Cómo Linux logra un rendimiento en tiempo real

Características principales de PREEMPT_RT: Cómo Linux logra un rendimiento en tiempo real

Explicación de PREEMPT_RT: Cree y optimice el kernel de Linux para tiempo real y latencia ultrabaja

Características principales de PREEMPT_RT

PREEMPT_RT se centra en cuatro características principales diseñadas para reducir el código no preemptible y mejorar el control sobre la programación de tareas. A continuación, se detalla cada una.

Preempción completa del kernel

Una de las actualizaciones más importantes es la transformación de los spinlocks estándar (spinlock_t) y bloqueos de lectura y escritura (rwlock_t) en bloqueos de giro inactivos basados en mutex. Los bloqueos de giro tradicionales pueden causar retrasos porque deshabilitan la preempción, forzando a las tareas a esperar. PREEMPT_RT cambia esto al introducir bloqueos que permiten que las tareas se suspendan y sean preemptadas, incluso cuando retienen un recurso.

Esto significa que las tareas de alta prioridad pueden interrumpir las de menor prioridad, incluso si estas últimas mantienen bloqueos. Sin embargo, para ciertas operaciones críticas, como el programador o los puntos de entrada de hardware, PREEMPT_RT conserva bloqueo de giro crudo, que se comporta como los bloqueos no preemptibles originales. Como lo expresa Paul McKenney, un distinguido ingeniero:

""El punto clave del parche PREEMPT_RT es minimizar la cantidad de código del kernel que no se puede preemptizar, y al mismo tiempo minimizar la cantidad de código que se debe cambiar para proporcionar esta preemptibilidad adicional"."

A continuación, veamos cómo el manejo de interrupciones se beneficia de este enfoque.

Interrupciones enhebradas

PREEMPT_RT cambia la mayoría de los manejadores de interrupciones de hardware del contexto "IRQ duro" al contexto subprocesos del núcleo Ejecutándose en el contexto del proceso. Este ajuste permite priorizar, prever o incluso bloquear los controladores de interrupciones.

En un kernel estándar de Linux, un manejador de interrupciones de larga duración puede provocar una latencia ilimitada, ya que detiene todas las demás ejecuciones. Las interrupciones con subprocesos resuelven este problema. De forma predeterminada, estos subprocesos de interrupción se ejecutan con un PROGRAMACIÓN_FIFO prioridad de 50, pero los administradores pueden ajustar sus prioridades utilizando herramientas como chrt. Por ejemplo, se podría priorizar la interrupción de una tarjeta de red para el control industrial y reducir la prioridad de la E/S de disco. Dado que estos subprocesos utilizan bloqueos de giro latentes en lugar de bloqueos de giro sin procesar, evitan la necesidad de deshabilitar las interrupciones de hardware mientras se mantiene un bloqueo.

Ahora, exploremos cómo PREEMPT_RT maneja los desafíos relacionados con la prioridad.

Herencia de prioridad y Rtmutex

Inversión de prioridad es un problema importante donde una tarea de alta prioridad se queda atascada esperando un recurso retenido por una tarea de baja prioridad, mientras que una tarea de prioridad media (que no necesita el recurso) interrumpe a la de baja prioridad. PREEMPT_RT soluciona esto con herencia prioritaria, aumentando temporalmente la prioridad de la tarea de baja prioridad para que coincida con la tarea de mayor prioridad que espera el recurso.

El rtmutex Primitive es la herramienta que lo hace posible. Garantiza que, cuando surge un conflicto, la tarea de baja prioridad reciba un impulso de prioridad para finalizar su sección crítica sin interferencias de las tareas de prioridad media. Si la tarea impulsada se bloquea en otro bloqueo, el impulso de prioridad se transmite en cascada a lo largo de la cadena de dependencias. Como explica la documentación del kernel de Linux:

""La herencia de prioridad permite que las aplicaciones bien diseñadas utilicen bloqueos de espacio de usuario en partes críticas de un hilo de alta prioridad, sin perder el determinismo"."

Para lograr esto, rtmutex utiliza una bandera y un árbol ordenado por prioridad para administrar las tareas en espera, manteniendo baja la sobrecarga en las arquitecturas compatibles.

Por último, veamos cómo PREEMPT_RT mejora las operaciones de RCU.

RCU preemptible (lectura-copia-actualización)

Unidad de control remoto

Lectura-Copia-Actualización (RCU) es una técnica de sincronización ampliamente utilizada en el kernel de Linux. En los kernels estándar, las secciones de lectura de RCU no son preemptibles, lo que puede provocar retrasos impredecibles. PREEMPT_RT modifica esto al permitir que RCU lea las secciones. totalmente preemptible, garantizando que los plazos de las tareas en tiempo real no se vean comprometidos. Este ajuste es fundamental para lograr el comportamiento predecible requerido en los sistemas en tiempo real.

Cómo configurar y utilizar PREEMPT_RT

PREEMPT_RT está completamente integrado en los kernels principales de Linux, lo que significa que ya no son necesarios parches externos. Sin embargo, aplicar la cola de parches más reciente sigue siendo recomendable para una mejor compatibilidad con la arquitectura y gráficos mejorados. Una vez que el kernel esté listo, deberá ajustar su configuración para aprovechar al máximo sus capacidades.

Configuración del kernel

Para habilitar un kernel completamente preemptible, active CONFIG_PREEMPT_RT. En los kernels más nuevos, esta configuración se encuentra en "Configuración general", pero es posible que deba habilitarla. CONFIG_EXPERT Primero en hacerlo visible en el menú de configuración.

Para producción servidores dedicados y otros entornos de alto rendimiento, las opciones adicionales pueden optimizar aún más el rendimiento:

  • CONFIG_NO_HZ_LLENA:Reduce las interrupciones del reloj de programación en CPU ocupadas, lo que ayuda a minimizar la fluctuación.
  • CONFIG_RCU_BOOST:Evita que los lectores RCU preemptados retrasen los períodos de gracia.
  • CONFIG_RCU_NOCB_CPU:Descarga el manejo de devolución de llamadas de RCU a CPU específicas, lo que reduce la interferencia con tareas en tiempo real.

También es fundamental desactivar las opciones de depuración que pueden generar una alta latencia. Desactive configuraciones como CONFIG_DEBUG_LOCKDEP, CONFIG_DEBUG_PREEMPT, OBJETOS DE DEPURACIÓN DE CONFIGURACIÓN, y DEPURACIÓN DE CONFIG_SLUB. Si bien estas herramientas son útiles para el desarrollo, pueden afectar significativamente los objetivos de latencia. Como explica kernelconfig.io:

""Esta opción convierte el núcleo en un núcleo de tiempo real al reemplazar varias primitivas de bloqueo (spinlocks, rwlocks, etc.) con variantes preemptibles que tienen en cuenta la herencia de prioridad"."

Una vez que su kernel esté compilado e iniciado, confirme que PREEMPT_RT esté activo ejecutando gato /sys/kernel/tiempo real. Un valor de retorno de 1 Indica éxito. También puede verificarlo buscando "PREEMPT_RT" en la salida de uname -a.

Depuración y optimización del rendimiento

Ajustar el kernel es esencial para lograr un rendimiento óptimo con cargas de trabajo en tiempo real. Un aspecto clave a abordar es... mecanismo de limitación en tiempo real, que reserva 50 ms por segundo para tareas que no son en tiempo real de forma predeterminada. Si su carga de trabajo es puramente en tiempo real, puede desactivar este mecanismo escribiendo -1 a /proc/sys/kernel/sched_rt_runtime_us. Como señala Jan Altenberg, consultor sénior de código abierto en OSADL:

"Una tarea en tiempo real descontrolada puede dejar sin recursos al sistema. Como mecanismo de protección, se puede limitar el tiempo de ejecución de las tareas en tiempo real estableciendo un valor en microsegundos en /proc/sys/kernel/sched_rt_runtime_us.‘

Para un mayor determinismo, aísle núcleos de CPU específicos utilizando parámetros como isolcpus=2,3, rcu_nocbs=2,3, nohz_full=2,3, y establecer afinidad irq=0. Esto reserva esos núcleos exclusivamente para tareas en tiempo real.

Para administrar subprocesos de interrupción, utilice el chrt herramienta. Estos subprocesos normalmente se ejecutan con un valor predeterminado PROGRAMACIÓN_FIFO Prioridad 50, pero puede ajustarla para evitar conflictos con su aplicación. Por ejemplo, para establecer la prioridad del hilo IRQ de una tarjeta de red en 98, use el comando: chrt-p-f 98.

Después de completar la configuración, es fundamental probar y validar el rendimiento de la latencia. Herramientas como prueba cíclica puede medir la latencia (por ejemplo, prueba cíclica -S -m -p98 -i250), mientras rtla Análisis de Linux en tiempo real: ayuda a identificar y analizar picos de latencia. Estas herramientas garantizan que su configuración cumpla con las exigencias de las aplicaciones en tiempo real.

Aplicaciones y beneficios de PREEMPT_RT

Casos de uso de aplicaciones en tiempo real

PREEMPT_RT destaca en sistemas donde la precisión de tiempo es fundamental. aeroespacial, garantiza que los controles de navegación y vuelo funcionen sin retrasos de microsegundos, que de otro modo podrían poner en peligro la seguridad. Telecomunicaciones Las empresas cuentan con él para gestionar el enrutamiento de datos en tiempo real, garantizando llamadas de voz y vídeo fluidas al eliminar el jitter y los picos de latencia.

En el industria automotriz, Es una piedra angular para los sistemas de control de vehículos, y actores importantes como Continental Automotive apoyan su adopción. En automatización industrial, PREEMPT_RT impulsa controladores lógicos programables (PLC) y sistemas SCADA, y a menudo trabaja junto con protocolos como EtherCAT para mantener la seguridad y la eficiencia en las plantas de producción. Robótica También depende en gran medida de esta tecnología para un control preciso del actuador y una retroalimentación instantánea del sensor, lo que permite a los robots responder inmediatamente a los cambios ambientales.

Quizás las aplicaciones más críticas se encuentran en dispositivos médicos, Donde la precisión es primordial. Desde monitores de pacientes hasta robots quirúrgicos, PREEMPT_RT proporciona el rendimiento determinista necesario para garantizar el funcionamiento impecable de sistemas vitales.

Beneficios para los entornos de alojamiento

Las ventajas de PREEMPT_RT se extienden a los entornos de alojamiento, donde la capacidad de respuesta en tiempo real es igualmente crucial. Para Servidores VPS y dedicados, Minimiza la latencia al permitir que el programador priorice las tareas de alta prioridad sobre las menos críticas. Esto garantiza tiempos de respuesta consistentes, lo que impacta directamente en la experiencia del usuario y la confiabilidad del servicio.

El modelo de interrupción en subprocesos evita que las "tormentas de interrupciones" saturen los sistemas durante operaciones de E/S intensas. Con rt_mutex, La herencia de prioridades garantiza que las tareas en segundo plano de baja prioridad no bloqueen los servicios de alojamiento críticos. Los temporizadores de alta resolución permiten una precisión de programación de microsegundos, lo que reduce la inestabilidad en las configuraciones virtualizadas. Los proveedores de alojamiento, como Servion, Ofrecen compilaciones de kernel personalizadas con PREEMPT_RT, lo que brinda a los administradores la flexibilidad de ajustar las configuraciones para cargas de trabajo específicas. Mediante el uso de parámetros como isolcpus y afinidad con irqa, Los proveedores pueden dedicar núcleos de CPU a tareas de rendimiento crítico mientras mantienen aisladas las operaciones rutinarias del sistema.

Conclusión

Esta guía ha profundizado en cómo PREEMPT_RT Convierte Linux en un sistema operativo en tiempo real al otorgar al programador un control casi completo. Desde su inclusión en los núcleos principales a partir de Linux 6.12 (septiembre de 2024), ha eliminado la necesidad de parches externos en arquitecturas como x86, ARM64 y RISC-V.

El concepto es sencillo: reducir al máximo el código no preemptible. Al convertir los bloqueos de giro en bloqueos inactivos y ejecutar los manejadores de interrupciones como subprocesos, las tareas de alta prioridad pueden preemptar casi todas las actividades del núcleo. Características como la herencia de prioridades evitan que las tareas de baja prioridad retrasen las operaciones críticas, mientras que la RCU preemptible garantiza que incluso las secciones críticas del lado de lectura no causen retrasos significativos. Sebastián Siewior, el mantenedor de PREEMPT_RT, afirma acertadamente:

""Todo el control al programador.""

Este salto técnico ofrece beneficios prácticos. Por ejemplo, Servion utiliza compilaciones de kernel PREEMPT_RT personalizadas para ajustar el aislamiento de la CPU y optimizar las cargas de trabajo en tiempo real, lo que garantiza tiempos de respuesta estables incluso bajo una intensa presión de E/S.

Lo que distingue a los sistemas en tiempo real no es solo la velocidad, sino también la previsibilidad. PREEMPT_RT minimiza la fluctuación, garantizando que las tareas se ejecuten con precisión cuando se necesitan. Esto es crucial para aplicaciones como la automatización industrial, las telecomunicaciones y los servicios de alojamiento de alto rendimiento. Proporciona un comportamiento determinista que los kernels estándar simplemente no pueden proporcionar.

Con su integración en el núcleo principal y el respaldo de distribuciones empresariales como Ubuntu Pro (Desde febrero de 2023), PREEMPT_RT se ha vuelto más accesible para proveedores de hosting y administradores de sistemas. Ofrece el rendimiento confiable y de baja latencia necesario para los entornos actuales más exigentes y sensibles al tiempo.

Preguntas frecuentes

¿Necesito PREEMPT_RT o es suficiente con Linux estándar?

El núcleo estándar de Linux, cuando se combina con el Parche PREEMPT_RT, obtiene capacidades en tiempo real. Esto lo convierte en una excelente opción para aplicaciones donde la baja latencia y los tiempos de respuesta consistentes son cruciales. Sin embargo, por sí solo, el kernel principal de Linux podría no cumplir con las estrictas exigencias en tiempo real.

¿PREEMPT_RT reducirá el rendimiento general de mi sistema?

Para lograr un rendimiento en tiempo real, PREEMPT_RT Se centra en reducir el código kernel no preemptible, lo que ayuda a mejorar la capacidad de respuesta del sistema. Este enfoque puede conllevar una ligera disminución del rendimiento general, pero garantiza un comportamiento consistente y predecible, fundamental para aplicaciones con tiempos de respuesta limitados. Esta compensación es intencional y fundamental para satisfacer las demandas de los sistemas en tiempo real.

¿Qué objetivo de latencia es realista con PREEMPT_RT?

Con PREEMPT_RT, Lograr una latencia del orden de milisegundos es un objetivo realista tanto para sistemas de escritorio como para sistemas integrados. Sin embargo, el rendimiento real depende en gran medida de la configuración y el ajuste del sistema para cumplir con los requisitos específicos. Una configuración adecuada es clave para garantizar el nivel de respuesta deseado.

Entradas de blog relacionadas

es_ES