Lo hice y lo entendí

El blog de Vicente Navarro
08 nov

sysstat, la colección de herramientas de monitorización de rendimiento

El paquete sysstat es una colección de herramientas de monitorización de rendimiento. Nos puede proporcionar datos instantáneos de rendimiento, así como almacenarlos como históricos para nuestra futura referencia. Especialmente en entornos de servidor, sus datos nos proporcionan información muy valiosa sobre las posibles carencias y cuellos de botella de nuestro sistema.

Las herramientas que incluye son:

  • iostat(1) reports CPU statistics and input/output statistics for devices, partitions and network filesystems.
  • mpstat(1) reports individual or combined processor related statistics.
  • pidstat(1) reports statistics for Linux tasks (processes) : I/O, CPU, memory, etc.
  • sar(1) collects, reports and saves system activity information (CPU, memory, disks, interrupts, network interfaces, TTY, kernel tables,etc.)
  • sadc(8) is the system activity data collector, used as a backend for sar.
  • sa1(8) collects and stores binary data in the system activity daily data file. It is a front end to sadc designed to be run
    from cron.
  • sa2(8) writes a summarized daily activity report. It is a front end to sar designed to be run from cron.
  • sadf(1) displays data collected by sar in multiple formats (CSV, XML, etc.) This is useful to load performance data into a database, or import them in a spreadsheet to make graphs.

En Debian y Ubuntu, tras instalar el paquete (apt-get install sysstat), ya podemos ver datos instantáneos. Todos los comandos aceptan como parámetros:

[ interval [ count ] ]

con los que le decimos al comando cuántos valores queremos y cada cuántos segundos. Por ejemplo, 5 valores de uso de CPU separados un segundo:

$ sar 1 5
Linux 2.6.27-7-generic (sistema) 	11/08/2008 	_x86_64_

10:17:37 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
10:17:38 AM     all      2.45      0.00      1.47      0.00      0.00     96.08
10:17:39 AM     all      1.96      0.00      0.98      0.00      0.00     97.06
10:17:40 AM     all     11.17      0.00      2.91      0.00      0.00     85.92
10:17:41 AM     all     13.11      0.00      1.94      0.00      0.00     84.95
10:17:42 AM     all      3.37      0.00      2.88      0.00      0.00     93.75
Average:        all      6.42      0.00      2.04      0.00      0.00     91.54

5 valores de uso de memoria separados 10 segundos:

$ sar -r 10 5
Linux 2.6.27-7-generic (sistema) 	11/08/2008 	_x86_64_

10:18:29 AM kbmemfree kbmemused  %memused kbbuffers  kbcached kbswpfree kbswpused  %swpused  kbswpcad
10:18:39 AM   2651048   1404992     34.64      4840    167752    494136     30144      5.75     15140
10:18:49 AM   2382488   1673552     41.26      4844    167752    494136     30144      5.75     15172
10:18:59 AM   2114128   1941912     47.88      4844    167752    494136     30144      5.75     15172
10:19:09 AM   1844028   2212012     54.54      4864    169372    494136     30144      5.75     15172
10:19:19 AM   1572116   2483924     61.24      4888    172648    494136     30144      5.75     15204
Average:      2112762   1943278     47.91      4856    169055    494136     30144      5.75     15172

Uso de los diferentes procesadores del sistema:

$ mpstat -P ALL
Linux 2.6.27-7-generic (sistema) 	11/08/2008 	_x86_64_

10:22:07 AM  CPU   %user   %nice    %sys %iowait    %irq   %soft  %steal   %idle    intr/s
10:22:07 AM  all    8.30    0.57    1.62    1.12    0.05    0.10    0.00   88.24    571.13
10:22:07 AM    0    8.40    0.14    1.30    0.26    0.00    0.00    0.00   89.90      0.95
10:22:07 AM    1    8.20    0.99    1.93    1.95    0.11    0.20    0.00   86.62    263.10

Porcentaje de uso de los procesos más activos:

$ pidstat 1 2
Linux 2.6.27-7-generic (sistema) 	11/08/2008 	_x86_64_

10:23:26 AM       PID   %user %system    %CPU   CPU  Command
10:23:27 AM      6143    0.98    0.98    1.96     1  Xorg
10:23:27 AM      6713    0.98    0.00    0.98     1  compiz.real
10:23:27 AM      6881    0.98    0.98    1.96     0  firefox
10:23:27 AM      9046    1.96    0.00    1.96     1  gnome-terminal
10:23:27 AM     12769    0.00    1.96    1.96     0  pidstat

