Usando un Intel N5100 (arquitectura Tremont) darle caña al reloj suele chocar con las barreras de siempre: el límite térmico (thermal throttling, en mi caso sin ventilador) y la reducida capacidad de las memorias intermedia integradas en el chip.
Parece lento en ocasiones, pero no es porque la CPU no corra con ciclos de cómputo, es lo típico de una latencia producto de una gestión de memoria ineficiente. Linux y la interacción con el caché L3 resulta determinante.
El cuello de botella de la caché L3
En cualquier procesador moderno, la latencia de acceso escala exponencialmente a medida que nos alejamos del núcleo: L1 y L2 caché, unos pocos nanosegundos; sumamos L3 con unos pocos nanosegundos más, 20 o 30 ns; añadimos tiempo de la RAM, entre 60 y 100 ns, más los que sigan del proceso.
En chips de bajo consumo, la Caché L3 actúa como el buffer crítico que absorbe el impacto de las peticiones antes de penalizar al bus de memoria principal. Sin embargo, su tamaño es sumamente pequeño (frecuentemente de apenas 4MB compartidos entre cuatro núcleos). Cada vez que ocurre un L3 Cache Miss (el dato requerido no está en la L3), la CPU debe detener la ejecución de la tubería (pipeline stall) durante decenas de ciclos de reloj esperando a que el controlador de memoria traiga la línea desde la RAM física.
THP en modo always y la compactación de memoria
El kernel de Linux integra una característica denominada Transparent Huge Pages (THP). Su objetivo teórico es optimizar el rendimiento reemplazando las páginas tradicionales de memoria virtual de 4KB por páginas contiguas de 2MB. Al usar páginas de 2MB, se reduce la cantidad de entradas necesarias en el TLB (Translation Lookaside Buffer), el buffer de traducción de direcciones virtuales a físicas integrado en la propia CPU. Sin embargo, cuando THP está configurado en modo global always dentro de un sistema con poca Caché L3 y recursos limitados, se desencadena un efecto colateral severo:
- Memory Compaction (Compactación asíncrona): Para entregar una página contigua de 2MB, el kernel necesita encontrar un bloque de memoria física completamente sin fragmentar. Si no lo encuentra, invoca al demonio kcompactd para reordenar la RAM en tiempo real.
- Inundación de la Caché L3 (Cache Pollution): Mover y copiar bloques masivos de 2MB para consolidar páginas llena la reducida Caché L3 de datos de gestión administrativa del kernel, expulsando (evicting) los datos de las aplicaciones en ejecución.
- Pérdida de granularidad: Cargar bloques de 2MB para procesos que solo necesitan acceder a unos pocos kilobytes desperdicia espacio en la L3, aumentando drásticamente la tasa de fallos de caché (cache miss rate).
El resultado visible para el usuario es una elevación repentina de la latencia en el hilo de renderizado y micro-congelaciones en la interfaz gráfica.
Control granular mediante madvise
Al configurar el subsistema THP del kernel en modo madvise (transparent_hugepage=madvise), alteramos radicalmente el comportamiento del gestor de memoria:
[ Estado 'always' ] --> THP forzado en todo el sistema --> Fragmentación --> kcompactd activo --> L3 Cache Pollution
[ Estado 'madvise' ] --> Páginas base de 4 KB (por defecto) + THP opcional bajo demanda --> L3 limpia y eficiente
Editar la configuración del cargador de arranque:
Así dispones de la configuración prescrita desde el arranque.
sudo mousepad /etc/default/grub
Añadir la instrucción al parámetro GRUB_CMDLINE_LINUX_DEFAULT:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash transparent_hugepage=madvise"
Actualiza GRUB:
sudo update-grub
Reiniciar.
El paso al modo madvise demuestra que la optimización en arquitecturas con restricciones de hardware no pasa por forzar mayores frecuencias de trabajo, sino por reducir la sobrecarga de gestión (overhead) del software.
Podemos verificar el modo con la siguiente instrucción:
cat /sys/kernel/mm/transparent_hugepage/enabled
En la imagen se aprecia los tres modos de trabajo, y el que está señalado entre corchetes es el actual.
Al evitar la contaminación de la Caché L3 con bloques de memoria innecesarios y eliminar la latencia inducida por la compactación de páginas, permitimos que un microprocesador modesto ejecute sus ciclos de reloj de forma limpia, maximizando las instrucciones por ciclo efectivas (se nota).


No hay comentarios:
Publicar un comentario