Capitulo 7. Administracin de Memoria

En esta seccin se describen las caracteristicas de la administracin de memoria
en Linux, ej., la memoria virtual y el cache en disco. El propsito, la forma de
trabajar y las consideraciones que deber tomar el administrador del sistema son
descriptas en este captulo.

7.1 Que es la memoria virtual?

Linux soporta las caracteristicas de "Memoria Virtual". Esto significa usar un
disco como una extensin de la memoria RAM, de forma tal que el tamao efectivo
de memoria utilizable crezca considerablemente. El kernel se encarga de escribir
el contenido de un bloque de memoria que no est siendo utilizado al disco
rgido de forma que esta porcin de memoria quede disponible para otro
propsito. Cuando los bloques originales vuelven a ser requeridos, son leidos y
colocados nuevamente en memoria. Todo esto es realizado en forma completamente
transparente para el usuario. Los programas ejecutados bajo linux solo ven una
gran cantidad de memoria disponible y no saben que parte de ellos reside en el
disco en un momento dado.  Por supuesto que leer y escribir en el disco es mucho
mas lento que utilizar la memoria real (en el orden de 1000 veces mas lento),
Por lo que los programas se tornan mucho mas lento tambien. La parte del disco
que es usado como memoria virtual se llama area de swap (swap space)

Linux puede utilizar tanto un archivo normal en el sistema de archivos como una
particin separada del disco como area de swap. Una particin swap es mucho mas
rpida, pero es mucho mas fcil cambiar el tamao del area de swap si este es un
archivo (y no hay necesidad de reparticinar el disco rgido entero, y
posiblemente instalar todo desde cero). Cuando se conoce la cantidad de espacio
swap que se necesita, es ms indicado optar por una particin swap. Pero si no
se est seguro de la cantidad de espacio que se necesita, se puede crear primero
un archivo swap, probar el sistema hasta que se est seguro del tamao
necesario, y luego construir una particin con dicho tamao.

Cabe sealar que linux permite tambin usar una o varias perticiones de swap y/o
archivos de swap al mismo tiempo. Esto significa que si ocasionalemte se
necesita una cantidad adicional de espacio swap, se puede crear un archivo de
swap extra para ese momento especial, en lugar de mantener una particin con
todo ese espacio necesario en forma permanente.

Una nota sobre la terminologa en Sistema Operativo: La ciencia de la
computacin distingue habitualmente entre la palabra swapeado o
"swaping"(escribir el proceso entero al area de swap) y paginado (escribir solo
porciones fijas de memoria, generalmente unos pocos kilobytes, por vez). El
paginado generalmente es mas eficiente y es lo que hace Linux, aunque de todos
modos se hable en la terminologia linux de Swapeo o "swaping"

7.2 Creando un espacio swap

Un archivo de swap es un archivo comun, y no necesita ningun tratamiento
especial para el kernel. Lo nico que le interesa al kernel es que este no tenga
huecos y que est preparado para ser utilizado por el utilitario mkswap. Este
debe residir en un disco local, y no puede residir en un disco montado a travs
de NFS por razones de implementacin.

El bit que indica espacios vacios es importante. El archivo swap reserva espacio
en disco de forma que el kernel pueda swapear una pgina rpidamente sin tener
que atravesar por todas las cosas que son necesarias cuando aloca un sector de
disco para un archivo. El kernel simplemente utiliza cualquier sector que ya
haya sido alocado para el archivo. Debido a que un hueco en un archivo significa
que no hay sectores de discos alocados (para ubicar en ese archivo) no es bueno
que el kernel trate de hacer uso del mismo.

Una buena manera de crear un archivo de swap sin espacios vacios es a travs del
siguiente comando:

+------------------------------------------------------------------------------+
| 	$ dd if=/dev/zero of=/extra-swap bs=1024                               |
| 	count=1024                                                             |
| 	1024+0 records in                                                      |
| 	1024+0 records out                                                     |
| 	$                                                                      |
|                                                                              |
+------------------------------------------------------------------------------+

