Analice los casos a favor y en contra de la definición de espacio de intercambio en instancias de nube

Si desea iniciar una discusión con un usuario de Linux, pregunte acerca de la memoria. Algunos lo elogian como un colchón o una red de seguridad, mientras que otros lo denigran como un soporte y un destructor del rendimiento del sistema. Nacida en la década de 1960, la memoria de intercambio ha evolucionado a lo largo de los años en Linux para cumplir dos funciones esenciales:

  • Memoria de emergencia cuando un sistema consume toda su RAM y aún necesita más
  • Estacionamiento para páginas de memoria de uso poco frecuente que ocupan una valiosa memoria RAM del sistema

Muchas distribuciones de Linux, incluyendo Red Hat, recomendar memoria de intercambio para todos los sistemas. Sin embargo, si observa la mayoría de las instancias en la nube de diferentes distribuciones, encontrará que falta la memoria de intercambio.

Descripción general del intercambio

El intercambio existe en la mayoría de los sistemas como una partición en un disco. Después de particionar, los administradores formatean la partición con mkswap, activarlo con swapony el núcleo ve instantáneamente la memoria de intercambio disponible. Los sistemas sin una partición disponible pueden usar un archivo de intercambio, que es solo un archivo en un sistema de archivos existente que está formateado con mkswap y activado.

Ambos métodos funcionan bien, pero el intercambio de una partición conduce a un mejor rendimiento ya que ignora la sobrecarga de un archivo de intercambio en una partición existente.

Cuando la memoria RAM del sistema es escasa, Linux puede almacenar páginas de memoria en el intercambio para evitar eliminar procesos y bloquear el sistema. Los discos son mucho más lentos que la RAM del sistema, lo que reduce el rendimiento del sistema hasta que la RAM del sistema se libera. Si el uso de la memoria continúa aumentando hasta el punto en que la RAM del sistema y el intercambio se agotan por completo, aparecerá el asesino de falta de memoria (OOM) y comenzará a eliminar los procesos hasta que haya suficiente RAM disponible.

El consejo de larga data sobre el tamaño de intercambio es el doble del tamaño de la RAM de su sistema. Por ejemplo, asigne 2 GB de intercambio para sistemas con 1 GB de RAM del sistema. Si bien esta proporción funciona bien para sistemas pequeños, no se escala para sistemas con cientos de gigabytes de RAM del sistema.

El caso del intercambio de nubes

El auge de los microservicios (pequeños servicios interconectados que forman una gran aplicación) ha llevado a las empresas a implementar instancias cada vez más pequeñas. Las instancias más pequeñas vienen con menos RAM del sistema, lo que aumenta el riesgo de que el temido asesino OOM aparezca para eliminar procesos hasta que el sistema tenga suficiente memoria libre.

Agregar un intercambio a estos sistemas ayuda de dos maneras:

  • En primer lugar, los procesos pueden salir brevemente de la RAM del sistema a cambio durante momentos de alta carga. Los administradores aprenden acerca de estos eventos de sus sistemas de monitoreo y tienen tiempo para investigar el motivo de la ráfaga mientras ocurre en el sistema. En el caso de fugas de memoria, los desarrolladores pueden inspeccionar el proceso para comprender qué salió mal mientras aún está vivo. También puede ser una señal de que los administradores necesitan tipos de instancias más grandes para su aplicación a medida que crece.
  • En segundo lugar, el kernel de Linux supervisa las páginas de memoria que se usan con poca frecuencia y las envía a cambio para preservar la valiosa memoria RAM del sistema. el sysctl ajuste vm.swappiness controla el deseo del núcleo de empujar las páginas de memoria para intercambiar. Esto podría ayudar a una instancia en la nube al mantener las páginas más activas en la memoria RAM del sistema mientras empuja las páginas que se usan con poca frecuencia para intercambiar memoria.

El caso contra el intercambio de nubes

el analogía de "mascotas vs ganado" aparece con frecuencia cuando se habla de instancias en la nube y los administradores prohíben el intercambio porque pueden reemplazar automáticamente una instancia que se comporta mal por una nueva. Con el tiempo, sus métricas de monitoreo muestran un aumento en la cantidad de instancias que requieren reemplazo debido a que el asesino OOM desconectó su aplicación. La solución podría ser instancias más grandes o una investigación más exhaustiva de las fugas de memoria bajo carga. Systemd también reiniciará estos procesos rápidamente si es posible.

La elección de una ubicación de memoria de intercambio en las instancias de la nube requiere más reflexión y planificación. En servidores físicos, cambiar a un disco Non-Volatile Memory Express (NVMe) conectado localmente es bastante rápido, pero ¿qué pasa con una instancia en la nube con almacenamiento externo montado, como Elastic Block Almacenamiento (EBS) d 'AWS? El rendimiento en EBS variará según el tipo de EBS que elija y sus vecinos en el sistema. Cambiar a un sistema de almacenamiento remoto puede causar un bajo rendimiento de la instancia cuando el sistema desborda su RAM. Los administradores pueden optar por omitir el intercambio y reemplazar estas instancias cuando desbordan su RAM en lugar de luchar con las demandas de administración del servidor de bajo rendimiento.

