...

Páginas enormes transparentes en Linux: ¿mejoran el rendimiento o son un problema?

Hugepages transparentes En Linux, prometen menos fallos de TLB, menos sobrecarga de las tablas de páginas y, por lo tanto, un mayor rendimiento; sin embargo, los administradores informan de picos de latencia y tiempos de respuesta variables. Explico claramente cuándo THP es Potenciador del rendimiento identifica dónde acechan los riesgos y cómo puedo configurarlo para que las cargas de trabajo se ejecuten de forma fiable.

Puntos centrales

Las siguientes ideas clave me ayudan a entender rápidamente THP y a configurarlo correctamente; cada línea destaca lo más importante Centro de gravedad.

  • Dinámica: THP agrupa automáticamente las páginas de 4 KB en páginas de 2 MB y las vuelve a dividir.
  • Ventajas: Menos fallos de TLB y menor sobrecarga de la CPU con bloques de datos secuenciales de gran tamaño.
  • Desventajas: La compactación puede provocar picos de latencia, lo cual es delicado para las bases de datos y las máquinas virtuales.
  • Modos: always, madvise, never – Las configuraciones suelen beneficiarse de „madvise“ o „never“.
  • Práctica: Enfoque híbrido con HugePages estáticas para bases de datos críticas y THP de forma selectiva para aplicaciones.

Cómo funciona THP en el núcleo

Entiendo la THP como un complemento Abstracción En la gestión de la memoria: el núcleo „agrupa“ páginas adyacentes de 4 KB en folios de 2 MB tan pronto como los patrones de acceso y la ubicación en memoria lo permiten. Esta optimización reduce el número de entradas en las tablas de páginas, lo que mejora la MMU alivia la carga y aumenta las tasas de acierto de la TLB. Cuando los patrones cambian o la memoria se fragmenta, el núcleo vuelve a degradar las páginas a 4 KB para que los datos «calientes» y «fríos» mantengan su flexibilidad. Este flujo de promoción y degradación se produce de forma transparente para las aplicaciones, que ven su estructura de direcciones virtuales sin cambios. En el hardware moderno, esto puede suponer una ayuda notable, siempre y cuando la carga de fondo no pase a primer plano.

Cargas de trabajo que se benefician de forma evidente

Grandes áreas de memoria contiguas con más bien secuencial Los accesos se benefician de THP de forma especialmente notable. Veo ventajas en las cachés en memoria, los motores de análisis y los códigos numéricos de HPC con una gran huella de matrices. Los informes de experiencia sobre las tablas hash de C++ muestran mejoras de dos dígitos, ya que las faltas de acierto en la TLB se producen con menos frecuencia y la CPU tiene que realizar menos tareas administrativas. También las bases de datos con patrones predominantemente de lectura y aptos para la caché pueden mejorar su rendimiento, siempre que el núcleo no active compactaciones costosas. En resumen, a menudo aumenta el Rendimiento, cuando los datos se encuentran „dispersos“ en la memoria y la carga de la TLB disminuye.

Por qué se producen picos de latencia

THP necesita un espacio físico contiguo Bloques de memoria; cuando la fragmentación es elevada, el núcleo tiene que desplazar y comprimir áreas. Esta compactación suele realizarse en segundo plano, pero en situaciones de carga elevada puede pasar a primer plano y provocar pausas. Son precisamente estos momentos los que hacen que las latencias P99 aumenten, aunque la mediana parezca buena. Por eso compruebo regularmente la Fragmentación de la memoria, antes de activar THP de forma intensiva. Quienes gestionen servicios en los que la latencia sea un factor crítico deberían estar atentos a estos picos y, si es necesario, reducir la desfragmentación o desactivar THP para Jitter que hay que evitar.

Bases de datos, virtualización y rendimiento de MySQL

Relacional Bases de datos MySQL y PostgreSQL son muy sensibles a las interrupciones impredecibles provocadas por la compactación de la memoria. He observado en varias ocasiones que el „rendimiento de MySQL“ fluctúa bajo THP, aunque el valor medio parezca estable. En entornos de virtualización, los pequeños cuellos de botella se multiplican debido a las capas adicionales, lo que dificulta obtener tiempos de respuesta fiables. Quienes gestionan instancias de Oracle o de MySQL de gran tamaño suelen obtener mejores resultados utilizando HugePages estáticas y desactivando THP, con el fin de lograr latencias consistentes. Lo mismo se aplica a las máquinas virtuales críticas y a los servicios en tiempo real, ya que en estos casos el comportamiento determinista tiene claramente prioridad sobre Rendimiento tiene.

Ajustar correctamente el THP: modos y interruptores