donde /extra-swap es el nombre del archivo swap y el tamao est dado por el
parametro count=. El tamao ms indicado est dado por un mltiplo de 4, debido
a que el kernel escribe paginas de memorias de 4 kb de tamao. Si el tamao no
es mltiplo de 4 los ltimos kilobytes del archivo pueden ser desperdiciados.

Una particin swap tampoco tiene nada especial. Estas se crean como cualquier
otra particin, la nica diferencia es que sta es accedida de manera directa
(al disco crudo), esto significa, que no contiene ningun sistema de archivos. Es
aconsejable marcar esta particin del tipo 82 (Linux Swap); Esto hace la lista
de particines mas clara, aunque no es estrictamente necesario para el kernel.

Una vez creado el archivo o la particin de swap, es necesario escribir unas
marcas al comienzo del mismo que contienen informacion administrativas
utilizadas por el kernel. El comando para realizar esto es mkswap, y la forma es
la siguiente:

+------------------------------------------------------------------------------+
| 	$ mkswap /extra-swap 1024                                              |
| 	Setting up swapspace, size = 1044480                                   |
| 	bytes                                                                  |
|       $                                                                      |
|                                                                              |
+------------------------------------------------------------------------------+

Ntese que el espacio swap aun no es usado, este existe, pero el kernel aun no
hace uso de este para proveer memoria virual.

Se deber ser muy cuidadoso cuando se usa el comando mkswap, ya que este no
chequea que el archivo o la particin no estn siendo usados por alguien ms. Se
puede facilmente sobre escribir importantes archivos y particines con mkswap!
Por suerte este comando solo deberia ser necesario cuando se instala el sistema.

El administrado de memoria Linux limita el tamao de cada rea de swap a 2 GB.
De todas maneras se puede usar hasta 8 espacios de swap simultaneamente,
lograndose un total de 16 GB.


7.3 Usando un rea de swap

El rea de swap es activada con el comando swapon. Este comando le informa al
kernel que el espacio de swap ya puede ser utilizado. La ruta del rea de swap
es pasada como argumento, por lo tanto para comenzar a paginar sobre un archivo
de swap temporario, se podria ejecutar el comando de la siguiente forma:

+------------------------------------------------------------------------------+
|	$ swapon /extra-swap                                                   |
|	$                                                                      |
+------------------------------------------------------------------------------+

Las reas de swap pueden ser utilizadas automaticamente, incluyendo a ellas en
el archivo /etc/fstab:

+------------------------------------------------------------------------------+
|	/dev/hda8        none        swap        sw     0     0                |
|	/swapfile        none        swap        sw     0     0                |
+------------------------------------------------------------------------------+

Los scripts de arranques ejecutarn el comando swapon -a, el cual dar inicio al
proceso de paginacin de todos los espacios de swaps listados en el archivo
/etc/fstab, de otro modo el comando swapon es usualmente usado solo cuando un
espacio extra de swap es necesario.

Puede ser monitoreado el uso del area de swap con el comando free. ste indicar
el tamao total de espacio swap utiliado.

+------------------------------------------------------------------------------+
|	$ free                                                                 |
| 			total       used       free     shared                 |
| 	buffers                                                                |
|	Mem:     	15152      14896        256      12404       2528      |
|	-/+ buffers: 	           12368       2784                            |
|	Swap:   	32452       6684      25768                            |
|	$                                                                      |
+------------------------------------------------------------------------------+

La primera linea de la salida (Mem:) muestra la memoria fsica. La columna
"total" muestra la memoria fsica usada por el kernel, el cual usualmente est
cerca de un megabyte. La columna "used" muestra el tamao de memoria usado. La
columna "free" muestra la cantidad de memoria que no est siendo usada. La
columna "shared" muestra la cantidad de memoria que est siendo compartida entre
varios procesos; la mayor y la menor. La columna "buffer" muestra el tamao
actual del cache de buffer en disco.

La ltima linea (Swap:) muestra la misma informacin para el  espacio de swap.
Si esta linea son todos ceros, el espacio de swap no est activado.

