martes, 11 de diciembre de 2007

Todo sobre el espacio SWAP en Linux

Cuando tu computadora necesita correr aplicaciones que son mas pesados que tu capacidad de memoria física instalada, los sistemas operativos mas modernos usan una tecnología llamada swapping, en la cual trozos de memoria son temporalmente almacenados en el disco duro mientras que la otra data es movida hacia el espacio de la memoria física Aquí hay algunas técnicas que te pueden ayudar a administrar mejor el swapping en los sistemas Linux y obtener el mejor performance del subsistema swapping de Linux.

Linux divide su memoria RAM en trozos de memoria llamados pages (paginas). Swapping es el proceso en el cual un page de memoria es copiado en el espacio del disco duro preconfigurado, llamado espacio o partición swap, para liberar ese page de memoria. El tamaño combinado de la memoria RAM y la partición swap es la cantidad memoria virtual disponible.

Swapping es necesario por dos importantes razones. Primero, cuando el sistema necesita mas memoria que la RAM es disponible, el kernel intercambia las pages usadas y proporciona mas memoria a la aplicación (proceso) que lo necesita inmediatamente. Segundo, un significante números de pages usadas por una aplicación durante su fase de inicio puede ser solo usada para la inicialización y luego no usada otra vez. El sistema puede intercambiar aquellas pages y liberar la memoria para otra aplicación o incluso para la cache de disco.

Como sea, swapping tiene una desventaja. Comparado a la memoria, el disco es muy lento. La velocidad de la memoria puede ser medida en nanosegundos, mientras que la del disco es medida en milisegundos, por eso acceder al disco puede ser diez veces mas lento que acceder a la memoria física.

Linux tiene dos formas de intercambiar (swap) espacio:
La partición swap y el archivo swap. La partición swap es una sección independiente del disco duro usada únicamente para intercambio. ningún otro archivo puede residir ahí El archivo swap es un archivo especial en el fichero del sistema (filesystems) que reside entre tu sistema y los archivos de datos.
Para ver cuanto espacio de intercambio tienes, usa el comando swapon -s
La salida deberá ser algo así:
Filename Type Size Used Priority
/dev/sda4 partition 1405676 35948 -1

Cada linea lista un espacio swap diferente que esta siendo usado por el sistema. Aquí el campo Tipo (Type) indica que este espacio swap es una partición en vez de un archivo y el campo Filename muestra que esta en el disco sda4. El tamaño (Size) esta mostrado en kilobytes, y el campo Used muestra cuantos kilobytes de espacio swap esta siendo usado. El campo Priority le indica a Linux cual es el espacio que debe ser usado primero. Una de las grandes ventajas del swapping en subsistemas Linux es que si montas dos o mas espacios swap (de preferencia en dos dispositivos diferentes) con la misma prioridad, Linux intercalara su actividad de swapping entre ellos, lo cual puede incrementar la performance del swap.

Para agregar una partición swap extra en tu sistema, primero necesitas prepararlo. Paso uno aseguraste de tener una partición marcada como swap y paso dos es hacer el sistema de archivos swap. Para revisar que la partición este marcada para swap, ejecuta esto como swap:

fdisk -l /dev/hdb

Reemplaza /dev/hdb con el dispositivo del disco duro en tu sistema con la partición swap. Deberías ver algo así:

Device Boot    Start   End     Blocks  Id      System 
/dev/hdb1 2328 2434 859446 82 Linux swap / Solaris

Si la partición no esta marcada como swap necesitaras cambiarla usando el comando fdisk y la opción de menú 't'. Mucho cuidado cuando se trabaja con particiones ya que podríamos borrar por error alguna partición donde se encuentren nuestros datos tan preciados. Otra aclaración es que Solaris usa el mismo ID que Linux para sus particiones swap, así que cuidado de no borrar la partición Solaris por error.

Una vez que la partición es marcada como swap, necesitas prepararla usando el comando mkswap como root:

mkswap /dev/hdb1

Si no ves ningún error, tu espacio swap esta listo para usar. Para activarla, escribe esto:

swapon /dev/hdb1

Puede verificar si esta siendo usada ejecutando swapon -s. Para montar el espacio swap al momento de iniciar el sistema, debes agregar una linea al archivo /etc/fstab, el cual contiene la lista de los sistemas de archivos y espacio swap que se montaran al momento de iniciar el sistema. El formato para cada linea es:

Como el espacio swap es un tipo de archivo especial, varios de estos parámetros no son aplicables. Para el espacio swap agrega esto:

/dev/hdb1 none swap sw 0 0

Donde /dev/hdb1 es la partición swap. No tiene un punto de montaje especificado, por lo tanto es none. Es del tipo swap con opciones sw, los últimos dos parámetros no se usan por eso se ingresa 0.

Para verificar que tu partición swap ha sido montada sin necesidad de reiniciar tu PC, puedes ejecutar el comando:

swapoff -a ( el cual apaga todos los espacios swap)

y luego ejecutar:

swapon -a (el cual monta todos los espacios swap listados en el archivo /etc/fstab)

y luego revisar con el comando:

swapon -s

Archivo Swap

Así como la partición swap, Linux también soporta el archivo swap el cual tu puedes crear, preparar y montar de la misma forma como se hace con una partición swap. La ventaja del archivo swap es que no necesitas buscar por una partición vacía o reparticionar el disco para adicionar el espacio swap.

