Sobre la necesidad de la memoria Swap

27 de febrero de 2020


El caso que hoy me ocupa, nace de la necesidad de apagar la memoria de intercambio (o swap) en mi equipo portátil para poder gestionar varias pruebas sobre clústers de kubernetes. Algo curioso, pues ningún programa me había obligado nunca a apagar la swap para funcionar (ya sé que puedo configurar kubernetes para evitar esta obligación, pero no se trata de un artículo sobre cómo evadir esta opción, sino de la memoria swap en sí). A raíz de este hecho, han avivado en mi memoria las viejas discusiones sobre la necesidad, o no, de la memoria de intercambio.

Allá por el 2008, Russell Coker discutía sobre el uso de memoria swap que se daba en sistemas Unix, asegurando que la 'tradición' de utilizar el doble de swap que de RAM era obsoleto con las memorias de entonces (imagínese las actuales), llegando a la conclusión de que el tamaño más adecuado es el mismo que el tamaño de la memoria RAM siempre que ésta sea inferior a 1GB; la mitad del tamaño de la RAM cuando ésta tenga un tamaño de entre 2GB y 4GB; y 2GB de swap cuando el tamaño de la RAM sea mayor de 4GB. Coker además dudaría que exista ningún sistema de almacenamiento masivo que pueda manejar la carga de más de 2GB de espacio de intercambio en uso activo.

¿Es necesaria la swap? La pregunta nace debido a que, por otro lado, hay quien defiende que hoy en día, con módulos de memoria baratos y de tal almacenamiento (tenga en cuenta que en mi equipo portátil tengo un almacenamiento de 32GB RAM), y debido al hecho de que el propio uso de memoria de intercambio supone una caída importante de rendimiento, la swap estaría obsoleta. También influye la idea de que, debe ser preferible tener suficiente RAM para evitar que llegue a sobrecargarse nunca y a necesitar espacio adicional, quedando éste relegado para máquinas con poca RAM o equipos antiguos.

Al respecto, Martin Pool aseveraba en 2004, que cuando el sistema empieza a quedarse sin memoria, el núcleo escogerá qué páginas pasan al disco, siendo normalmente las que se usan con menor frecuencia. Si una página escogida es 'no anónima' 1 siempre existe un archivo que sirve de respaldo al contenido de la página, por lo que puede ser recuperada fácilmente en el caso de que volvamos a necesitarla. Pero las páginas anónimas carecen de dicho respaldo, por lo que solo pueden ser salvadas y copiadas en la swap. Sin embargo, si no tenemos suficiente memoria, el memoria no podrá escoger páginas 'no anónimas' para liberarla, obligando al sistema a ganar memoria a costa de páginas 'no anónimas', aunque éstas estén siendo utilizadas en mayor medida que las anónimas, afectando al rendimiento del sistema. «Disk is cheap, so allocate a gigabyte or two for swap».

Evidentemente, es necesario tener en cuenta, a parte del rendimiento, la seguridad. Existen circunstancias imprevisibles que pueden suceder, como que una acción requiera mucho más espacio del esperado, que un programa se vuelva loco (algo muy común si programamos), etc.

Por lo tanto, concluimos que la swap no está obsoleta. Pero, ¿cuánta swap debo reservar en mi sistema?. Como ya he comentado anteriormente, la memoria de Coker se ha convertido en prácticamente una regla. Para equipos con 8GB o 16GB emplear 2GB de swap es correcto, pero, ¿lo sigue siendo para equipos con 32GB, 64GB o 256GB de RAM? 2GB se antoja poco, aparentemente.

Por ello, Canonical propone que a partir de 4GB se haga la raíz cuadrada del tamaño de la RAM, redondeada al entero más cercano; así, a 6GB de RAM le corresponderían 2GB de swap, mientras que a 32GB le corresponderían 6GB o a 256GB, 16GB. Por su parte, Red Hat se asemeja más a la memoria de Coker, pero siendo más generoso con equipos con menos de 8GB de RAM; siendo el doble de swap para menos de 2GB, el mismo tamaño para equipos de entre 2GB y 8GB, y la mitad para equipos de entre 8GB y 64GB.

Estas recomendaciones son correctas, especialmente para servidores y sistemas eficientes. Sin embargo, tenemos que tener en cuenta que para sistemas de escritorio (y más aún en equipos portátiles), mantener un espacio de intercambio superior al tamaño de la RAM es elemental para la hibernación 2. En este caso, conviene tener una swap lo suficientemente grande como para mantener el uso normal de intercambio. En ese caso, deberemos aplicar alguna de las reglas anteriores y sumarle el tamaño de la RAM.

Personalmente, tanto las memorias de Coker como de RedHat me resultan algo 'cortas' cuando se trata de equipos con elevada RAM, algo realmente aplicable a prácticamente cualquier servidor o equipo de escritorio actual (no entramos en sistemas embebidos, cuya RAM es más limitada). La memoria de Canonical me parece la más generalizable y aplicable en el amplio espectro de posibilidades, y es, desde hace un par de años, la metodología que vengo aplicando en sustitución a la memoria de Coker, que usaba antes.

Así, y a modo de chuleta, quedaría así mi metodología empleada:

RAM     Swap    Swap+Hib        RAM     Swap    Swap+Hib        RAM     Swap    Swap+Hib  
256MB   256MB   512MB           6GB     2GB     8GB             32GB    6GB     38GB  
512MB   512MB   1GB             8GB     3GB     11GB            64GB    8GB     72GB 
1GB     1GB     2GB             12GB    3GB     15GB            128GB   12GB    140GB   
2GB     1GB     3GB             16GB    4GB     20GB            256GB   16GB    272GB
4GB     2GB     6GB             24GB    5GB     29GB            512GB   22GB    534GB

1 Una página anónima es aquella que no corresponde con ningún archivo en disco. Eso incluye la pila, el montón o la memoria reservada dinámicamente con malloc().

2 La hibernación, o suspensión en disco, consiste en apagar un ordenador conservando su estado, hecho que se logra volcando el contenido de la memoria RAM en la partición de memoria swap, que después se restaura.


You'll only receive email when they publish something new.

More from Francés d'Avallon
All posts