36 Fijación de CPU en el host #
La fijación de CPU, también conocida como afinidad de procesador, es la técnica de vincular un proceso o hilo a un núcleo de CPU específico, evitando que el planificador del sistema operativo lo mueva. Al asegurar que un proceso siempre se ejecute en el mismo núcleo, se beneficia de un acceso más rápido a los datos que permanecen en la memoria caché de ese núcleo. Esta práctica es común en entornos de informática de alto rendimiento porque mejora drásticamente el rendimiento y reduce la sobrecarga.
36.1 Aislamiento de CPU mediante TuneD #
tuned es una herramienta de ajuste del sistema que supervisa las condiciones del sistema para optimizar el rendimiento utilizando varios perfiles predefinidos. Una característica clave es su capacidad para aislar núcleos de CPU para cargas de trabajo específicas, como aplicaciones en tiempo real. Esto evita que el sistema operativo utilice estos núcleos y aumente potencialmente la latencia.
Para habilitar y configurar esta función, lo primero es crear un perfil para los núcleos de CPU que queremos aislar. En este ejemplo, de entre 64 núcleos, dedicamos 60 núcleos (1-30,33-62) a las aplicaciones y los 4 núcleos restantes se utilizan para tareas de mantenimiento. Tened en cuenta que el diseño de las CPU aisladas depende en gran medida de las aplicaciones en tiempo real.
$ echo "export tuned_params" >> /etc/grub.d/00_tuned
$ echo "isolated_cores=1-30,33-62" >> /etc/tuned/cpu-partitioning-variables.conf
$ tuned-adm profile cpu-partitioning
Tuned (re)started, changes applied.36.2 Aislamiento de CPU mediante argumentos del kernel #
A continuación, debemos modificar la opción de GRUB para aislar los núcleos de CPU y otros parámetros importantes para el uso de la CPU. Las siguientes opciones son importantes para personalizarlas con vuestras especificaciones de hardware actuales:
| parameter | valor | description |
|---|---|---|
isolcpus | domain,nohz,managed_irq,1-30,33-62 | Aislad los núcleos 1-30 y 33-62. |
skew_tick | 1 | Esta opción permite al kernel sesgar las interrupciones del temporizador a través de las CPU aisladas. |
nohz | on | Cuando está habilitado, la interrupción periódica del temporizador del kernel (el 'tick') se detendrá en cualquier núcleo de CPU que esté inactivo. Esto beneficia principalmente a las CPU de mantenimiento ( |
nohz_full | 1-30,33-62 | Para los núcleos aislados, esto detiene el tick y lo hace incluso cuando la CPU está ejecutando una única tarea activa. Significa que hace que la CPU funcione en modo sin tick completo (o 'dyntick'). El kernel solo enviará interrupciones de temporizador cuando sean realmente necesarias. |
rcu_nocbs | 1-30,33-62 | Esta opción descarga el procesamiento de retrollamadas RCU de núcleos de CPU especificados. |
rcu_nocb_poll | Cuando esta opción está establecida, las CPU sin retrollamadas RCU realizarán un sondeo periódico para ver si se requiere el manejo de retrollamadas, en lugar de ser despertadas explícitamente por otras CPU. Esto puede reducir la sobrecarga de interrupciones. | |
irqaffinity | 0,31,32,63 | Esta opción permite al kernel ejecutar las interrupciones en los núcleos de mantenimiento. |
inactivo | poll | 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. |
nmi_watchdog | 0 | Esta opción deshabilita solo el watchdog NMI. Esto puede omitirse cuando |
nowatchdog | Esta opción deshabilita el watchdog de soft-lockup, que se implementa como un temporizador que se ejecuta en el contexto de interrupción de hardware del temporizador. |
Los siguientes comandos modifican la configuración de GRUB y aplican los cambios mencionados anteriormente para que estén presentes en el próximo arranque:
Editad el archivo /etc/default/grub con los parámetros anteriores y el archivo quedará así:
GRUB_CMDLINE_LINUX="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"Actualizad la configuración de GRUB:
$ transactional-update grub.cfg
$ rebootPara validar que los parámetros se aplican después del reinicio, se puede utilizar el siguiente comando para comprobar la línea de comandos del kernel:
$ cat /proc/cmdlineExiste otro script que se puede utilizar para ajustar la configuración de la CPU, que básicamente realiza los siguientes pasos:
Estableced el gobernador de CPU en
performance.Desactivad la migración del temporizador a las CPU aisladas.
Migrad los hilos kdaemon a las CPU de mantenimiento.
Ajustad la latencia de las CPU aisladas al valor más bajo posible.
Retrasad las actualizaciones de vmstat a 300 segundos.
El script está disponible en el repositorio de ejemplos de SUSE Telco Cloud.