Para crear un archivo swap, usa el comando dd para crear un archivo vacío Para crear un archivo de 1Gb, escribe lo siguiente:

dd if=/dev/zero of=/swapfile bs=1024 count=1048576

/swapfile es el nombre del archivo swap, y count=1048576 es el tamaño en kilobytes.

Prepara el archivo swap usando mkswap como si fuera una partición, pero esta vez usa el nombre del archivo swap:

mkswap /swapfile

E igualmente montarlo usando el comando swapon:

swapon /swapfile.

El archivo /etc/fstab debería verse algo así:

/swapfile none swap sw 0 0

¿Que tan grande debe ser el espacio swap?

Es posible ejecutar un sistema Linux sin espacio swap, y correrá muy bien si es que tienes bastante memoria RAM, pero si no tienes mucha RAM el sistema se te colgara, por eso es recomendable tener espacio swap, especialmente desde que el espacio en disco se volvió relativamente barato.

Ahora la cuestión cuanto. Las versiones antiguas de Unix (como SUN OS y Ultrix) demandaban un espacio swap de 2 o 3 veces el tamaño de la RAM. Las implementaciones modernas (como Linux) no requieren de tanto, pero la pueden usar si es que esta configurado. Una regla que se puede seguir es la siguiente:

  1. Para un sistema de escritorio, usa un espacio de swap del doble de tu RAM.

  2. Para servidores se puede tener la mitad de la RAM, teniendo la posibilidad de aumentar el tamaño swap según se necesite. Siempre revisando la performance del sistema.

  3. Para computadoras viejas que las usaremos como escritorio y que tengan menos de 128 de RAM, usa todo lo posible, si puedes hasta 1Gb o mas.

EL kernel 2,6 de Linux agrego un nuevo parámetro para el kernel llamado swappiness, que permite a los administradores pellizcar la forma que Linux usa el espacio swap. Estos son números del 0 al 100. En esencia, valores altos para manejar mas pages que están siendo intercambiadas y valores bajos para mas aplicaciones mantenidas en la memoria, aun si están ocupadas.

El mantenedor del Kernel, Andrew Morton, ha dicho que correr maquinas de escritorios con swappiness de 100 no es tan necesario, es mejor liberar espacio en el disco para algo mas útil.

Por eso si deseas cambiar temporalmente el valor de swappiness, el cual es 60 por defecto puedes usar este comando:

echo 50 > /proc/sys/vm/swappiness

Si deseas cambiarlo permanentemente, cambia el parámetro vm.swappines del archivo /etc/sysctl.conf

Conclusión

Manejar el espacio swap es esencialmente una tarea del administrador. Con un buen planeamiento y uso apropiado del espacio swap puedes tener beneficios. No tengas miedo de experimentar, siempre monitorea tu sistema para asegurarte de que tienes los resultados que deseas.

Texto original en ingles aquí.




6 comentarios:

ミチャルド dijo...

Excelente Howto, me ilumino esta noche tan oscura..estaba perdido, pues buscaba aumentar la swap de mi ps3, esta info me sirvio d mucho, ya que la demas que habia encontrado era demasiada confusa

carlitos dijo...

Muchas gracias por el Howto. A mi se me presentaba el problema de que al visualizar mi swap decia que no se podia montar /dev/sda2 ya que no reconocia la UUID y lo que tuve que hacer fue ejecutar lo siguiente:
$sudo vol_id -u /dev/sda2
y pude comprobar que UUID escrita en /etc/fstab de mi particion era diferente, con solo corregirla y echando a andar nuevamente la swap (swapon -a) todo quedo perfecto

Bruno dijo...

Hola
me parecio genial esta explicacion de la swap, pero aun hay cosas q tengo dudas como por ejemplo, cuanto es una memoria RAM necesaria para un uso normal, yo tengo un procesador sempron 1.9 con dos gigas de ram, uso ubuntu 9.04, acabo de poner en el valor de swap 00 y definitivamente responde mas rapido q con 10 sin embargo el uso de mi cpu incremento a 50% y el uso de mi ram eta en 27% variando (logicamente), ahora esto quiere decir q la swap ya no se esta usando?
nota.- Cuando lo tenia en 60 igualmente solo funcionaba la ram y la swap seguia marcando cero.(estas referencia las obtengo de un screenlet, derrepente esta equivocada.
gracias

Daniel Cabrera dijo...

Según dicen en los sistemas de escritorio se debe poner el doble de espacio SWAP que tengas de RAM, osea si tienes 1 GB de RAM tu SWAP debería ser 2GB, pero también dicen que hasta 2Gb de SWAP es mas que suficiente.

Pero haces bien en ir midiendo el uso recursos de la PC y ver la cantidad que te permita tener un buen performance de tu sistema, porque al final es eso, que tu sistema trabaje optimamente.

Habrán programas que te exigirán mas del CPU y otros del RAM, anda probando hasta que tengas un buen rendimiento, pero yo me quedaría con 2GB de SWAP.

leonfloch dijo...

muchas gracias por la informacion, tengo un problema cuando ejecuto el comando: mkswap /swapfile me sale un mensaje de error: mkswap: command not found cual sera el problema?
gracias.

Daniel Cabrera dijo...

Hola leonfloch,

quizás podrías proporcionar un poco mas de información sobre el sistema operativo que usas y el shell que usas.