Controlo THP a través de Sysfs y el Núcleo-Parámetro de línea de comandos. El modo se encuentra en /sys/kernel/mm/transparent_hugepage/enabled y muestra, por ejemplo, „always madvise [never]“, siendo la entrada entre corchetes la activa. Para los nodos en los que la latencia es crítica, configuro echo never > /sys/kernel/mm/transparent_hugepage/enabled y la misma configuración en .../desfragmentar, para que no se ejecute ninguna compactación agresiva. Para cargas de trabajo mixtas, me gusta utilizar madvise y marca solo las zonas adecuadas con MADV_HUGEPAGE. Para desactivarlo de forma permanente, introduzco transparent_hugepage=never Introdúcelo en la línea de comandos del kernel y actualiza el gestor de arranque.

Comparación de los modos THP y ajustes recomendados

La siguiente tabla clasifica los más habituales Modos y me ayuda a tomar decisiones rápidas en función de cada rol de servidor.

Modo Ventajas Riesgos Adecuado para Nota
siempre Máximo efecto automático, más amplio TLB-Exención Mayor probabilidad de que se produzcan latencias de compactación Servidor de aplicaciones sin objetivos P99 estrictos Utilizar SOLO tras las pruebas de carga
madvise Ventajas específicas, menos sorpresas Requiere la activación de la opción «App/Lib» Cargas de trabajo mixtas, cachés, análisis Bien Por defecto para el alojamiento web
nunca Latencia constante, sin efectos secundarios del THP Sin THP-Boost Bases de datos, máquinas virtuales, servicios en tiempo real Combinar con HugePages estáticas

THP frente a HugePages estáticas en el alojamiento web

Las HugePages estáticas me resultan muy útiles constante Latencias, porque las reservo de antemano y el núcleo no las compacta en segundo plano. Para bases de datos grandes y JVM que se ejecutan durante mucho tiempo, calculo el número con holgura y así mantengo cortos los recorridos de memoria. THP, por el contrario, destaca por su comodidad y por las mejoras automáticas que ofrece con cargas menos sensibles. En muchas configuraciones combino ambas opciones: THP para nodos web y de aplicaciones, y HugePages estáticas para servidores de bases de datos. Esta descripción general ofrece una buena introducción a HugePages en el alojamiento web, que utilizo como punto de partida antes de pasar a los ajustes de precisión y Perfiles por rollo.

Guía práctica para WordPress, tiendas online y microservicios

Para empresas pequeñas y medianas WordPressEn los sitios web, suelo activar THP en el modo „madvise“ y compruebo las latencias bajo carga real. Se aprecian ventajas notables cuando PHP-FPM, las cachés y los procesos web mantienen grandes áreas de lectura. En el caso de bases de datos de tiendas online de gran tamaño o pilas multitenant, pruebo THP, pero lo desactivo rápidamente en cuanto aumentan los valores P95/P99. Para los servidores de bases de datos en producción, casi siempre apuesto por HugePages estáticas y descarto THP. Esta estrategia garantiza tiempos de respuesta fiables, mientras que los servidores de aplicaciones aprovechan el efecto automático con poco Riesgo uso.

Seguimiento y cifras clave que cuentan

Integro estadísticas THP, contadores de compactación y TLB-Errores en mi configuración de observabilidad. Archivos en /sys/kernel/mm/transparent_hugepage/, vmstat y herramientas como perfecto Me ayudan a detectar rápidamente los puntos críticos. Presto atención a las latencias P95/P99, a los colapsos por segundo y al tiempo de CPU en Kcompactd. En sistemas NUMA, compruebo además la localidad de la memoria, ya que una asignación incorrecta puede ocultar los efectos; una buena introducción es esta guía sobre Localidad NUMA. Así es como demuestro con cifras si la medicina tradicional tailandesa (THP) es eficaz o perjudica, en lugar de fiarme de mi intuición.

Resolución de problemas y reversión rápida

Si las latencias aumentan de repente, desactivo temporalmente THP con nunca y comparo los valores medidos antes y después del cambio. Si el efecto persiste, compruebo la fragmentación, los tiempos de espera de E/S y las fases del recolector de basura en las JVM. En cuanto se confirma que la causa es el THP, configuro de forma permanente transparent_hugepage=never o accedo a „madvise“ con una opción de participación voluntaria específica. En ventanas con una carga elevada, detengo la desfragmentación agresiva para suavizar los picos. Solo cuando el Jitter Si desaparece, voy retrocediendo paso a paso y documento la decisión a favor de la función del servidor.

Lo que suele faltar: THP y folios anónimos frente a los basados en archivos

