Tuning Solaris: Memoria swap

Por definición, podemos decir que el área de swap consiste en una zona de memoria secundaria, que el sistema utilizará para almacenar las páginas ocupadas, en memoria principal, por un proceso, una vez que el Kernel decide que dicho proceso debe ser sacado de la memoria. Normalmente esta situación, se debe a un problema con la cantidad de memoria libre en el sistema.
En este artículo, además de realizar una pequeña introducción al área de swap en Solaris, veremos cómo podemos administrar dicha área y analizaremos cómo el gestor de memoria de Solaris ha modificado una de las reglas históricas en la asignación de swap, la regla dice que:
“El tamaño del área de swap debe ser el doble de la cantidad de memoria física de la máquina.”
Esta regla se basaba en la forma que tenían los sistemas Unix de asignar el área de swap a los procesos, cada vez que un proceso reservaba memoria, el sistema debía reservar el mismo espacio en el área de swap, por esta razón se generalizó el uso de la regla del doble de la memoria física. Solaris gestiona la asignación de espacio en el área de swap de una forma diferente. La regla que podemos aplicar para decidir cuanto espacio de memoria secundaria debemos asignar al área de swap en Solaris sería:
“El espacio total del área de swap será igual al tamaño de la memoria que necesite el proceso.”
Esta regla puede parecer algo confusa, frente a la sencillez de la regla del doble de la memoria, pero vamos a intentar explicarla. El sistema de memoria virtual (VM) de Solaris utiliza una nueva capa, denominada swapfs, que consiste en un sistema de archivos que gestiona el área de swap, de tal forma que en el área de swap únicamente se ocupará espacio cuando el sistema lo necesite y no cada vez que un proceso realice una petición de memoria.
swapfs
El VM de Solaris no utiliza el viejo método de asignar espacio en el área de swap cada vez que un proceso realice una reserva de memoria, sino que dispone de una capa intermedia que se encarga de gestionar el espacio de swap, esta capa se conoce con el nombre de swapfs. Cuando un proceso solicita una cantidad de memoria, supongamos que mediante la llamada malloc() realiza una petición de 16K, esto significa que el sistema reservará 2 páginas de memoria (suponiendo que el tamaño de la página sea de 8K), estas nuevas páginas deben tener asignadas a un vnode, como el resto de páginas de memoria, estas nuevas páginas son páginas anónimas por lo que el vnode debe ser el área de swap. El Kernel
utiliza la capa de swapfs para gestionar la asignación de los vnodes a las nuevas páginas anónimas que se creen, mientras una página que ha sido solicitada no sea necesario llevarla al área de swap, no tendrá asignado ningún espacio en dicho área.
Algo que debemos tener claro para entender cómo funciona swapfs es lo siguiente, swapfs trabaja con un espacio virtual de swap el cual está compuesto por el espacio físico de swap, es decir, todos los discos o ficheros que se hayan asignado al espacio de swap, mas toda la memoria física del sistema que pueda ser paginable. Es decir swapfs además de utilizar los ficheros o discos que hayamos asignado al área de swap, también utilizará toda la memoria disponible en el sistema.
Espacio virtual de swap = Espácio de swap + Memoria física
Cuando un proceso solicita memoria al kernel, por ejemplo con la llamada malloc(), se reserva suficiente espacio del área de swap para que todas las página anónimas que componen el proceso, puedan ser almacenadas en disco, pero hemos dicho reservado no asignado, esta diferencia se debe a la forma en la que el swapfs designa el estado de un área de memoria:
Reservada, un proceso solicita un espacio en el área de swap, la capa de swapfs le reserva dicho espacio.
Asignada, cuando se hace referencia a una página del espacio reservado, dicha página se asigna al área del swap física.
Swapeada, la página es pasada al almacenamiento asignado al área de swap.
La diferencia estriba en que mientras reservar es sencillamente eso, realizar una reserva, pero sin utilizar el espacio que se ha reservado, a una página se le asigna un espacio de swap la primera vez que es referenciada, de esta forma, aquellas páginas que nunca serán utilizadas no tendrán asignado espacio en el área de swap. Por ejemplo, supongamos un proceso que solicita 4MB de memoria, es poco probable que el proceso vaya a trabajar en los siguientes ciclos de reloj con todas las páginas, entonces ¿por qué asignar espacio de swap cuando puede que otro proceso necesite dicho espacio?. Con swapfs un sistema Solaris, con la suficiente memoria, podría correr sin área de swap.
Una vez que hemos visto, muy por encima, en qué consiste la capa de swapfs, vamos a poner un ejemplo para explicar la regla de:
“El espacio total del área de swap será igual al tamaño de la memoria que necesite el proceso.”
Ahora sabemos que cuando un proceso necesita memoria, el sistema no asigna toda esa memoria en la swap, entonces ¿ cual debe ser el tamaño del área de swap ?, la respuesta la obtendremos de las necesidades de memoria de las aplicaciones que corren en nuestro sistema, por ejemplo, supongamos una aplicación cuyo fabricante recomienda que se ejecute en sistemas con 6GB, nosotros solo disponemos de 4GB, con un área de swap de 2GB tendríamos un espacio virtual de swap suficiente para garantizar que la aplicación podrá ejecutarse. Por supuesto, que este ejemplo es extraordinariamente sencillo, pero ilustra cual sería la regla a seguir para definir el tamaño de la swap.
Las necesidades de memoria de todos los procesos = Espacio virtual de swap
Por lo tanto
Toda la memoria que van a necesitar todos los procesos = Memoria física + Área de swap.
Trabajar con el área de swap
Una de las primeras cosas que vamos a ver, es la forma en la que podemos conocer el estado actual de nuestra área de swap, utilizaremos el comando swap con la opción -s. El comando nos devolverá un resumen del uso actual del área de swap.

