|Index|SUSE Telco Cloud Documentación|Configuración de las funciones Telco|Argumentos del núcleo de Linux para baja latencia y alto rendimiento.
Applies to SUSE Telco Cloud 3.6

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_cpus cuando 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_nocbs y irqaffinity. 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_irq al argumento del núcleo de Linux isolcpus. Sin ningún indicador, isolcpus equivale a especificar solo el indicador domain. Esto aísla las CPU especificadas de la programación, incluidas las tareas del núcleo de Linux. El indicador nohz detiene el tick del planificador en las CPU especificadas (si solo hay una tarea ejecutable en una CPU), y el indicador managed_irq evita 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      39

    Este 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=1 hace 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 nowatchdog para 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=0 deshabilita el watchdog NMI (Non-Maskable Interrupt). Esto puede omitirse cuando se utiliza nowatchdog.

  • 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_nocbs para 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_poll hace 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=1 suprime 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=1 acelera 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=1 Cuando 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=0 deshabilita el detector de bloqueo de tareas RCU, evitando posibles advertencias o detenciones del sistema por tareas RCU de larga duración.

    • rcutree.kthread_prio=99 establece 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=openstack para 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ón predictableNicNames en 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 configura intel_pstate para 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=1 por idle=poll. Para evitar las transiciones de estado C, se utiliza la opción idle=poll para desactivar dichas transiciones y mantener la CPU en el estado C más alto. La opción intel_idle.max_cstate=0 desactiva intel_idle, por lo que se utiliza acpi_idle, y acpi_idle.max_cstate=1 establece entonces el estado C máximo para acpi_idle. En arquitecturas AMD64/Intel 64, el primer estado C ACPI es siempre POLL, pero utiliza una función poll_idle(), que puede introducir una pequeña latencia al leer el reloj periódicamente y reiniciar el bucle principal en do_idle() tras un tiempo de espera (esto también implica borrar y establecer el indicador de tarea TIF_POLL). Por el contrario, idle=poll se 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=poll

Aquí 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