La misma informacin est disponible a travz del comando top, o usando el
archivo /proc/meminfo del sistema de archivos proc. Este es en realidad dificil
de leer si se quiere informacin sobre el uso de una determinada area de swap.

Un rea de swap puede ser desactivada con el comando swapoff. Generalmente esto
no es necesario, excepto para las reas de swap temporales. Cualquier pgina que
estn haciendo uso del rea de swap, son llevadas primero a la memoria. Si no
hay suficiente memoria fsica para alojarlas, sern movidas entonces a otra rea
de swap. Si no hay suficiente memoria virtual para almacenar todas estas pginas
el sistema Linux sufrir una degradacin de desempeo, durante la cual estar
inestable durante un tiempo hasta que logre recuperarse. Por este motivo se
deber chequear (ej. con el cmd free) que haya suficiente memoria disponible
antes de remover un area de swap.

Todas las reas de swap que fueron activadas automaticamente con el comando
swapon -a pueden ser removidas con el comando swapoff -a; este busca en el
archivo /etc/fstab para encontrar cuales son las areas a remover. Cualquier
espacio de swap activado manualmente permanecer aun en uso.

En muchas ocasiones una gran porcin de espacio swap puede estar ocupado a pesar
de que hay una gran cantidad de memoria fsica libre. Esto suele ocurrir en
situaciones en la que fue necesario paginar una porcion de memoria al area de
swap, pero en otro instante un proceso que ocupa mucha memoria fsica finaliza y
libera dicha memoria. Los datos que estn en el area de swap no son llevados
automticamente a memoria hasta que esto no sea necesario, por lo tanto la
memoria puede seguir libre durante un largo tiempo. No hay motivos para
preocuparse por esta situacin pero es bueno saber que esto puede ocurrir.  

7.4 Compartiendo el area de swap con otro sistema operativo

La memoria virtual es una funcionalidad que est disponible en diversos sistemas
operativos. Cada uno de ellos necesita hacer uso de la memoria swap solo cuando
estn en ejecucn, o sea, nunca al mismo tiempo, ya que es imposible ejecutar
mas de un sistema operativo al mismo tiempo en la misma computadora. Una idea
muy eficiente seria compartir una nica area de swap. Esto es posible, pero
requiere un conocimiento ms avanzado. En la pgina http://www.tldp.org/HOWTO/
Tips-HOWTO.html, contiene algunas orientaciones sobre cmo implementar esto. 

7.5 Alocando espacio de swap.

Muchas personas consideran que se debe alocar el doble de memoria fsica para
espacio swap. Pero esta es una regla equivocada. Aqu se explica como se deber
estimar el tamao de swap correctamente:

  * Estimar el total de memoria necesaria. Esto es la mayor cantidad de
    memoria que se necesitar usar en un momento dado, y que estar dado por la
    suma de las memorias requeridas por todos los programas que se puedan
    ejecutar al mismo tiempo. Esto puede ser calculado ejecutando al mismo
    tiempo todos los programas que se utilicen habitualemte.  
        
    Por ejemplo, si se requiere ejecutar el servidor X, se deber alocar
    alrededor de 8 MB para este, gcc requiere algunos pocos megabytes (algunos
    archivos pueden necesitar una inusual cantidad de memoria, hasta 10 MB, pero
    generalmente alrededor de 4 megabytes deberia funcionar), y asi
    sucesivamente.  El kernel usar alrededor de un megabyte para si mismo, y un
    shell comn y otros pequeos utilitarios talvz unos pocos cientos de
    kilobytes (digamos un megabyte todos juntos). No es necesario que el clculo
    sea exacto, una estimacin aproximada estar bien,  pero es posible que se
    quiera hacer una estimacin pesimista poniendo todos los valores como
    mximos. 
        
    Recordar que si hay varios usarios usando el sistema al mismo tiempo,
    estaran todos consumiendo memoria. A pesar de esto si dos usuarios estan
    ejecutando el mismo programa al mismo tiempo, el total de memoria consumida
    no suele ser el doble, ya que cada pgina de cdigo y libreria compartida
    reside solo una vez en memoria.
    
    Los comandos free y ps son tiles para estimar la memoria necesaria.
    
  * Agregar un margen de seguridad a los estimado en el paso 1. Esto es
    porque el tamao estimado para los programas ser probablemente erroneo, ya
    que habrn algunos programas que se querran ejecutar, y seguramente no
    fueron tenidos en cuenta. Para salvar esto, se deber tener algn espacio
    extra. Un par de megabytes deber ser suficiente. (Es preferible alocar
    espacio de ms que de menos, pero no hay necesidad tampoco de sobrepasarse y
    alocar todo el disco entero, el espacio swap no usado es espacio malgastado;
    ver mas adelante a cerca de agregar mas swap). Tambien, es mejor tratar de
    que sea un nmero par, se podr redondear hacia arriba para llegar al
    prximo nmero entero de megabytes.
    
  * Basados en los clculos anteriores, se puede saber cuanta memoria se
    necesita en total. Por lo tanto, para alocar el espacio de swap, solo se
    necesita restar el tamao de memoria fsica del total de memoria necesaria.
    (En algunas versiones de Unix, se necesita alocar tanto espacio como para
    una imagen de la memoria fsica, entonces la cantidad calculada en el punto
    dos ser lo que se necesita, y no se deber realizar la resta)
    
  * Si el espacio calculado de swap es mucho mayor que la memoria fsica (Mas
    del doble), probablemente se deber invertir en ms memoria fsica, sino la
    performances del sistema ser muy lento.
    