(root@camtrunet)# swap -s
total: 552696k bytes allocated + 580744k reserved = 1133440k used, 2310312k available
(root@camtrunet)#
En la salida del comando swap podemos ver que tenemos 552696k del área asignados y 580744k reservados, lo cual significa que en nuestra actual área de swap estamos usando 1133440k y quedan libres 2310312k. También podemos utilizar el comando vmstat, el cual dispone de una columna que nos informa de la cantidad de memoria libre en el área de swap.

(root@camtrunet)# vmstat 1 3
kthr memory page disk faults cpu
r b w swap free re mf pi po fr de sr s0 s1 s3 -- in sy cs us sy id
0 0 0 2653632 805808 41 269 6 4 4 0 0 0 0 0 0 95 170 443 4 2 94
0 1 0 2310168 868680 157 552 0 0 0 0 0 0 0 0 0 328 1083 455 0 1 99
0 1 0 2310168 868680 1 9 0 0 0 0 0 0 0 0 0 337 274 431 0 0 100
(root@camtrunet)#
El propio comando swap lo podemos utilizar, tanto para añadir mas espacio al área de swap, como para reducir dicho espacio. Como sabemos el área de swap está formada por discos o/y ficheros, con la opción -l del comando swap podemos ver cuales son los discos o ficheros que forman el área.

(root@camtrunet)# swap -l
swapfile dev swaplo blocks free
/dev/vx/dsk/bootdg/swapvol 273,78002 16 4172144 1783072
(root@camtrunet)#
Aumentar el área de swap
Vamos a suponer que el espacio en el área de swap comienza a disminuir rápidamente, lo que puede provocar un problema en la paginación del sistema y una reducción del rendimiento en la ejecución de algunas de las aplicaciones.

(root@camtrunet)# vmstat 5
kthr memory page disk faults cpu
r b w swap free re mf pi po fr de sr s0 s1 s3 -- in sy cs us sy id
0 0 0 2653512 805784 41 269 6 4 4 0 0 0 0 0 0 95 171 443 4 2 94
0 1 0 2392048 1461976 80 397 0 0 0 0 0 0 0 0 0 333 837 436 0 1 99
0 1 0 2382992 1452064 107 2821 2 8 6 0 0 0 0 0 0 351 3855 457 8 7 85
0 1 0 1959280 1029656 93 11050 0 11 11 0 0 0 0 0 0 368 1507 408 3 26 72
0 1 0 1642704 714104 11014 13299 26 6 6 0 0 0 0 0 0 353 1905 419 3 28 69
0 1 0 1368048 441832 25 321 67 10 10 0 0 0 0 0 0 431 586 460 0 2 98
0 1 0 1188064 257952 170 11333 391 399 399 0 2586 0 0 0 0 550 2195 477 5 35 60
0 2 0 868672 98288 109 2532 859 44752 44928 0 36104 0 0 0 0 4042 1891 923 4 19 77
0 7 0 469832 238696 28 3491 41 55399 55578 0 28076 0 0 0 0 2818 736 589 1 19 80
0 2 0 344840 711672 25 153 287 11 11 0 0 0 0 0 0 550 495 468 0 1 98
0 1 0 344904 711568 31 161 2 11 11 0 0 0 0 0 0 350 450 413 0 1 99
Como podemos ver en la salida de vmstat, se ha producido un decremento en la cantidad de swap libre en el sistema, esto ha provocado que la cantidad de memoria física se reduzca y una gran actividad en la paginación que podemos ver por las columnas pi y po.
En sistemas que utilizan espacio de swap para el directorio /tmp, la disminución de la cantidad de espacio libre en el área de swap, se debe normalmente, a que o bien un proceso o bien un usuario está escribiendo datos en dicho directorio, por lo tanto, es importante comprobar si alguien está haciendo uso del directorio /tmp.
Estamos en un punto donde el espacio libre de swap está decreciendo, por lo tanto debemos añadir de forma rápida más espacio, para ello crearemos un fichero vacío, en uno de los filesystem que tenga más espacio libre y asignaremos dicho fichero al área de swap. Debemos crear un fichero con el comando mkfile, el fichero será de 2GB.

(root@camtrunet)# mkfile -v 2g /export/home/jjmora/swap_file_01
/export/home/jjmora/swap_file_01 2147483648 bytes


(root@camtrunet)# swap -a /export/home/jjmora/swap_file_01

