35 Argumentos del núcleo de Linux para baja latencia y alto rendimiento. #
Configurar los argumentos adecuados del núcleo de Linux es esencial para optimizar el rendimiento, lograr una baja latencia y garantizar el despliegue exitoso del clúster para cargas de trabajo de telecomunicaciones. Aunque algunos parámetros están diseñados específicamente para permitir que el núcleo de Linux en tiempo real funcione de manera óptima, esta sección se aplica tanto a las configuraciones del núcleo en tiempo real como a las predeterminadas. Además, ciertos argumentos son obligatorios para que el método de aprovisionamiento de red dirigida despliegue correctamente los nodos de clúster en sentido descendente.
Elimine
kthread_cpuscuando utilice el núcleo de Linux en tiempo real de SUSE. Este parámetro controla en qué CPU se crean los hilos del núcleo de Linux. También controla qué CPU se permiten para el PID 1 y para cargar módulos del núcleo de Linux (el asistente de espacio de usuario kmod). Este parámetro no se reconoce y no tiene ningún efecto.Aísle los núcleos de CPU utilizando
isolcpus,nohz_full,rcu_nocbsyirqaffinity. Para obtener una lista completa de las técnicas de fijación de CPU, consulte el capítulo CPU Pinning on Host (Chapter 36, Fijación de CPU en el host).Añada los indicadores
domain,nohz,managed_irqal argumento del núcleo de Linuxisolcpus. Sin ningún indicador,isolcpusequivale a especificar solo el indicadordomain. Esto aísla las CPU especificadas de la programación, incluidas las tareas del núcleo de Linux. El indicadornohzdetiene el tick del planificador en las CPU especificadas (si solo hay una tarea ejecutable en una CPU), y el indicadormanaged_irqevita el enrutamiento de interrupciones externas (de dispositivo) gestionadas en las CPU especificadas. Tenga en cuenta que las líneas IRQ de los dispositivos NVMe están totalmente gestionadas por el núcleo de Linux y, como consecuencia, se enrutarán a los núcleos no aislados (de mantenimiento). Por ejemplo, la línea de comandos proporcionada al final de esta sección dará como resultado que solo se asignen cuatro colas (más una cola de administración/control) en el sistema:for I in $(grep nvme0 /proc/interrupts | cut -d ':' -f1); do cat /proc/irq/${I}/effective_affinity_list; done | column 39 0 19 20 39Este comportamiento evita cualquier interrupción causada por la E/S de disco en cualquier aplicación sensible al tiempo que se ejecute en los núcleos aislados, pero podría requerir atención y un diseño cuidadoso para las cargas de trabajo centradas en el almacenamiento.
Ajuste los ticks (interrupciones periódicas del temporizador del núcleo de Linux):
skew_tick=1: los ticks a veces pueden ocurrir simultáneamente. En lugar de que todas las CPU reciban su tick de temporizador en el mismo momento exacto,skew_tick=1hace que ocurran en momentos ligeramente desplazados. Esto ayuda a reducir la inestabilidad del sistema, lo que resulta en tiempos de respuesta de interrupción más consistentes y bajos (un requisito esencial para aplicaciones sensibles a la latencia).nohz=on: detiene el tick periódico del temporizador en las CPUs inactivas.nohz_full=<cpu-cores>: Detiene el tick periódico del temporizador en las CPUs especificadas que están dedicadas a aplicaciones en tiempo real.
Deshabilite la gestión de Machine Check Exception (MCE) especificando
mce=off. Las MCE son errores de hardware detectados por el procesador y deshabilitarlas puede evitar registros ruidosos.Añada
nowatchdogpara deshabilitar el watchdog de soft-lockup, que se implementa como un temporizador que se ejecuta en el contexto de interrupción de hardware del temporizador. Cuando expira (es decir, se detecta un bloqueo suave), imprimirá una advertencia (en el contexto de interrupción de hardware), ejecutando cualquier objetivo de latencia. Incluso si nunca expira, entra en la lista de temporizadores, aumentando ligeramente la sobrecarga de cada interrupción de temporizador. Esta opción también deshabilita el watchdog NMI, por lo que las NMI no pueden interferir.nmi_watchdog=0deshabilita el watchdog NMI (Non-Maskable Interrupt). Esto puede omitirse cuando se utilizanowatchdog.RCU (Read-Copy-Update) es un mecanismo del núcleo de Linux que permite el acceso concurrente y sin bloqueos para muchos lectores a datos compartidos. Una retrollamada RCU, una función activada tras un «período de gracia», garantiza que todos los lectores anteriores hayan terminado para que los datos antiguos puedan recuperarse de forma segura. Ajustamos RCU, especialmente para cargas de trabajo sensibles, para descargar estas retrollamadas de las CPU dedicadas (ancladas), evitando que las operaciones del núcleo de Linux interfieran con tareas críticas y sensibles al tiempo.
Especifique las CPU ancladas en
rcu_nocbspara que las retrollamadas RCU no se ejecuten en ellas. Esto ayuda a reducir el jitter y la latencia para las cargas de trabajo en tiempo real.rcu_nocb_pollhace que las CPUs sin retrollamadas «sondeen» regularmente para ver si se requiere la gestión de retrollamadas. Esto puede reducir la sobrecarga de interrupciones.rcupdate.rcu_cpu_stall_suppress=1suprime las advertencias de bloqueo de CPU RCU, que a veces pueden ser falsos positivos en sistemas en tiempo real con mucha carga.rcupdate.rcu_expedited=1acelera el período de gracia para las operaciones RCU, haciendo que las secciones críticas del lado de lectura sean más receptivas.rcupdate.rcu_normal_after_boot=1Cuando se utiliza con rcu_expedited, permite que RCU vuelva a la operación normal (no acelerada) después del arranque del sistema.rcupdate.rcu_task_stall_timeout=0deshabilita el detector de bloqueo de tareas RCU, evitando posibles advertencias o detenciones del sistema por tareas RCU de larga duración.rcutree.kthread_prio=99establece la prioridad del hilo del kernel de retrollamada RCU a la más alta posible (99), asegurando que se programe y gestione las retrollamadas RCU rápidamente, cuando sea necesario.
Añadid
ignition.platform.id=openstackpara que Metal3 y Cluster API puedan aprovisionar/desaprovisionar el clúster correctamente. Esto es utilizado por el agente Python de Metal3, que proviene de Openstack Ironic.Activad Denominación predecible de interfaces de red mediante
net.ifnames=1. A partir de SUSE Linux Micro 6.2, esto está activado por defecto y no se requiere una configuración explícita. Para versiones anteriores a la 6.2, esto debe establecerse explícitamente como un argumento del kernel. Esto se alinea con la configuraciónpredictableNicNamesen el gráfico de Helm de Metal3 del clúster de gestión, que es necesaria para que el aprovisionamiento de red dirigida funcione correctamente. La denominación coherente de las interfaces también es fundamental cuando se utiliza SR-IOV.Eliminad
intel_pstate=passive. Esta opción configuraintel_pstatepara que funcione con gobernadores cpufreq genéricos, pero para que esto funcione, desactiva como efecto secundario los estados P gestionados por hardware (HWP). Para reducir la latencia del hardware, no se recomienda esta opción para cargas de trabajo en tiempo real.Sustituya
intel_idle.max_cstate=0 processor.max_cstate=1poridle=poll. Para evitar las transiciones de estado C, se utiliza la opciónidle=pollpara desactivar dichas transiciones y mantener la CPU en el estado C más alto. La opciónintel_idle.max_cstate=0desactivaintel_idle, por lo que se utilizaacpi_idle, yacpi_idle.max_cstate=1establece entonces el estado C máximo para acpi_idle. En arquitecturas AMD64/Intel 64, el primer estado C ACPI es siemprePOLL, pero utiliza una funciónpoll_idle(), que puede introducir una pequeña latencia al leer el reloj periódicamente y reiniciar el bucle principal endo_idle()tras un tiempo de espera (esto también implica borrar y establecer el indicador de tareaTIF_POLL). Por el contrario,idle=pollse ejecuta en un bucle continuo, en espera activa de que se reprograme una tarea. Esto minimiza la latencia de salida del estado de inactividad, pero a costa de mantener la CPU funcionando a máxima velocidad en el hilo de inactividad.Desactivad C1E en la BIOS. Esta opción es importante para desactivar el estado C1E en la BIOS y evitar que la CPU entre en el estado C1E cuando está inactiva. El estado C1E es un estado de bajo consumo que puede introducir latencia cuando la CPU está inactiva.
El resto de esta documentación cubre parámetros adicionales, incluyendo páginas enormes (huge pages) e IOMMU.
Esto proporciona un ejemplo de argumentos del kernel para un servidor Intel de 32 núcleos, incluyendo los ajustes mencionados anteriormente:
$ cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-6.4.0-9-rt root=UUID=77b713de-5cc7-4d4c-8fc6-f5eca0a43cf9 skew_tick=1 rd.timeout=60 rd.retry=45 console=ttyS1,115200 console=tty0 default_hugepagesz=1G hugepagesz=1G hugepages=40 hugepagesz=2M hugepages=0 ignition.platform.id=openstack net.ifnames=1 intel_iommu=on iommu=pt irqaffinity=0,31,32,63 isolcpus=domain,nohz,managed_irq,1-30,33-62 nohz_full=1-30,33-62 nohz=on mce=off nosoftlockup nowatchdog nmi_watchdog=0 quiet rcu_nocb_poll rcu_nocbs=1-30,33-62 rcupdate.rcu_cpu_stall_suppress=1 rcupdate.rcu_expedited=1 rcupdate.rcu_normal_after_boot=1 rcupdate.rcu_task_stall_timeout=0 rcutree.kthread_prio=99 security=selinux selinux=1 idle=pollAquí tenéis otro ejemplo de configuración para un servidor AMD de 64 núcleos. De los 128 procesadores lógicos (0-127), los primeros 8 núcleos (0-7) se designan para tareas de mantenimiento, mientras que los 120 núcleos restantes (8-127) se fijan para las aplicaciones:
$ cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-6.4.0-9-rt root=UUID=575291cf-74e8-42cf-8f2c-408a20dc00b8 skew_tick=1 console=ttyS1,115200 console=tty0 default_hugepagesz=1G hugepagesz=1G hugepages=40 hugepagesz=2M hugepages=0 ignition.platform.id=openstack net.ifnames=1 amd_iommu=on iommu=pt irqaffinity=0-7 isolcpus=domain,nohz,managed_irq,8-127 nohz_full=8-127 rcu_nocbs=8-127 mce=off nohz=on nowatchdog nmi_watchdog=0 nosoftlockup quiet rcu_nocb_poll rcupdate.rcu_cpu_stall_suppress=1 rcupdate.rcu_expedited=1 rcupdate.rcu_normal_after_boot=1 rcupdate.rcu_task_stall_timeout=0 rcutree.kthread_prio=99 security=selinux selinux=1 idle=poll