10:23:27 AM       PID   %user %system    %CPU   CPU  Command
10:23:28 AM      6143    3.00    0.00    3.00     1  Xorg
10:23:28 AM      6779    0.00    2.00    2.00     1  multiload-apple
10:23:28 AM      6881    1.00    0.00    1.00     0  firefox
10:23:28 AM     12769    2.00    2.00    4.00     0  pidstat

Average:          PID   %user %system    %CPU   CPU  Command
Average:         6143    1.98    0.50    2.48     -  Xorg
Average:         6713    0.50    0.00    0.50     -  compiz.real
Average:         6779    0.00    0.99    0.99     -  multiload-apple
Average:         6881    0.99    0.50    1.49     -  firefox
Average:         9046    0.99    0.00    0.99     -  gnome-terminal
Average:        12769    0.99    1.98    2.97     -  pidstat

Las variables que pueden ser monitorizadas son muchas y, a menudo, los comandos (especialmente iostat, mpstat, y sar) se solapan en cuanto a sus posibilidades. Tendremos que navegar por sus páginas de man para poder descubrirlas todas, que son muchas.

Pero en cualquier caso, los valores instantáneos no es lo que más nos puede interesar. Los de CPU y memoria los podemos ver también en el top, vmstat o free. Lo más atractivo de estas herramientas es la posibilidad recoger periódicamente datos y guardarlos en ficheros de históricos.

Para comenzar a hacerlo, hemos de editar el fichero /etc/default/systat y poner la variable ENABLED a “true“:

# Should sadc collect system activity informations? Valid values
# are "true" and "false". Please do not put other values, they
# will be overwritten by debconf!
ENABLED="true"

Y así conseguimos que las entradas de cron del sysstat comiencen a funcionar:

 $ cat /etc/cron.d/sysstat 
# Global variables:
#
#  our configuration file
DEFAULT=/etc/default/sysstat
#  default setting, overriden in the above file
ENABLED=false
SA1_OPTIONS=""

# Activity reports every 10 minutes everyday
5-55/10 * * * * root [ -x /usr/lib/sysstat/sa1 ] && { [ -r "$DEFAULT" ] && . "$DEFAULT" ; [ "$ENABLED" = "true" ] && exec /usr/lib/sysstat/sa1 $SA1_OPTIONS 1 1 ; }

# Additional run at 23:59 to rotate the statistics file
59 23 * * * root [ -x /usr/lib/sysstat/sa1 ] && { [ -r "$DEFAULT" ] && . "$DEFAULT" ; [ "$ENABLED" = "true" ] && exec /usr/lib/sysstat/sa1 $SA1_OPTIONS 60 2 ; }

El script /usr/lib/sysstat/sa1, que se ejecuta por defecto cada 10 minutos, llama al comando sadc, que escribe en formato binario los datos de rendimiento actuales de todas la áreas (CPU, memoria, disco, red, etc.) en el fichero /var/log/sysstat/saXX, donde XX indica el día del mes en el que estamos. Por defecto, se recogen datos de los últimos 7 días:

-rw-r--r--  1 root root   5640 2008-11-01 00:15 sa01
-rw-r--r--  1 root root  42104 2008-11-04 00:00 sa03
-rw-r--r--  1 root root 264840 2008-11-05 00:00 sa04
-rw-r--r--  1 root root 264840 2008-11-06 00:00 sa05
-rw-r--r--  1 root root 264840 2008-11-07 00:00 sa06
-rw-r--r--  1 root root 265304 2008-11-08 00:00 sa07
-rw-r--r--  1 root root 126240 2008-11-08 11:25 sa08
-rw-r--r--  1 root root 264840 2008-11-01 00:00 sa31

El número de días a retener se configura en el otro script, el /usr/lib/sysstat/sa2, que hace dos tareas. Por un lado escribe un resumen diario de los parámetros de rendimiento en ficheros de texto plano con nombre sarXX:

-rw-r--r--  1 root root  43760 2008-11-04 07:38 sar03
-rw-r--r--  1 root root 280091 2008-11-05 07:37 sar04
-rw-r--r--  1 root root 280091 2008-11-06 07:37 sar05
-rw-r--r--  1 root root 280091 2008-11-07 07:37 sar06
-rw-r--r--  1 root root 280124 2008-11-08 07:36 sar07
-rw-r--r--  1 root root 280092 2008-10-31 07:38 sar30

y, por el otro, elimina los ficheros saXX y sarXX de antigüedad anterior a la establecida, algo que se configura en la variable:

HISTORY=7

que aparece en el propio script. Éste se ejecuta diariamente desde el /etc/cron.daily/sysstat. Aunque el sistema no estuviera encendido a la hora de ejecutar el cron diario (configurada en /etc/crontab), el anacron se ocupa de que las tareas pendientes se ejecuten cuando el sistema arranque la próxima vez.

