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.