Le mostraré cómo controlar los servidores de uso de intercambio de una manera específica para que las cargas de trabajo de alojamiento no se estancan bajo carga y no rendimiento problemas de gatillo. Explico las causas, las cifras clave, los ajustes de intercambio, las recomendaciones de tamaño y los pasos prácticos de ajuste para memoria intercambio de alojamiento.
Puntos centrales
- Intercambio Reducir: Evitar la externalización agresiva
- Talla comprobar: Alinear swap a RAM y carga de trabajo
- IO proteger: Colocación de SSD, uso consciente de Zswap/ZRAM
- Monitoreo establecer: Fallos de página, kswapd, latencia
- Cargas de trabajo adaptar: Equilibrio entre la caché y los búferes de la base de datos
Qué hace realmente el intercambio y cuándo le ralentiza
Swap expande la RAM física moviendo páginas raramente usadas a SSD o HDD, y protege los procesos del asesino OOM, lo que me ayuda en emergencias. Tampón da. Linux descarga de forma oportunista para dar más espacio a las páginas activas y mantener la caché de páginas, pero demasiada actividad aumenta la IO-carga. En cuanto el sistema cambia con frecuencia entre RAM y swap, existe el riesgo de thrashing y, por tanto, una latencia notable. Especialmente con alojamiento web pesado con PHP, base de datos y Node.js, la caché, el PHP worker y el buffer DB compiten por la memoria. Por lo tanto, mantengo swap disponible como una red de seguridad, pero minimizo su uso en el funcionamiento normal.
Reconocer los síntomas de un uso elevado del canje
Compruebo primero gratis -h y vmstat, porque las altas tasas de swap-in/swap-out indican cuellos de botella. Si las tasas se mantienen bajas y la RAM está libre, el sistema suele funcionar con normalidad y sólo utiliza el swap de forma oportunista. Sin embargo, si las tasas de fallo de página y la cola IO aumentan, la latencia de la aplicación aumenta y las peticiones se vuelven más lentas. En los registros, veo indicaciones de trabajadores ocupados y consultas lentas que se producen al mismo tiempo que los picos de swap. Para más información básica sobre la memoria virtual, le remito a esta introducción compacta a memoria virtual, que me ayuda con la categorización.
Ventajas y riesgos del alojamiento de intercambio de memoria
Utilizo swap para amortiguar los picos de RAM y para mantener en funcionamiento servicios críticos, lo que a corto plazo puede ser muy útil. Fallo se evita. Esto significa que las instancias VPS más pequeñas pueden arreglárselas con menos RAM, lo que puede reducir los costes en euros siempre que la carga IO se mantenga dentro de los límites. Sin embargo, si se intercambia demasiada, SSD/NVMe queda claramente por detrás de RAM y las peticiones se paralizan. Además, la compresión (ZRAM) cuesta tiempo de CPU, que las aplicaciones preferirían utilizar para el trabajo real. Por tanto, para mí Swap no es un sustituto, sino una red de seguridad que controlo activamente.
Swappiness: el tornillo de ajuste más importante
La variable de núcleo vm.swappiness (0-100, por defecto normalmente 60) controla lo pronto que el sistema descarga las páginas, y yo lo reduzco a 10 para cargas de trabajo de alojamiento. Temporalmente pruebo con sysctl vm.swappiness=10, Escribo permanentemente vm.swappiness=10 en /etc/sysctl.conf. En hosts SSD, esto se traduce en menos swapping y más espacio para la caché de páginas. A continuación, controlo la IO, las latencias y los conjuntos de trabajo para confirmar el efecto. Si las cifras clave permanecen estables, mantengo la configuración y documento el cambio para auditorías posteriores.
Tamaño óptimo de swap para servidores comunes
Ajusto el tamaño de la swap a la RAM, la carga de trabajo y cualquier hibernación, ya que encuentro archivos demasiado grandes Memoria y los archivos demasiado pequeños reducen el búfer. Para servidores de alojamiento típicos sin hibernación, planifico valores moderados y priorizo más RAM sobre volúmenes de intercambio enormes. Para instancias VPS escasas, 1,5-2 veces la RAM puede tener sentido hasta que sea posible una actualización real. Si tienes mucha RAM, a menudo te beneficias de áreas de swap más pequeñas pero disponibles para evitar caídas. Utilizo la siguiente tabla como punto de partida y la ajusto según los valores medidos:
| Tamaño de RAM | Intercambio sin hibernación | Intercambio con hibernación |
|---|---|---|
| ≤ 2 GB | 2x RAM | 3x RAM |
| 2-8 GB | = RAM | 2x RAM |
| 8-64 GB | 4-8 GB | 1,5 veces la RAM |
| > 64 GB | 4 GB | No recomendado |
Colocación de swaps y técnicas avanzadas
Prefiero los archivos swap a las particiones porque puedo ajustar dinámicamente los tamaños y hacer cambios más rápido. en directo ir. Si el área de intercambio está en un almacenamiento SSD separado, compite menos con el SO por IO. Para máquinas virtuales muy pequeñas, utilizo Zswap o ZRAM como prueba para reducir el IO, pero vigilo de cerca la utilización de la CPU. Limito limpiamente el overcommitment y establezco límites para los servicios, de modo que ningún proceso lleve a la máquina al thrashing. Al final, lo que cuenta es un efecto medible: menos latencia, IO más silencioso y tiempos de respuesta constantes.
Seguimiento: qué cifras clave cuentan realmente
Mido la utilización de RAM, caché de páginas, swap in/out, la actividad de kswapd y las colas IO, porque estos valores me envían señales desde el principio. Si el movimiento de intercambio aumenta, lo correlaciono con la latencia de la aplicación y los tiempos de consulta. También compruebo los fallos de página menores/mayores para reconocer los accesos de memoria costosos. Para ayudarme a entender las estrategias de almacenamiento intermedio, utilizo esta guía para Utilización del búfer y la caché. Sólo cuando las métricas y los registros muestran una presión constante, intervengo y cambio la configuración.
Cómo selecciona páginas el núcleo: una mirada más profunda a Reclaim
Para afinar de forma dirigida, entiendo las listas internas: Linux diferencia entre páginas anónimas (montones/pilas) y páginas soportadas por archivos (caché de páginas). Ambas están unidas a listas LRU (activas/inactivas). Si la memoria está bajo presión, el núcleo intenta primero descartar las páginas inactivas basadas en archivos (rápidamente, ya que pueden recargarse desde el disco). Si hay demasiadas páginas anónimas activas, tiene que moverlas a la swap - esto es más caro. Un alto vm.vfs_cache_pressure acelera el descarte de dentries/inodos, lo que libera espacio pero puede provocar más accesos a archivos en los servidores web. Yo suelo mantenerlo en torno a 50-100 y observo cómo cambian la tasa de aciertos de la caché y la latencia.
Influyo en las vías de escritura a través de vm.dirty_background_bytes/vm.bytes sucios (o las variantes de proporción). Los límites de suciedad demasiado altos sólo posponen el problema y más tarde generan grandes writebacks que ralentizan la recuperación de swap. Yo prefiero los límites basados en bytes, ya que funcionan con mayor precisión en sistemas de gran RAM. Otro parche es vm.min_free_kbytesSi este valor se establece demasiado bajo, la recuperación se ejecuta en ciclos agitados; demasiado alto, desperdicia RAM. Normalmente dejo este valor en el predeterminado de la distribución, a menos que vea constantemente „low free watermarks“ en dmesg.
PSI y kswapd: interpretar correctamente los indicadores adelantados
Además de las métricas clásicas, utilizo Información sobre pérdida por presión en /proc/presión/memoria. Alta algunos o completo Los valores de varios segundos me indican que las tareas están esperando memoria. Esta suele ser la primera señal antes de que los usuarios noten la latencia. Al mismo tiempo, miro el tiempo de CPU de kswapdSi sube permanentemente por encima de unos pocos puntos porcentuales, Reclaim funciona en caliente. Con vmstat 1 Presto atención a si/así que (swap-in/out) y r/b (cola de ejecución/bloqueo). Alto nivel constante así que-valores junto con crecientes b-...entonces intervengo sistemáticamente.
Cgroups v2 y systemd: Limitar deliberadamente el swap
En entornos multi-tenant o de contenedores, evito que un solo servicio se coma todas las reservas. Con cgroups v2 establezco memoria.max (límite duro), memoria.alta (estrangulador suave) y memoria.swap.max (límite de swap). En systemd utilizo por servicio MemoriaMáx=, MemoriaAlta= y MemorySwapMax= en anulaciones de unidad. Esto significa que PHP-FPM no puede llevar todo el sistema a swap, mientras que las bases de datos permanecen reactivas. Para ráfagas, un estrecho memoria.alta más moderado MemorySwapMax=, en lugar de arriesgarme a que se produzcan OOM graves. Documento estos límites para cada servicio y los mantengo actualizados en el proceso de revisión.
Crear, ampliar y priorizar archivos swap de forma limpia
En la práctica, necesito pasos rápidos y reproducibles:
- Crear archivo de intercambio:
fallocate -l 8G /archivoswap && chmod 600 /archivoswap && mkswap /archivoswap - Activar:
swapon /archivo swap; permanentemente a través de/etc/fstabcon/swapfile none swap sw,pri=5 0 0 - Ajusta el tamaño:
swapoff /archivo swap,fallocate -l 12G /archivoswap,mkswap /archivoswap,swapon /archivo swap - Intercambios múltiples: NVMe más rápido con mayor
pripriorizar; conswapon --show --output=NOMBRE,PRIO,TAMAÑO,USADOcontrol
En sistemas muy débiles de IO, prefiero reducir el tamaño del swap o colocar el swap en soportes de datos más rápidos en lugar de permitir que el sistema se auto-invierta lentamente „hasta la muerte“.
Zswap y ZRAM: cuando la compresión es realmente útil
Zswap comprime las páginas que se van a intercambiar en el pool respaldado por RAM y reduce así el IO físico. Esto protege los SSD, pero cuesta tiempo de CPU. Para máquinas virtuales con pocos núcleos, primero pruebo lz4 (compresión rápida y más débil) y observo si aumentan los picos de CPU. Sustituyo selectivamente ZRAM por swap clásico en instancias muy pequeñas con el fin de permanecer casi libre de IO - planifico más CPU para esto. Mantengo deliberadamente una compresión pequeña (por ejemplo, 25-50% RAM para ZRAM) para evitar crear nuevos cuellos de botella. En cuanto las cargas de trabajo con CPU empiezan a tropezar, reviso esta optimización.
THP y fragmentación: frenos ocultos a la latencia
Transparent Huge Pages (THP) puede ayudar con JVMs o bases de datos, pero también puede sobrecargar la recuperación y el intercambio en entornos de alojamiento mixtos. Yo uso THP en madvise, para que sólo se beneficien las cargas de trabajo que la utilicen explícitamente. En caso de fragmentación notable de la memoria, planifico reinicios continuos de los servicios que consumen mucha memoria para limpiar las pilas que se han disparado. Para MySQL/MariaDB, también compruebo si la reserva de búferes de InnoDB es lo suficientemente grande en relación con la memoria total para que la caché de páginas de Linux no se muera de hambre (las cachés duplicadas cuestan RAM y aumentan innecesariamente el swap).
NUMA y hosts multisocket
NUMA desempeña un papel importante en los hosts bare-metal de mayor tamaño. El acceso desequilibrado a la memoria aumenta las latencias y acelera la recuperación. Distribuyo las cargas de trabajo entre numactl --interleave=todos o fijar servicios específicos por nodo. Mantengo los servicios críticos que provocan muchos accesos a la caché de páginas (por ejemplo, Nginx) cerca de las rutas de datos; encapsulo los trabajos por lotes que consumen mucha memoria y les doy límites de cgroup más estrictos si es necesario para que los desbordamientos NUMA no empujen todo el sistema a swap.
Diagnóstico de procesos: ¿quién intercambia realmente?
Si las métricas del sistema dan la alarma, identifico la causa a nivel de proceso: smem -knr me muestra PSS/USS (cuotas de memoria realistas), pmap -x la distribución por segmentos. En /proc//status Compruebo VmRSS, VmSwap y oom_score_adj. Alta VmSwap-valores para patrones poco amigables con LRU (muchas páginas anónimas y poco usadas) son un candidato para límites u optimización de código. También utilizo pidstat -r 1, para ver las tasas de fallos por proceso y compararlas con las latencias de las aplicaciones.
Runbooks, SLOs y niveles de escalado
Defino valores límite claros por clase de host, por ejemplo: kswapd-CPU < 5% en una media de 5 minutos, fallos mayores < 50/s/núcleo en funcionamiento normal, memoria PSI algunos < 10% sobre 60s. Si se rompen dos métricas al mismo tiempo, intervengo en este orden: compruebo el swappiness, temporalmente estrangulo los trabajadores/buffers, ajusto la colocación y las prioridades del swap, (des)activo la compresión, aumento la RAM si es necesario. Estos runbooks forman parte de mi respuesta a incidentes para que los equipos puedan actuar de forma reproducible y Latencia se mantiene bajo control.
Resolución de problemas: causas típicas y soluciones rápidas
Si las tasas de intercambio aumentan, primero compruebo los servicios que consumen mucha memoria y los limito con cgroups o la configuración del servicio. A continuación, compruebo si hay demasiados PHP workers, búferes de base de datos demasiado grandes o una caché de páginas demasiado pequeña. Reduzco el swap, ordeno las cachés temporales y muevo las rotaciones de logs de las horas punta. Si la cola de IO permanece permanentemente alta, reubico el swap o lo reduzco para minimizar la competencia de IO. Si esto no es suficiente, aumento la RAM y vuelvo a medir hasta que la latencia se mantiene estable a un nivel bajo.
Ajuste para PHP, bases de datos y Node.js
Con PHP, maximizo los accesos de página completa u OPcache para que se utilice menos RAM en la compilación repetida y, por lo tanto Tiempo de respuesta disminuye. En MySQL/MariaDB, equilibro la reserva de búfer y la caché de consultas con la caché de páginas para evitar el doble almacenamiento en caché. Para Node.js, establezco límites para el montón y controlo la recolección de basura para que Bucle de eventos no se tambalea. También evito la fragmentación de la memoria mediante roll-outs que reinician periódicamente los servicios y detectan fugas. Una breve mirada en profundidad al Fragmentación de la memoria ayuda a detectar más rápidamente este tipo de problemas.
Contenedores y pilas de alojamiento: ejemplos prácticos
En entornos de contenedores, establezco un límite de memoria por pod o servicio y sólo permito una cantidad moderada de swap. Para PHP-FPM, calculo la memoria por trabajador (RSS) más el espacio libre para la caché de páginas. Ejemplo: 512 MB RAM, 30 MB/trabajador consumo real - entonces 8-10 trabajadores son realistas, no 20. Para Node.js establezco --max-old-space-size deliberadamente por debajo del límite físico para que la GC no se vea sometida a presión y el núcleo no intercambie agresivamente memoria anónima. Para las bases de datos, planifico presupuestos fijos, las separo de la capa web cuando es posible y doy al SO espacio suficiente para las cachés de archivos.
Costes, hardware y cuándo actualizar la RAM
Calculo los valores equivalentes en euros: Si la impresión de swaps crea una latencia permanente, la RAM adicional justifica rápidamente el precio y crea una latencia real. Actuación. NVMe reduce la latencia IO, pero no sustituye a la memoria volátil. Antes de ampliar el hardware, optimizo el intercambio, los búferes y el número de trabajadores para aumentar la eficiencia. Si la utilización sigue siendo alta, planifico un salto de RAM en etapas sensatas en lugar de limitarme a aumentar el swap. Esta secuencia evita malas inversiones y me proporciona puntos de medición claros para comparaciones posteriores.
Comprobación: Servidor de intercambio de uso en 15 minutos
Empiezo con libre -h, vmstat 1 y compruebe Intercambiar-movimiento, fallos de página y colas IO. A continuación, establezco vm.swappiness=10, carga sysctl y observo los ratios durante cinco minutos. Si se ajusta, anoto la configuración y documento el estado actual. En el siguiente paso, corrijo los recuentos de trabajadores y los búferes de BD que desplazan a la caché de páginas. Por último, creo alarmas que me avisan de los valores atípicos antes de que los usuarios se percaten de ellos.
Brevemente resumido
Utilizo Swap como arnés de seguridad, pero mantengo su uso bajo para que Latencia no explota y no se producen problemas de rendimiento. La mayor palanca sigue siendo un intercambio sensato, combinado con un tamaño de intercambio que coincida con la RAM y la carga de trabajo. Monitorizo kswapd, page faults y la cola de IO, comparo los valores con los registros de la aplicación y actúo a tiempo. Para los VPS más pequeños, el alojamiento de intercambio de memoria alivia la presión a corto plazo, mientras que el alivio real llega con más RAM. Seguir esta secuencia mantendrá la capacidad de respuesta de los servidores, reducirá el tiempo de inactividad y protegerá los presupuestos.