Finalmente, muchas instancias en la nube son parte de los clústeres de Kubernetes y OpenShift, y tienen un desafío cuando se trata de memoria de intercambio. Hay un Problema de GitHub de larga duración en la gestión adecuada de la memoria de intercambio porque elimina la contabilidad de la memoria para los contenedores. Existen soluciones alternativas, pero la memoria de intercambio generalmente se ignora en estos sistemas.

Implemente instancias en la nube con intercambio

Si decide que el aprovisionamiento de memoria de intercambio beneficia a sus aplicaciones, cloud-init le ofrece la opción de aprovisionar memoria de intercambio en el primer arranque mediante el mounts módulo. Simplemente agregue algunas líneas a sus datos de usuario de configuración de nube existentes:

swap:
    filename: /swapfile
    size: auto
    maxsize: 4294967296

Esta configuración le dice a cloud-init que cree un archivo de paginación en /swapfile con un tamaño automático igual o inferior a 4 GB. La fórmula de tamaño de intercambio automático está en código fuente de inicialización en la nube:

formulas = [
    # < 1G: swap = double memory
    (1 * GB, lambda x: x * 2),
    # < 2G: swap = 2G
    (2 * GB, lambda x: 2 * GB),
    # < 4G: swap = memory
    (4 * GB, lambda x: x),
    # < 16G: 4G
    (16 * GB, lambda x: 4 * GB),
    # < 64G: 1/2 M up to max
    (64 * GB, lambda x: x / 2),
]

El tamaño de intercambio recomendado por Red Hat difiere ligeramente:

  • 2 GB o menos de RAM del sistema: 2x RAM
  • Más de 2 GB a 8 GB: 1 memoria RAM
  • Más de 8 GB a 64 GB: 4 GB mínimo
  • Más de 64 GB: 4 GB mínimo

Puede especificar manualmente la memoria de intercambio (en bytes) con el size: ajuste
en la configuración de la nube:

swap:
    filename: /swapfile
    size: 2147483648  # 2 GiB

Intercambio de aprovisionamiento en una instancia de nube existente

Para las instancias existentes, un archivo de intercambio suele ser el método más fácil para activar la memoria de intercambio. En este ejemplo, coloque un archivo de intercambio de 2 GB en /swapfile:


# BTRFS only #################################################################
# We must disable copy-on-write updates for swap files on btrfs file systems.
# The 'swapon' step fails if you skip these steps.
truncate -s 0 /swapfile
chattr +C /swapfile
# BTRFS only #################################################################

# A 2 GiB swap file.
dd if=/dev/zero of=/swapfile bs=1MiB count=2048

# Set the correct permissions on the swap file.
chmod 0600 /swapfile

# Format the swapfile.
mkswap /swapfile

# Enable the swapfile.
swapon /swapfile

# Add it to /etc/fstab to enable it after reboot.
echo "/swapfile none swap defaults 0 0" >> /etc/fstab

Compruebe si su memoria de intercambio está lista:

$ cat /proc/swaps
Filename        Type    Size      Used    Priority
/swapfile       file    2097148   0       -2

Conclusión

La memoria de intercambio ofrece dos valiosas ventajas:

  • Un colchón de seguridad cuando el uso de RAM del sistema aumenta a niveles inseguros
  • Estacionamiento para páginas de memoria de uso poco frecuente que ocupan un espacio valioso en la memoria RAM del sistema

Con este colchón de seguridad se reduce el rendimiento, ya que la paginación de memoria en los discos es increíblemente lenta en comparación con la memoria del sistema.

Las implementaciones en la nube rara vez ven la memoria de intercambio implementada, pero el intercambio siempre tiene beneficios. La elección de implementar el intercambio ayuda a crear un colchón de seguridad cuando las aplicaciones se comportan mal, pero puede ralentizar el rendimiento de una aplicación hasta que se resuelvan los problemas de consumo de memoria. Omitir el intercambio elimina el colchón, pero asegura que una aplicación que se comporta mal se detenga de inmediato. Los administradores de la nube deben tener un plan para manejar estas situaciones.

Afortunadamente, cloud-init aparece en la gran mayoría de las instancias de la nube y permite la creación de archivos de paginación con solo unas pocas líneas de YAML. La memoria de intercambio también es fácil de configurar después de la implementación mediante comandos de shell o scripts simples.

Ya sea que elija implementar la memoria de intercambio o prescindir de ella, asegúrese de tener un plan para cuando suceda lo peor. Supervise los sistemas de forma adecuada y mantenga una visión holística de la aplicación a la que sirven.

Artículos de interés

Subir