Distingo entre memoria anónima (heaps, stacks, mapeos sin archivo) y páginas basadas en archivos (caché de páginas). THP está consolidado para la memoria anónima y se gestiona mediante activado/desfragmentar y la indicación del espacio de usuario MADV_HUGEPAGE controlado. Para las áreas de memoria compartida (tmpfs/shmem) existe un parámetro específico /sys/kernel/mm/transparent_hugepage/shmem_enabled, que aplica reglas similares. El enfoque «folio», que se utiliza de forma generalizada desde las últimas generaciones de kernel, agrupa las representaciones internas de manera más eficiente y allana el camino para que el kernel utilice unidades variables y más grandes; en el día a día, esto se nota en una mejora más sólida del THP, siempre y cuando la fragmentación y la carga no sean predominantes.

Ajustes avanzados: parámetros relevantes del kernel y de sysfs

Para obtener resultados repetibles, ajusto los controles específicos en lugar de utilizar opciones generales del tipo „siempre/nunca“:

  • /sys/kernel/mm/transparent_hugepage/enabled: Modo básico para THP anónimos.
  • /sys/kernel/mm/transparent_hugepage/defrag: Nivel de agresividad de la desfragmentación (en caso de problemas de latencia, ajustarlo a un nivel más conservador o desactivarlo).
  • /sys/kernel/mm/transparent_hugepage/khugepaged/: Frecuencia de exploración y límites del hilo en segundo plano (p. ej.,. scan_sleep_millisecs, páginas_que_hay_que_escanear), para equilibrar la carga de la CPU y los colapsos.
  • /proc/sys/vm/compaction_proactiveness: Reducir la compactación proactiva en una fase temprana si los picos de actividad resultan molestos.
  • /proc/sys/vm/compact_unevictable_allowed: ¿Se pueden compactar también los terrenos de difícil compactación? A menudo, un enfoque más conservador resulta más estable.
  • /proc/sys/vm/swappiness: Un valor elevado de «swappiness» provoca un mayor uso de «reclaim» cuando hay carga; en estos casos, a menudo hay que dividir los THP; yo establezco valores bajos para los objetivos de latencia.

Además, leo los valores de las variables de medición /proc/vmstat (por ejemplo thp_fault_alloc, thp_collapse_alloc, thp_split, compact_stall) y /proc/meminfo (AnonHugePages, ShmemHugePages). Así puedo comprobar si realmente se utiliza el THP y si aumentan las divisiones y las compactaciones en las horas punta.

Swap, Reclaim y „Deferred Split“

Cuando hay presión en la memoria, la ilusión de „páginas grandes y contiguas“ se desvanece: las funciones «Reclaim» y «Swap» no pueden expulsar directamente páginas de 2 MB, sino que primero deben dividirlas en páginas de 4 KB. Estas divisiones se realizan a través de una cola diferida, que se procesa posteriormente. En la práctica, esto significa que los picos de carga breves pueden provocar artefactos de latencia segundos más tarde, cuando las divisiones se procesan a posteriori. Yo mitigo este efecto de la siguiente manera:

  • baja vm.swappiness o la omisión del swap en los nodos de latencia,
  • presupuestos de margen reservados en el dimensionamiento de la memoria (sin asignación 99-%),
  • conservador desfragmentar‑Ajustes para que sea menos necesario realizar divisiones posteriores.

Efectos NUMA y AutoNUMA

La tecnología THP solo surte efecto si los acumuladores también local relacionada con la CPU. En los hosts NUMA, he observado que una compactación agresiva agota las reservas locales y, a continuación, provoca asignaciones remotas; la latencia aumenta, aunque el THP esté activo. Yo procedo de la siguiente manera:

  • Definir la afinidad de CPU y memoria por servicio (por ejemplo,. numactl en el envoltorio de servicio),
  • kernel.numa_balancing Elegir con cuidado: suele ser mejor en el caso de servicios con pines estables; en cargas dinámicas, puede resultar útil,
  • Incluir el seguimiento de la localidad NUMA en el análisis THP (véase el enlace sobre la localidad NUMA más arriba).

Si aumentan las participaciones remotas, esto relativiza las ganancias de TLB de THP; en ese caso, hay que dar prioridad primero a la localidad y, después, al ajuste de THP.

Virtualización: separar claramente el host del invitado

En el entorno KVM, distingo claramente entre las decisiones del host y las del invitado. En el host, garantizo latencias deterministas para todas las máquinas virtuales, normalmente con HugePages estáticas (1 GB/2 MB a través de hugetlbfs) y THP desactivado, para que la compactación no afecte a todos los invitados al mismo tiempo. Dentro del invitado, actúo como si estuviera en un servidor físico: las máquinas virtuales de bases de datos reciben HugePages estáticas y THP „never“, mientras que las máquinas virtuales web y de aplicaciones pueden utilizar „madvise“. Además, tengo en cuenta que Vuelo en globo y reducir el overcommit en la memoria del invitado y las cuotas de THP; si hay objetivos de latencia, reduzco el ballooning o asigno más RAM fija. Aunque la deduplicación KSM ahorra memoria, su compatibilidad con páginas grandes es limitada; no activo KSM en hosts con presupuestos de latencia estrictos.