Es una buena idea tener por lo menos un area de swap, an cuando los clculos
indiquen que no se necesita. Linux usa el espacio de swap en forma agresiva,
tanto, que trata de mantener la mayor cantidad de memoria fsica libre. Linux
swapear las pginas de memoria que no han sido usadas, aun si la memoria no es
solicitada por ningn proceso. Esto evita las esperas por swapeo cuando ella es
necesaria: El pasaje a swap puede ser hecho mucho ms facilmente cuando el disco
est desocupado.    

El espacio de swap puede ser dividido entre varios discos. Esto puede en algunas
ocasiones mejorar el rendimiento, dependiendo de las velocidades relativas de
los discos y del tipo de acceso. Se puede experimentar con algunos esquemas,
pero es importante tener en cuenta que hacer esto apropiademente puede ser muy
complejo. No se debe creer que un esquema puede ser mejor que otro, antes de
verificar su real aplicabilidad.

El Bufer Cache

La lectura desde el disco es mas lenta en comparacion con el acceso a memoria 
(real). Ademas, es comun leer la misma parte del disco varias veces durante 
periodos relativamente cortos de tiempo. Por ejemplo, uno podria leer primero 
un mensaje del correo electronico, despues leer la misma carta con un editor de 
texto cuando uno la esta respondiendo, y finalmente hacer que el programa la 
lea de nuevo cuando le indicamos copiarla a una carpeta. O, considere cuan 
seguido el comando "ls" es ejecutado en un sistema con muchos usuarios. Leyendo
la informacion del disco una sola vez y luego manteniendola en la memoria hasta
que no sea necesaria, puede acelerar todas las lecturas posteriores con 
respecto a
la primera. Esto es llamado "buffering" de disco, y la memoria usada para ese 
proposito es llamada "buffer cache".
 
Debido a que la memoria es, desafortunadamente finita, y por lo tanto,
un recurso 
escaso, el "buffer cache" usualmente no puede ser demasiado grande (no puede 
mantener todos los datos que uno siempre quiere usar).
Cuando la "cache" se completa, los datos que no han sido usados por un periodo 
de tiempo prolongado son descartados y asi la memoria es liberada para ser 
utilizada con nuevos datos.

El buffering de disco trabaja cuando existen escrituras tambin. Por un lado, 
los datos que son escritos son ledos nuevamente con mucha frecuencia (por ej.
el cdigo fuente de un programa es guardado a un archivo, y despus es ledo
por el compilador), entonces, colocar los datos que son escritos en la 
cach es una buena idea. Por otro lado, colocar los datos en la cach, sin 
escribirlos a disco inmediatamente, acelera al programa que los guarda. Las 
escrituras pueden ser realizadas en segundo plano, sin disminuir 
la velocidad de ejecucin de los otros programas.

