¿Porqué la #Swap es importante? Un ejemplo práctico


Hace días publicamos un artículo donde mencionábamos 7 tips para mantener tu linux rápido y responsivo con el tiempo. En el último punto, (el 8vo) se mencionaba algo sobre "los mitos de la swap" y las de alguna manera "falsas" afirmaciones que algunas personas hacen sobre "estar mejor sin swap" o "haciendo poco uso de ella".

En el artículo citado se explica a fondo porqué esto es más falso que cierto (así que si les interesa saber y no lo han leído háganlo) Pero citaré otro ejemplo práctico a continuación:

Y... Se nos cayó el clúster

Ayer, varias horas después de lanzar el deployment de alta disponibilidad para Xenode Systems de pronto alguien nos envió un tweet mencionando que encontró un error en la página. Esto no era normal puesto que todos los sistemas estaban operacionales según el sistema de alertas y de tener error, (al no ser fatal según un chequeo rápido puesto que como ya expliqué los sistemas supuestamente estaban operando de manera normal) éste debería repararse por sí solo antes de ser notado por alguna persona debido a la naturaleza failover del clúster.

Hice la revisión de la página y ¡sorpresa! Error 404 en la página principal... (NOTA: Este tipo de error se tiende a deber a un comportamiento errático dentro del replica set de MongoDB); El debugging me llevó tan solo unos minutos y logré rastrear el punto de origen hasta un reseteo no programado en nuestro VPS dentro de DigitalOcean (que detecté gracias al comando uptime). Al principio señalé culpables con el dedo:


  • Que si DigitalOcean ("seguro reiniciaron los VPS", me dije)
  • Que si MongoDB (No estoy seguro de la causa, pero igual tuve mis sospechas)


Así que abrí un ticket de soporte y en lo que me atendían seguí haciendo el debugging del sistema. Al final resultó que la falla no estaba ni en el replica set de MongoDB (per sé) ni era culpa del staff de DigitalOcean (per sé), sino a que el enlace con la VPN que comparten las máquinas del clúster se había roto y no podían "encontrarse" de regreso. Según un miembro del staff de soporte en DigitalOcean, lo más probable era que el rebooteo inesperado se haya debido a que de pronto el VPS consumió tanta RAM que se quedó sin memoria y decidió reiniciarse por sí solo (como pude verificar tras checar /var/log/messages efectivamente). Esto me pareció extraño puesto que aún cuando el droplet tiene poca memoria tampoco es como si hiciera mucho y además tiene una swap montada sobre un SSD (que debería ser rápida a comparación de la montada sobre un disco duro) como memoria de respaldo.

Después recordé que habilité tuned dentro de mi VPS pero no en el perfil que uso normalmente para mis servidores sino en el de virtual-guest (ya que un VPS es una máquina virtual en sí) mismo que decrementa el valor de vm.swappiness por defecto y lo deja en 10 en lugar de 60 (siendo este último lo normal), haciendo que el sistema use con menos frecuencia y/o con menor preferencia la swap y por ende se quede sin memoria más fácilmente al acabarse la RAM disponible, empezando a matar procesos importantes (y/o cayendo en panic) para "subsistir" causando (como ya vimos) comportamientos erráticos inesperados en algunos deployments.

Obviamente la solución radicaba en cambiar dicho comportamiento para que el sistema usara la memoria total disponible (RAM + SWAP) en la manera distribuida normal en lugar de discriminar el uso de swap en favor de "más velocidad" ya que para un VPS (aún siendo una máquina virtual) que hace lo que el que tenemos para el clúster dicha discriminación no tiene sentido y/o beneficio (sobretodo cuando la swap se monta sobre de un SSD y se tiene zRAM habilitado). Con dado conocimiento en mente, cambié el perfil de tuned al que uso normalmente en los servidores físicos (throughput-performance, mismo que mantiene el valor de vm.swapiness en el 60 convencional) y añadí más swap sobre SSD al VPS para evitar que estas cosas pasaran en el futuro.

Extra: ¿Cuánta swap necesito?

La tabla que verán a continuación (cortesía de Red Hat) es un buen punto de referencia al momento de decidir cuánta swap usar en un setup determinado:


Así que como verán, ¡la swap es importante! tanto que su falta o disposición puede significar MUCHO para el uptime de tu sitio web, sobretodo en entornos con RAM limitada.