Contenedores y Kubernetes

En los contenedores se aplica lo siguiente: el THP es una propiedad del núcleo del nodo. Establezco el modo del sistema en el worker y acepto que los pods individuales no tengan su propia anulación de la política de THP. Consejos prácticos:

  • Nodos con carga mixta: madvise como modo básico, bibliotecas como jemalloc o aplicaciones específicas mediante madvise() Dejar el «opt-in».
  • Límites de memoria con margen: en cgroups con poco espacio, «Reclaim» provoca divisiones con mayor frecuencia; un poco de margen estabiliza P99.
  • Implementaciones por fases: grupo de nodos A con modificación de THP, B como grupo de control – P95/P99 y tiempo de CPU en kcompactd comparar.

JVM, malloc y entornos de ejecución

Los montones de la JVM se benefician de un menor número de fallos de TLB; sin embargo, las fases de ML/GC no admiten pausas imprevistas. Para garantizar tiempos de pausa constantes en montones de gran tamaño, utilizo HugePages estáticas (-XX:+UseLargePages utilizo hugetlbfs) y omito THP. En servicios de la JVM menos sensibles se puede madvise Aprovechar las ventajas de THP, siempre y cuando realice un seguimiento exhaustivo de las métricas de GC. malloc‑Las implementaciones se comportan de forma diferente: jemalloc se puede hacer mediante madvise‑Consejos: es mejor preparar bien las áreas grandes para THP; glibc-malloc escala con muchas áreas, lo que puede provocar fragmentación; en este caso, reduzco el número de áreas en los procesos en los que la latencia es crítica para facilitar la promoción a THP.

Estrategia de pruebas e implementación segura

Sigo un orden claro para diferenciar claramente los beneficios de los efectos secundarios:

  1. Registrar los valores de referencia: P50/P95/P99, ciclos de CPU, perf stat -e dTLB-load-misses,iTLB-load-misses, /proc/vmstat‑Contador.
  2. Activar el modo „madvise“, seleccionar específicamente un componente para su inclusión (opt-in) y volver a realizar la medición.
  3. Reducir la compactación (desfragmentar más conservador, compactación_proactividad (reducir) y volver a medir.
  4. Simular explícitamente en la prueba las cargas máximas y las tareas en segundo plano (copias de seguridad, reindexaciones, implementaciones); es precisamente entonces cuando se aprecian las fluctuaciones.
  5. Solo si P95/P99 son estables, ampliar el efecto a más servicios. De lo contrario, volver a „never“ o a las HugePages estáticas.

Lista de control para la vida cotidiana

  • El objetivo está claro: ¿rendimiento o latencia constante? A continuación, selecciona el modo.
  • Comprobar la fragmentación antes de que „always“ entre en producción.
  • Primero hay que fijar la ubicación NUMA y, a continuación, ajustar con precisión el THP.
  • El swap y el reclaim a la vista: bajo nivel de swappiness para los servicios de latencia.
  • Adapta el parámetro `khugepaged` a la carga de trabajo; no utilices los valores predeterminados a ciegas.
  • En el caso de bases de datos/máquinas virtuales: dar prioridad a las HugePages estáticas; THP „nunca“.
  • Documentar y automatizar el plan de reversión.

Brevemente resumido

THP puede ser un claro Booster cuando las cargas de trabajo utilizan grandes áreas de memoria de lectura y no tienen objetivos P99 estrictos. En el caso de las bases de datos, la virtualización y los servicios en tiempo real, prefiero latencias consistentes y apuesto por las HugePages estáticas. Elijo „madvise“ como término medio seguro para servidores mixtos y dejo que las aplicaciones se optimicen de forma específica. Unas mediciones exhaustivas, una buena supervisión y una estrategia de reversión clara evitan sorpresas costosas. De este modo, se podría aprovechar Hugepages transparentes mejorar, sin poner en peligro la fiabilidad de los sistemas productivos.

Artículos de actualidad

Rack de servidores con sistemas Linux y visualización del uso de la memoria
Servidores y máquinas virtuales

Entender el OOM Killer: cuando Linux termina procesos

Descubre cómo funciona el OOM Killer en Linux cuando hay falta de memoria, cómo termina los procesos y cómo, como administrador en entornos de alojamiento web, puedes evitar los problemas de falta de memoria utilizando la palabra clave «oom killer linux».