Sobre la necesidad de la memoria Swap
March 7, 2026•960 words
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.