Tras recoger datos varios días, ya podemos, por ejemplo, ver los datos de memoria de los últimas horas:

10:55:01 AM kbmemfree kbmemused  %memused kbbuffers  kbcached kbswpfree kbswpused  %swpused  kbswpcad
11:05:02 AM     57092    426340     88.19    119088     83892    524232        48      0.01         0
11:15:01 AM     56968    426464     88.22    119260     83900    524232        48      0.01         0
11:25:01 AM     56720    426712     88.27    119452     83916    524232        48      0.01         0
11:35:01 AM     55340    428092     88.55    119656     83976    524232        48      0.01         0
11:45:01 AM     55092    428340     88.60    119856     83992    524232        48      0.01         0
11:55:01 AM     54968    428464     88.63    120016     84004    524232        48      0.01         0
Average:        76611    406821     84.15    111580     80913    524232        48      0.01         0

o ver los datos de CPU de hace un par de días:

$ sar -f /var/log/sysstat/sa05
09:55:01 PM       CPU     %user     %nice   %system   %iowait    %steal     %idle
10:05:01 PM       all     18.64      0.00      0.85      0.28      0.00     80.23
10:15:01 PM       all      0.73      0.00      0.31      0.27      0.00     98.69
10:25:01 PM       all      0.67      0.00      0.30      0.16      0.00     98.87
10:35:01 PM       all     41.62      0.00      1.16      0.18      0.00     57.04
10:45:01 PM       all     16.30      0.00      0.88      0.21      0.00     82.61
10:55:01 PM       all      1.17      0.00      0.33      0.18      0.00     98.31
11:05:01 PM       all      0.86      0.00      0.44      0.14      0.00     98.55
11:15:01 PM       all      0.66      0.00      0.21      0.18      0.00     98.95
11:25:01 PM       all      0.67      0.00      0.33      0.25      0.00     98.75
11:35:01 PM       all      0.84      0.00      0.45      0.20      0.00     98.51
11:45:01 PM       all      0.66      0.00      0.31      0.16      0.00     98.87
11:55:01 PM       all      1.47      0.00      0.60      6.97      0.00     90.95
11:59:01 PM       all      0.71      0.00      0.22      0.23      0.00     98.85
12:00:01 AM       all      0.65      0.00      0.20      0.30      0.00     98.85
Average:          all      1.32      0.07      0.37      0.39      0.00     97.86

Para más hacer aún más útiles los datos recogidos, el comando sadf nos permite exportar los datos a un formato fácilmente importable por una base de datos, como el CVS (con puntos y comas como separador en lugar de comas) o el XML.

En este ejemplo, obtenemos los datos de memoria indicándole a sadf qué parámetros (-r) pasarle a sar:

$ sadf -d /var/log/sysstat/sa08 -- -r
# hostname;interval;timestamp;kbmemfree;kbmemused;%memused;kbbuffers;kbcached;kbswpfree;kbswpused;%swpused;kbswpcad
sistema;602;2008-11-08 10:15:01 UTC;2515980;1540060;37.97;28444;665036;490280;34000;6.49;20432
sistema;601;2008-11-08 10:25:01 UTC;2508632;1547408;38.15;28892;666912;490280;34000;6.49;20432
sistema;601;2008-11-08 10:35:01 UTC;2506844;1549196;38.19;29312;667032;491196;33084;6.31;20508
sistema;602;2008-11-08 10:45:01 UTC;2502728;1553312;38.30;29948;669904;491212;33068;6.31;20492
sistema;602;2008-11-08 10:55:01 UTC;2496716;1559324;38.44;30572;671248;491216;33064;6.31;20488
sistema;602;2008-11-08 11:05:01 UTC;2493120;1562920;38.53;31172;671912;491216;33064;6.31;20616

Si exportamos a XML, no podemos especificar un área, sino que se exportan todas las métricas del fichero convenientemente etiquetadas:

$ sadf -x /var/log/sysstat/sa08 

Y para completar del todo al paquete sysstat, también disponemos del isag (Interactive System Activity Grapher), un programa X que se instala aparte y que nos permitirá crear gráficas de los datos que tenemos en el sistema. Si lo instalamos, lo arrancamos, elegimos uno de los ficheros de rendimiento (tenemos que hacer click sobre el desplegable que pasa un poco desapercibido a la derecha de donde pone “No File”) y ya podemos analizar los datos de forma extraordinariamente visual:

:wq

Entradas relacionadas

10 Comentarios a “sysstat, la colección de herramientas de monitorización de rendimiento”

Trackbacks y pingbacks:

Tema LHYLE09, creado por Vicente Navarro