Ya se hemos creado el fichero de 2GB y lo hemos asignado al área de swap utilizando el comando swap -a, ahora vamos a comprobar como el área de swap ha aumentado su tamaño.

(root@camtrunet)# swap -l
swapfile dev swaplo blocks free
/dev/vx/dsk/bootdg/swapvol 273,78002 16 4172144 1237664
/export/home/jjmora/swap_file_01 - 16 4194288 4194288


(root@camtrunet)# swap -s
total: 2584088k bytes allocated + 68696k reserved = 2652784k used, 2951664k available

(root@camtrunet)# vmstat 1 3
kthr memory page disk faults cpu
r b w swap free re mf pi po fr de sr s0 s1 s3 -- in sy cs us sy id
0 0 0 2653304 805784 41 269 6 4 4 0 0 0 0 0 0 95 171 443 4 2 94
0 1 0 2951488 828032 45 375 0 0 0 0 0 0 0 0 0 336 774 459 0 1 99
0 1 0 2951488 828032 0 0 0 0 0 0 0 0 0 0 0 672 255 435 0 3 97

Podemos comprobar con el comando swap -l que el área de swap dispone de un nuevo fichero, con el comando swap -s podemos ver que el espacio disponible ha aumentado en 2GB, también podemos ver dicho aumento en la salida del comando vmstat 1 3, comparando la columna de swap con la que hemos obtenido anteriormente.
Reduciendo el área de swap
Una vez que el problema con la cantidad de memoria asignada en el área de swap haya terminado, podríamos liberar los ficheros o discos que hayamos utilizado, para esto, emplearemos el comando swap con el parámetro -d.

(root@camtrunet)# vmstat 1 3
kthr memory page disk faults cpu
r b w swap free re mf pi po fr de sr s0 s1 s3 -- in sy cs us sy id
0 0 0 2653320 805784 41 269 6 4 4 0 0 0 0 0 0 95 171 443 4 2 94
0 1 0 4487088 1313792 45 375 0 0 0 0 0 0 0 0 0 320 742 439 0 1 99
0 1 0 4487088 1313792 112 927 0 0 0 0 0 0 0 0 0 341 6003 449 14 2 84

(root@camtrunet)# swap -d /export/home/jjmora/swap_file_01

(root@camtrunet)# swap -l
swapfile dev swaplo blocks free
/dev/vx/dsk/bootdg/swapvol 273,78002 16 4172144 3334080

(root@camtrunet)# swap -s
total: 1048160k bytes allocated + 68632k reserved = 1116792k used, 2390072k available

(root@camtrunet)# vmstat 1 3
kthr memory page disk faults cpu
r b w swap free re mf pi po fr de sr s0 s1 s3 -- in sy cs us sy id
0 0 0 2653328 805792 41 269 6 4 4 0 0 0 0 0 0 95 171 443 4 2 94
0 1 0 2389976 1313808 44 375 0 8 8 0 0 0 0 0 0 328 734 435 0 1 99
0 1 0 2389976 1313816 81 707 0 8 8 0 0 0 0 0 0 334 3359 432 7 2 91
(root@camtrunet)#
En la salida del primer comando vmstat, el espacio libre de swap ha aumentado, con el comando swap -d eliminamos el fichero que hemos añadido anteriormente al área de swap. Tanto con swap -s como con vmstat, podemos comprobar que el área de swap ha vuelto a tener su tamaño original.
swapinfo de MDB
Ya hemos visto los comandos que podemos encontrar en el sistema para trabajar con el área de swap, ahora vamos a ver de forma rápida, cómo podemos emplear el debugger MDB para ver el estado del área de swap. MDB dispone de un comando específico para el área de swap, ::swapinfo.

(root@camtrunet)# mdb -k
Loading modules: [ unix krtld genunix ip s1394 usba ipc random nfs ptm cpc logindmux
md sppp wrsmd nca ]
> ::swapinfo
ADDR VNODE PAGES FREE NAME
00000300000698f8 30001c37080 260759 208380 /dev/vx/dsk/bootdg/swapvol
>
El comando nos devuelve la dirección de la estructura de datos de tipo struct swapinfo, esta estructura de datos está definida en el fichero de cabecera /usr/include/sys/swap.h. El comando devuelve una línea por cada fichero o disco que formen el área de swap.

>
> 00000300000698f8::print "struct swapinfo"
{
si_soff = 0x2000
si_eoff = 0x7f530000
si_vp = 0x30001c37080
si_next = 0
si_allocs = 0x10
si_flags = 0
si_npgs = 0x3fa97
si_nfpgs = 0x32dfc
si_pnamelen = 0x1b
si_pname = 0x30001ed3600 "/dev/vx/dsk/bootdg/swapvol"
si_mapsize = 0x7f54
si_swapslots = 0x300031c0000
si_hint = 0x17899
si_checkcnt = 0x5648
si_alloccnt = 0x4e107
}
>

Comentarios

Entradas populares de este blog

Comandos Solaris

MikroTik QoS Script generator

Comando para eliminar saltos de linea en fichero o archivo desde consola Linux