Swapeando voy, swapeando vengo

por | enero 11, 2018

Para ver el uso de swap global de nuestro sistema tenemos multitud de herramientas como vmstat, top, htop, atop, free, /proc/swaps, swapon -s, etc…

Si queremos entrar en más detalle, personalmente me gusta utilizar smem para obtener una lista de todos los procesos del sistema y su uso particular de swap ordenado de mayor a menor uso. Tan sencillo como lanzar:

smem -c "pid command swap" -k -r -t -s swap

Por ejemplo:

Además del uso de swap a nivel global o de proceso, debemos tener vigilada la actividad de swap, tanto swap-in como swap-out:

  • swap-in: datos que salen de swap a memoria física (RAM) de la máquina.
  • swap-out: datos de memoria física (RAM) a swap. Puede indicar que andamos cortos de memoria física, pero también depende del valor de swappiness configurado.

Utilizar swap de manera puntual no implica un problema de entrada en nuestro servidor, pero conviene echar un vistazo especialmente a los valores swap-out que como hemos visto indican salida de datos desde memoria física RAM a memoria swap. Como ésta reside en disco, es de acceso mucho más lento que la RAM. Poner la swap en un disco SSD pensando en que vamos a ganar en rendimiento al mejorar en lecturas/escrituras tampoco creo que sea buena idea si queremos que el almacenamiento SSD nos dure a largo plazo.

Con sar (sysstat) podemos ver actividad swap-in y swap-out en nuestro sistema. Podemos lanzar sar -W:

06:15:01 PM  pswpin/s pswpout/s
06:25:01 PM      0.00      0.00
06:35:01 PM      0.00      0.00
06:45:01 PM      0.00      0.00
06:55:01 PM      0.00      0.00
07:05:01 PM      0.00      0.00
07:15:01 PM      0.00      0.00
07:25:01 PM      0.00      0.00
07:35:01 PM      0.00      0.00
07:45:01 PM      0.00      0.00
07:55:01 PM      0.00      0.00
08:05:01 PM      0.00      0.00
08:15:01 PM      0.00      0.00
08:25:01 PM      0.00      0.00
08:35:01 PM      0.00      0.00
08:45:01 PM      0.00      0.00
08:55:01 PM      0.00      0.00
09:05:01 PM      0.35    121.23
Average:         0.00      1.46

Si no tenemos instalado el paquete sysstat en nuestro sistema (necesario para ejecutar sar) vmstat es otra opción para ver frecuencia de swap-in/swap-out

[jota@jota-pc ~]$ vmstat 1 10
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0 290672 8393712  22840 635360    0    1    33   102   28   65 25  0 75  0  0
 2  1 290672 8391720  22892 635416    0    0     4   352 3127 8290 26  1 74  0  0
 1  0 290672 8395868  22892 635420    0    0     0    20 4224 37000 32  1 67  0  0
 2  0 290672 8492656  22908 635432    0    0     0  1752 1868 7049 19  0 80  1  0
 3  0 290672 8491788  22908 635432    0    0     0     0 2491 8393 29  1 70  0  0
 1  0 290672 8491664  22908 635432    0    0     0     0 2033 8759 22  1 77  0  0
 2  0 290672 8491556  22908 635440    0    0     0     0 2129 8541 23  0 77  0  0
 1  0 290668 8491308  22920 635412   24    0    24    84 2578 8840 31  0 69  0  0
 9  0 290668 8490192  22920 635456    0    0     0    20 1675 7366 18  0 81  0  0
 3  0 290668 8490316  22928 635456    0    0     0    20 3180 7603 31  0 69  0  0

Si tenemos un dashboard como Grafana podemos ver dicha actividad de una forma gráfica, tanto swap-in/swap-out como total de swap utilizada a lo largo de un período de tiempo. Esto nos permite además detectar con mayor facilidad picos de uso de memoria en nuestra máquina y actuar en consecuencia (ampliación de RAM, necesidad de optimizar configuraciones/aplicaciones, etc…)

Por otro lado, el valor swapiness es un baremo que indica al sistema cuándo tiene que comenzar pasar datos de RAM a swap (swap-out).

Por defecto en mi sistema de sobremesa Debian Stretch es 60:

[root@jota-pc ~]# cat /proc/sys/vm/swappiness
60

Esto indica que cuando sólo tenga el 60% de RAM libre (o lo que es lo mismo, el 40% ocupada) el sistema comenzará a pasar datos de RAM a swap. Teniendo en cuenta que tengo 16 GB de RAM, podría bajar perfectamente dicho valor por defecto, tanto de forma temporal como permanente:

# Temporal
echo 15 > /proc/sys/vm/swappiness

# Permanente en /etc/sysctl.conf, por ejemplo a 15:
vm.swappiness = 15

Podemos poner el valor de swapiness en función de la cantidad de RAM total del sistema y el tipo de procesos que vayamos a ejecutar. Existen no obstante ciertas convenciones a las que conviene echar un vistazo ya que también influye el kernel que estemos utilizando.