Red Hat Training
A Red Hat training course is available for RHEL 8
20.3. Ajuste de la política de programación
En Red Hat Enterprise Linux, la unidad más pequeña de ejecución de procesos se llama hilo. El programador del sistema determina qué procesador ejecuta un hilo y durante cuánto tiempo lo hace. Sin embargo, debido a que la principal preocupación del programador es mantener el sistema ocupado, puede que no programe los hilos de forma óptima para el rendimiento de la aplicación.
Por ejemplo, digamos que una aplicación en un sistema NUMA se está ejecutando en el Nodo A cuando un procesador en el Nodo B está disponible. Para mantener el procesador en el Nodo B ocupado, el programador mueve uno de los hilos de la aplicación al Nodo B. Sin embargo, el hilo de la aplicación sigue necesitando acceso a la memoria en el Nodo A. Pero, esta memoria tardará más en ser accedida porque el hilo se está ejecutando ahora en el Nodo B y la memoria del Nodo A ya no es local para el hilo. Por lo tanto, el hilo puede tardar más en terminar de ejecutarse en el Nodo B de lo que habría tardado en esperar a que un procesador en el Nodo A estuviera disponible, y luego ejecutar el hilo en el nodo original con acceso a la memoria local.
Las aplicaciones sensibles al rendimiento a menudo se benefician de que el diseñador o administrador determine dónde se ejecutan los hilos. El planificador de Linux implementa una serie de políticas de programación que determinan dónde y durante cuánto tiempo se ejecuta un hilo. Las siguientes son las dos categorías principales de políticas de programación:
- Políticas normales: Los hilos normales se utilizan para tareas de prioridad normal.
- Políticas en tiempo real: Las políticas de tiempo real se utilizan para tareas sensibles al tiempo que deben completarse sin interrupciones. Los subprocesos en tiempo real no están sujetos a cortes de tiempo. Esto significa que el hilo se ejecuta hasta que se bloquea, sale, cede voluntariamente o es adelantado por un hilo de mayor prioridad. El hilo en tiempo real de menor prioridad se programa antes que cualquier hilo con una política normal. Para más información, consulte Sección 20.3.1, “Programación de la prioridad estática con SCHED_FIFO” y Sección 20.3.2, “Programación prioritaria por turnos con SCHED_RR”.
20.3.1. Programación de la prioridad estática con SCHED_FIFO
La SCHED_FIFO
, también llamada programación de prioridad estática, es una política en tiempo real que define una prioridad fija para cada hilo. Esta política permite a los administradores mejorar el tiempo de respuesta de los eventos y reducir la latencia. Se recomienda no ejecutar esta política durante un periodo de tiempo prolongado para tareas sensibles al tiempo.
Cuando SCHED_FIFO
está en uso, el programador escanea la lista de todos los hilos de SCHED_FIFO
en orden de prioridad y programa el hilo de mayor prioridad que esté listo para ejecutarse. El nivel de prioridad de un subproceso de SCHED_FIFO
puede ser cualquier número entero entre 1 y 99, donde 99 se trata como la prioridad más alta. Red Hat recomienda comenzar con un número más bajo y aumentar la prioridad sólo cuando identifique problemas de latencia.
Debido a que los hilos en tiempo real no están sujetos a la división del tiempo, Red Hat no recomienda establecer una prioridad como 99. Esto mantiene su proceso en el mismo nivel de prioridad que los hilos de migración y de vigilancia; si su hilo entra en un bucle de cálculo y estos hilos se bloquean, no podrán ejecutarse. Los sistemas con un solo procesador acabarán colgándose en esta situación.
Los administradores pueden limitar el ancho de banda de SCHED_FIFO
para evitar que los programadores de aplicaciones en tiempo real inicien tareas en tiempo real que acaparen el procesador.
Los siguientes son algunos de los parámetros utilizados en esta política:
/proc/sys/kernel/sched_rt_period_us
-
Este parámetro define el periodo de tiempo, en microsegundos, que se considera el cien por cien del ancho de banda del procesador. El valor por defecto es
1000000 μs
, o1 second
. /proc/sys/kernel/sched_rt_runtime_us
-
Este parámetro define el periodo de tiempo, en microsegundos, que se dedica a ejecutar hilos en tiempo real. El valor por defecto es
950000 μs
, o0.95 seconds
.