La mayora de los sistemas operativos tienen "buffer cach" (aunque algunas 
veces son llamados de manera diferente), pero no todos funcionan de acuerdo 
a los mismos principios. Algunos son de escritura directa: los datos son
escritos a disco inmediatamente (y obviamente, son mantenidos en la cach).
Otros son de escritura posterior, ya que las escrituras son realizadas 
momentos despus. Escritura posterior es ms eficiente que escritura directa,
pero es ms susceptible a errores: si la mquina cae, el suministro 
elctrico es interrumpido en un mal momento, o un medio extrable es removido
sin ser desmontado, entonces usualmente los cambios realizados en la cach 
se pierden. Esta situacin puede significar que el sistema de archivos (si
existiese uno) no trabaje completamente bin, tal vez debido a que los datos 
que no pudieron ser escritos sean cambios importantes para el mantenimiento
del sistema.

Debido a esto, nunca deberia apagar el equipo sin emplear los procedimientos 
adecuados (ver Capitulo 8), como tampoco quitar un disco flexible de la unidad 
hasta que haya sido desmontado (si fue montado), o antes de que cualquier 
programa que esta haciendo uso del dispositivo no indique que ha terminado y, 
el "led" de la unidad de diskete ya no esta encendida. El comando "sync" 
descarga el buffer, por ejemplo, fuerza que los datos aun no grabados sean 
escritos al disco, y puede ser usado cuando uno quiere asegurarse que todas 
las escrituras se hayan realizado.En los sistemas UNIX tradicionales, hay un 
programa llamado update que esta 
ejecutandose en "segundo plano| modo silencioso?background", el cual se 
encarga de ejecutar el comando sync cada 30 segundos, por esto usualmente no 
es necesario usar sync. Linux tiene un demonio adicional, bdflush, el cual 
efectua un sync mas imperfecto, pero con mas frecuentemente para evitar el 
repentino congelamiento debido a la sobrecarga de I/O que algunas veces "sync" 
produce.

Bajo Linux, "bdflush" is iniciado por "update". No existen usualmente razones 
para preocuparse por bdflush, pero si bdflush 'muriera|terminase' por alguna 
causa, el kernel alertar sobre esto, por lo que debera iniciarlo a 
mano (/sbin/update).

La cach no realiza realmente bfer de archivos, pero s ** de bloques, los 
cuales son las unidades mas pequeas de E/S a disco (en Linux usualmente son de
1 kB). De esta manera, tambin los directorios, super bloques, otros datos 
relacionados con ** en el sistema de archivos, y discos sin sistema de archivos
son mantenidos en cach.

La eficacia de una cach es decidida principalmente por su tamao. Una cach 
pequea es casi inservible: tiene muy pocos datos, por lo que todos los datos
en la cach sern descartados antes de que sean reutilizados. El 
tamao crtico depende de la cantidad de datos escritos y ledos, y de cun 
frecuente los mismos datos son accedidos. La nica manera de saber el tamao 
til de una cach es experimentando.

Si la "cache" es de tamao fijo no es muy bueno que sea demasiado grande porque
eso podria hacer que la memoria libre sea demasiado pequea y ocasionar 
"swapping" (lo cual es tambien muy lento). Para hacer que el uso de la memoria
real sea mas eficiente, Linux usa automaticamente toda la memoria RAM como 
"buffer cache", pero tambien, automaticamente, disminuye el tamao de la 
"cache" a medida que los programas van necesitando mas memoria.
 
Bajo Linux, usted no necesita configurar nada para hacer utilizar "cache", esto
sucede de forma completamente automatica. A excepcion de los adecuados 
procedimientos a seguir para "cerrar?apagar?desconectar?bajar?deshabilitar" o 
quitar diskettes? usted no tiene necesidad de preocuparse por nada.

