Rendimiento de Linux: Por qué debería añadir casi siempre espacio de intercambio

Sabemos que usar el espacio de intercambio de Linux en lugar de la RAM (memoria) puede ralentizar mucho el rendimiento. Entonces, uno podría preguntarse, ya que tengo más que suficiente memoria disponible, ¿no sería mejor eliminar el espacio de intercambio? La respuesta corta es, No. Hay beneficios de rendimiento cuando se habilita el espacio de intercambio, incluso cuando se tiene más que suficiente memoria RAM. Actualización, también vea la Parte 2: Rendimiento de Linux: Añada casi siempre Swap (ZRAM).

Incluso con una memoria de servidor más que adecuada instalada, a menudo encontrará que el espacio de swap se utilizará después de largos períodos de tiempo de actividad. Vea el siguiente ejemplo de un servidor de chat en vivo con alrededor de un mes de tiempo de actividad:

 total used free shared buff/cache availableMem: 3.7G 1.0G 445M 84M 2.2G 2.2GSwap: 1.8G 308M 1.5G

La salida de free -h aquí muestra 308M de espacio de intercambio utilizado. Cuando ejecuté las comprobaciones de intercambio, no había signos de actividad de E/S de intercambio en curso o inoportuna. Además, el servicio kswap no consumía mucho tiempo de CPU. De hecho, el proceso de kswap no se encontraba en ninguna parte del top (procesos principales ordenados por tiempo de CPU). Para confirmarlo, utilicé el siguiente comando:

ps -A | grep kswap 40 ? 00:00:29 kswapd0

…así que en este caso, como en muchos, el uso de swap no está perjudicando el rendimiento del servidor Linux. Ahora, veamos cómo el espacio de swap puede realmente ayudar al rendimiento del servidor Linux.

Actualización: Recientemente, instalé Manjoro i3 en mi Pinebook Pro. Ahora viene con ZRAM habilitada por defecto.

Ventajas del espacio de swap en sistemas con una RAM adecuada

servidor de más de 512GB - 2GB de swap utilizados

servidor de más de 512GB - 2GB de swap utilizados

Es normal y puede ser algo bueno que los sistemas Linux utilicen algo de swap, incluso si todavía hay RAM disponible. El Kernel de Linux moverá las páginas de memoria que casi nunca se usan al espacio de swap para asegurar que haya más espacio disponible en memoria para las páginas de memoria que se usan con más frecuencia (una página es un trozo de memoria). El uso de swap se convierte en un problema de rendimiento cuando el Kernel se ve presionado a mover continuamente páginas de memoria dentro y fuera del espacio de swap.

Otra ventaja es que el swap da a los administradores tiempo para reaccionar ante problemas de poca memoria. A menudo notaremos que el servidor actúa con lentitud y, al iniciar la sesión, nos daremos cuenta de que hay mucho swap. Sin swap (como se describe en la siguiente sección), quedarse sin memoria puede crear reacciones en cadena mucho más repentinas y graves. Así que, normalmente, aconsejaría configurar el espacio de swap a aproximadamente el tamaño de su proceso más grande. Por ejemplo, la memoria configurada de MySQL en my.cnf. Puede ser incluso más pequeño, especialmente si tiene monitorización y/o alertas en su lugar.

Algunos recomiendan no tener swap o un tamaño de swap ligeramente mayor que la RAM total. Si usted puede venir con razones válidas para esto, entonces que tal vez su elección. Sin embargo, esto no es el caso en los servidores, y en su lugar debe equilibrar su decisión con los efectos de swap tendrá en sus aplicaciones específicas. Swap no cambia la cantidad de RAM requerida para un servidor saludable, o para un escritorio. Está diseñado para complementar el rendimiento de los sistemas sanos.

Para resumir:
– Incluso si todavía hay RAM disponible, el Kernel de Linux moverá las páginas de memoria que apenas se utilizan al espacio de swap.
– Es mejor intercambiar las páginas de memoria que han estado inactivas durante un tiempo, manteniendo los datos de uso frecuente en la caché, y esto debería ocurrir cuando el servidor está más inactivo, que es el objetivo del Kernel.
– Evite configurar su espacio de intercambio demasiado grande si va a resultar en la prolongación de los problemas de rendimiento, cortes, o su tiempo de respuesta (sin monitoreo / alertas adecuadas).

Espacio de intercambio vs. No Swap cuando la memoria disponible es baja

A diferencia del caso anterior, si usted no tiene suficiente memoria, el intercambio se utilizará con bastante frecuencia y notablemente más durante cualquier pico de necesidad de memoria. Si no tiene suficiente memoria y no hay espacio de swap, a menudo se producirá un fallo en la asignación de memoria para las peticiones que necesiten más páginas de memoria. Como último recurso, el Kernel desplegará el OOM killer para eliminar los procesos de alta memoria (normalmente MySQL, java, etc.).

Para una visión más detallada del espacio de intercambio de Linux, lea los capítulos Swap Management y Page Frame Reclamation de los documentos de Kernel.org. También, mire la última sección, «Kernel cache pressure and swappiness,» de mi otra entrada del blog para consejos sobre el ajuste del uso del espacio swap de Linux por el Kernel. Si su espacio de intercambio «usado» es siempre ‘0’, entonces tiene una tonelada de RAM disponible, en cuyo caso puede ser seguro eliminar el espacio de intercambio… o puede ajustar la presión de la caché de su Kernel para hacer uso de aún más RAM.

Para resumir:
– La E/S de intercambio escala muy mal. Si las páginas de memoria no pueden ser intercambiadas sólo cuando el servidor está inactivo, debe afinar o deshabilitar el swap. Este no suele ser el caso, de ahí el título «casi siempre» de esta entrada del blog.
– Con el swap deshabilitado, los problemas de rendimiento se hacen notar muy rápido, ¡y el asesino OOM puede atraparte! 🙂

Para comparar, aquí está la salida de free usando una versión más antigua de free de procps-ng-3.3.1 en el mismo servidor:

 total used free shared buffers cachedMem: 3.7G 3.3G 445M 0B 4.2M 1.7G-/+ buffers/cache: 1.6G 2.1GSwap: 1.8G 308M 1.5G

Presión de la caché del núcleo y swappiness

Ahora que tiene swap habilitado. Considera ajustar la presión de la caché de tu servidor y la tendencia al swap (vm.swappiness) siguiendo la guía de abajo, que es del artículo anterior: ¿El servidor Linux necesita una actualización de RAM? Compruebe con top, free, vmstat y sar:

vfs_cache_pressure – Controla la tendencia del kernel a recuperar la memoria, que se utiliza para el almacenamiento en caché de los objetos de directorio e inodo. (por defecto = 100, se recomienda un valor de 50 a 200)

Swappiness – Este control se utiliza para definir la agresividad con la que el kernel intercambiará las páginas de memoria. Los valores más altos aumentarán la agresividad; los valores más bajos disminuyen la cantidad de swap. (por defecto = 60, valores recomendados entre 1 y 60) Elimine su swap para el valor 0, pero no se recomienda en la mayoría de los casos.

Para editar, puede añadir o reemplazar estas líneas en el archivo /etc/sysctl.conf. Por ejemplo, si tienes poca memoria hasta que te actualices, puedes probar algo como:

vm.swappiness=10vm.vfs_cache_pressure=200

Esto aumentará la presión de la caché, lo que puede parecer algo contraproducente ya que la caché es buena para el rendimiento. Sin embargo, el intercambio demasiado frecuente reduce el rendimiento general de su servidor significativamente más. Así que no mantener tanta caché en la memoria ayudará a reducir la actividad de swap. Además, con vm.swappiness establecido en 10 o tan bajo como 1, reducirá el intercambio de discos.

En un servidor saludable con mucha memoria disponible, utilice lo siguiente:

vm.swappiness=10vm.vfs_cache_pressure=50

Esto disminuirá la presión de la caché. Dado que el almacenamiento en caché es bueno para el rendimiento, queremos mantener los datos en caché en la memoria durante más tiempo. Since the cache will grow larger, we still want to reduce swapping to not cause increased swap I/O.

To check current values using these commands use:

sudo cat /proc/sys/vm/swappinesssudo cat /proc/sys/vm/vfs_cache_pressure

To enable these settings temporarily without rebooting, use the following commands:

sudo sysctl -w vm.swappiness=10sudo sysctl -w vm.vfs_cache_pressure=50