Monitorización


Table Of Contents

Una de las tareas más importantes de un administrador de bases de datos es monitorizar los sistemas a su cargo para saber como están funcionando y planear futuras modificaciones y actualizaciones de los mismos.

Este artículo es una introducción a la monitorización de sistemas de bases de datos en sistemas Linux/Unix y está basado en un entrenamiento especializado que se impartio en el PGDay Latinoamericano 2011 en Cuba. Más adelante escribiremos otros artículos más específicos que nos ayuden a usar e interpretar los datos obtenidos de monitorizar nuestros sistemas.

En nuestro caso, monitorizar significa vigilar el funcionamiento de un sistema, servicio o actividad. Bajo nuestro punto de vista existen dos tipos de monitorización:

  • Ad Hoc: Monitorización específica en caso de problemas o pruebas. Se utiliza generalmente para investigar una situación puntual en la que intentamos encontrar una explicación a un suceso, cambio o problema.
  • Preventiva: Detecta interrupciones de servicios, alerta sobre posibles problemas y crea gráficos con tendencias y datos históricos sobre nuestros sistemas. Este tipo de monitorización está automatizada y nos ayuda a descubrir cambios en nuestros sistemas que provocan o pueden provocar problemas en un futuro cercano.

Existen numerosos programas que nos pueden ayudar a realizar la monitorización de nuestros sistemas PostgreSQL. A continuación teneis los mas usados en el mundo de programas de código abierto.

  • Ad Hoc: vmstat, iostat, sar, ps, top, iotop, htop, etc en la linea de comandos de vuestro sistema operativo, e información interna de vuestra instalacion postgreSQL via las vistas y tablas de sistema en la base de datos.
  • Preventiva: “Nagios” para detectar y alertar sobre posibles problemas y “Munin” para crear gráficas históricas con las tendencias y uso de nuestros sistemas.

Los elementos a monitorizar son todos aquellos que nos puedan dar información sobre como nuestro sistema está funcionando y comportandose. Tendremos que monitorizar los componentes de la infraestructura necesaria para que nuestro sistema funcione, los servidores que estamos utilizando, el uso de los recursos que se están utilizando y la información interna en la base de datos que nos de datos sobre como se está usando PostgreSQL.

Algunos de los elementos más importantes que se suelen monitorizar son los siguientes:

  • Servidor: Disponibilidad y posibles problemas del hardware
  • CPU: Carga del sistema y uso de la CPU
  • Memoria: Carga y uso de la memoria, uso de la memoria de intercambio (swap)
  • Red: Disponibilidad de los componentes de red, tráfico de entrada y salida.
  • Discos / almacenamiento: Espacio utilizado, I/O (Input/Output) del sistema
  • PostgreSQL: Número de conexiones, número de transacciones, transacciones abiertas, bloqueos, espacio usado, tipo de comandos usados, etc, etc

Ademas de estos elementos, suelen existir características específicas a cada sistema que cada administrador deberá identificar y monitorizar de la mejor manera posible.

Monitorización Ad Hoc

Como ya hemos comentado, este tipo de monitorización se utiliza generalmente para investigar una situacion puntual, en la que entramos en el sistema, recogemos los datos deseados por un periodo de tiempo y pasamos a su posterior análisis para intentar encontrar una explicación a la situación o problema que estamos intentado resolver.

A continuación teneis una breve introducción a las herramientas del sistema operativo usadas más a menudo en esta monitorización. Todas estas herramientas se pueden usar con multitud de opciones y parámetros, para obtener información detallada sobre los mismos usar el comando “man programa”

vmstat: Este comando se suele usar para obtener, entre otras cosas, información sobre el uso de memoria, swap, I/O total y cpu del sistema. La primera fila del resultado por defecto da los valores medios desde la última vez que se arranco el sistema. Es un programa que te da información global e instantanea del sistema en un momento determinado.

En sistemas debian/ubuntu este programa esta incluido en el paquete procps y si no esta instalado se puede instalar con el siguiente comando:

$ sudo apt-get install procps

Un resultado típico de ejecutar este comando podria ser el siguiente:

$ vmstat -n 1 10
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
0  0   1368 401736 529112 4844136    0    0    15    26   24    6  5  1 94  1
0  0   1368 397884 529112 4844140    0    0     0   124  523 1399  1  0 99  0
0  0   1368 401976 529112 4844140    0    0     0     0  566 1648  1  0 99  0
0  0   1368 398752 529112 4844140    0    0     0     0  488 1447  1  0 99  0
0  0   1368 403588 529112 4844140    0    0     0     0  520 1550  2  0 98  0
0  0   1368 398720 529112 4844140    0    0     0     0  565 1525  1  0 99  0
0  0   1368 400232 529116 4844144    0    0     0   124  551 1609  1  0 99  0
0  0   1368 396132 529116 4844144    0    0     0     0  519 1395  1  0 99  0
0  0   1368 400720 529116 4844144    0    0     0   440  673 1892  1  0 98  1
1  0   1368 397076 529116 4844144    0    0     0     0  500 1443  1  1 99  0

El tamaño de bloque por defecto es 1024 bytes (1Kb) y el significado de las distintas columnas es el siguiente:

  • r: Procesos esperando por tiempo de ejecución (run time)

  • b: Procesos en estado de espera sin interrupciones(uninterruptible sleep)

  • swpd: Cantidad de memoria virtual en uso

  • free: Cantidad de memoria ociosa

  • buff: Cantidad de memoria usada por buffers

  • cache: Cantidad de memoria usada caches

  • si: Cantidad de memoria grabada en disco (swap-in)

  • so: Cantidad de memoria leida del disco (swap-out)

  • bi: Bloques recibidos por los dispositivos de bloques (bloques/s)

  • bo: Bloques enviados por los dispositivos de bloques (bloques/s)

  • in: Número de interrupciones por segundo

  • cs: Número de cambios de contexto por segundo (context switches)

  • us: Tiempo de cpu de procesos de usuario (nice incluido)

  • sy: Tiempo de cpu de procesos del kernel

  • id: Tiempo de cpu ocioso

  • wa: Tiempo de cpu esperando por I/O

  • st: Tiempo de cpu “robado” a una maquina virtual

iostat: Este comando se suele utilizar para obtener información sobre la entrada/salida de datos de todos los dispositivos, particiones y sistemas de ficheros NFS. Por defecto, el primer resultado da los valores medios desde la última vez que se arranco el sistema. Es un programa que te da información sobre el I/O del sistema para todos los dispositivos en un momento determinado.

En sistemas debian/ubuntu este programa está incluido en el paquete sysstat y si no esta instalado se puede instalar con el siguiente comando:

$ sudo apt-get install sysstat

Un resultado típico de ejecutar este comando podria ser el siguiente:

$ iostat -k -p 1 2
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           4.78    0.19    0.60    0.79    0.00   93.64

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               5.50        59.00       106.86   19921681   36081584
sda1              1.62         6.75        17.93    2279650    6053108
sda2              0.08         3.05         0.02    1031003       7032
sda3              3.80        49.19        88.91   16610176   30020076
sda4              0.00         0.00         0.00        740       1368
sdb               0.00         0.01         0.00       3460         44
sdb1              0.00         0.01         0.00       3340         44

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.99    0.10    0.54    0.00    0.00   98.37

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               0.20        25.60         0.00        128          0
sda1              0.00         0.00         0.00          0          0
sda2              0.20        25.60         0.00        128          0
sda3              0.00         0.00         0.00          0          0
sda4              0.00         0.00         0.00          0          0
sdb               0.00         0.00         0.00          0          0
sdb1              0.00         0.00         0.00          0          0

El tamaño de bloque por defecto usado por este programa es 512 bytes. El parámetro -k nos cambia el valor de bloque a 1024 bytes (1Kb). El significado de las distintas columnas es el siguiente:

  • tps: Número de peticiones I/O (transferencias) a un dispositivo
  • kB_read/s: kB por segundo leidos del dispositivo
  • kB_wrtn/s: kB por segundo escritos en el dispositivo
  • kB_read: Número total de kB leidos del dispositivo
  • kB_wrtn: Número total de kB escritos en el dispositivo

sar: Este programa se suele utilizar para recolectar y grabar información sobre nuestro sistema durante un periodo de tiempo.

En sistemas debian/ubuntu este programa está incluido en el paquete sysstat y si no esta instalado se puede instalar con el siguiente comando:

$ sudo apt-get install sysstat

La recolección de datos se llama desde cron (/etc/cron.d/sysstat), y por defecto no está activado. Para activar la recolección de datos una vez instalado deberemos cambiar un parámetro en el fichero /etc/default/sysstat y arrancar el servicio:

ENABLE="TRUE" en /etc/default/sysstat
$ sudo /etc/init.d/sysstat restart

Un resultado típico de ejecutar este comando despues de un tiempo desde que se activa la recolección de datos podria ser el siguiente:

$ sar
Linux 2.6.35-24-generic (core2) 	01/29/2011 	_x86_64_	(4 CPU)

12:00:01 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
12:05:01 AM     all      0.72      0.14      0.95      0.19      0.00     97.99
12:15:01 AM     all      0.74      0.15      0.95      0.09      0.00     98.07
12:25:01 AM     all      0.73      0.15      0.90      0.05      0.00     98.17
12:35:01 AM     all      0.74      0.14      0.93      0.15      0.00     98.05
12:45:01 AM     all      1.08      4.80      3.27      0.07      0.00     90.78
12:55:01 AM     all      0.96      3.67      2.59      0.10      0.00     92.68
01:05:01 AM     all      0.72      0.14      0.90      0.19      0.00     98.04
01:15:01 AM     all      0.76      0.13      0.97      0.07      0.00     98.06
01:25:01 AM     all      0.70      0.15      0.90      0.06      0.00     98.20
01:35:01 AM     all      0.70      0.13      0.89      0.11      0.00     98.17
01:45:01 AM     all      0.68      0.14      0.90      0.10      0.00     98.18

ps: Este programa nos da información sobre los procesos que se están ejecutando en nuestro sistema. En el caso de procesos PostgreSQL nos puede dar información muy valiosa sobre cuantos procesos PostgreSQL se están ejecutando y que están haciendo.

Un resultado típico de ejecutar este comando para obtener los procesos PostgreSQL del sistema, ordenados por el momento en que empezaron a ejecutarse, podria ser el siguiente:

$ ps auxww | grep "postgres: " | sort -k 9

postgres 30758 .... 07:10 0:00 postgres: autovacuum launcher process         
postgres 30759 .... 07:10 0:00 postgres: stats collector process             
postgres 30757 .... 07:10 0:00 postgres: wal writer process                  
postgres 30756 .... 07:10 0:01 postgres: writer process                      
postgres   862 .... 07:59 0:00 postgres: postgres postgres [local] idle in transaction
postgres  1921 .... 09:22 0:00 postgres: postgres postgres 127.0.0.1(39475) idle 
postgres 21074 .... 14:14 0:04 postgres: postgres pgbench [local] COMMIT     
postgres 21073 .... 14:14 0:04 postgres: postgres pgbench [local] UPDATE waiting

Los que nos suelen interesar en este caso son los procesos creados por conexiones de clientes a nuestro servidor PostgreSQL. Estos procesos se muestran con el siguiente formato:

postgres: usuario  dbase  maquina(puerto)  actividad

Como podeis ver, podemos obtener información sobre que usuario está utilizando el cliente para conectarse, a que base de datos se está conectando, desde que máquina y puerto (o socket [local]) se ha conectado y que está haciendo. Los valores de la actividad que está realizando podrán ser:

idle in transaction: El proceso ha abierto una transacción pero no la ha cerrado todavia. idle: El proceso está conectado pero sin hacer nada. COMANDO: El proceso está ejecutando el comando COMANDO COMANDO waiting: El proceso quiere ejecutar el comando COMANDO, pero está bloqueado y esperando a poder ejecutarse

Vistas y tablas de sistema internas en PostgreSQL

Además podemos obtener información sobre como esta funcionando PostgreSQL internamente a través de las vistas y tablas de sistema en la base de datos. En sucesivos artículos iremos viendo que tipo de información contienen y como interpretar estas vista/tablas de sistema.

Para que muchas de estas vistas/tablas funcionen debemos tener activados estos parámetros en nuestro sistema, track_counts, track_functions, track_activities, bien en el fichero postgresql.conf o definidos con SET / ALTER DATABASE en la sesión o base de datos de la que queremos obtener información.

Existen muchas vistas y tablas internas pero las que se usan mas comunmente para obtener información de PostgreSQL son las siguientes:

pg_roles: Información sobre todos los roles y usuarios definidos en la base de datos.

postgres=# SELECT * from pg_roles ;

 rolname  | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcatupdate | rolcanlogin | rolconnlimit | rolpassword | rolvaliduntil | rolconfig | oid 
----------+----------+------------+---------------+-------------+--------------+-------------+--------------+-------------+---------------+-----------+-----
 postgres | t        | t          | t             | t           | t            | t           |           -1 | ********    |               |           |  10
(1 row)

pg_database Información sobre todas las bases de datos definidas en nuestro sistema.

postgres=# SELECT * from pg_database ;

  datname  | datdba | encoding | datcollate  |  datctype   | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfrozenxid | dattablespace |               datacl                
-----------+--------+----------+-------------+-------------+---------------+--------------+--------------+---------------+--------------+---------------+-------------------------------------
 template1 |     10 |        6 | en_US.UTF-8 | en_US.UTF-8 | t             | t            |           -1 |         11866 |          654 |          1663 | {=c/postgres,postgres=CTc/postgres}
 template0 |     10 |        6 | en_US.UTF-8 | en_US.UTF-8 | t             | f            |           -1 |         11866 |          654 |          1663 | {=c/postgres,postgres=CTc/postgres}
 postgres  |     10 |        6 | en_US.UTF-8 | en_US.UTF-8 | f             | t            |           -1 |         11866 |          654 |          1663 | 
 pgbench   |     10 |        6 | en_US.UTF-8 | en_US.UTF-8 | f             | t            |           -1 |         11866 |          654 |          1663 | 
(4 rows)

pg_locks: Información sobre los bloqueos activos en nuestras bases de datos. Vista complicada de entender pero muy valiosa en ciertas situaciones.

postgres=# SELECT * from pg_locks ;

   locktype    | database | relation | page | tuple | virtualxid | transactionid | classid | objid | objsubid | virtualtransaction | pid  |       mode       | granted 
---------------+----------+----------+------+-------+------------+---------------+---------+-------+----------+--------------------+------+------------------+---------
 relation      |    16385 |    16392 |      |       |            |               |         |       |          | 3/2666             | 2711 | AccessShareLock  | t
 relation      |    16385 |    16392 |      |       |            |               |         |       |          | 3/2666             | 2711 | RowExclusiveLock | t
 virtualxid    |          |          |      |       | 4/2692     |               |         |       |          | 4/2692             | 2710 | ExclusiveLock    | t
 relation      |    11874 |    10985 |      |       |            |               |         |       |          | 2/19               | 2401 | AccessShareLock  | t
 relation      |    16385 |    16399 |      |       |            |               |         |       |          | 3/2666             | 2711 | RowExclusiveLock | t
 relation      |    16385 |    16392 |      |       |            |               |         |       |          | 4/2692             | 2710 | AccessShareLock  | t
 relation      |    16385 |    16392 |      |       |            |               |         |       |          | 4/2692             | 2710 | RowExclusiveLock | t
 relation      |    16385 |    16403 |      |       |            |               |         |       |          | 4/2692             | 2710 | AccessShareLock  | t
 relation      |    16385 |    16403 |      |       |            |               |         |       |          | 4/2692             | 2710 | RowExclusiveLock | t
 relation      |    16385 |    16403 |      |       |            |               |         |       |          | 3/2666             | 2711 | AccessShareLock  | t
 relation      |    16385 |    16403 |      |       |            |               |         |       |          | 3/2666             | 2711 | RowExclusiveLock | t
 virtualxid    |          |          |      |       | 3/2666     |               |         |       |          | 3/2666             | 2711 | ExclusiveLock    | t
 relation      |    16385 |    16401 |      |       |            |               |         |       |          | 3/2666             | 2711 | RowExclusiveLock | t
 relation      |    16385 |    16386 |      |       |            |               |         |       |          | 3/2666             | 2711 | RowExclusiveLock | t
 relation      |    16385 |    16401 |      |       |            |               |         |       |          | 4/2692             | 2710 | RowExclusiveLock | t
 tuple         |    16385 |    16389 |   22 |    97 |            |               |         |       |          | 4/2692             | 2710 | ExclusiveLock    | t
 relation      |    16385 |    16389 |      |       |            |               |         |       |          | 4/2692             | 2710 | RowExclusiveLock | t
 relation      |    16385 |    16395 |      |       |            |               |         |       |          | 3/2666             | 2711 | RowExclusiveLock | t
 relation      |    16385 |    16389 |      |       |            |               |         |       |          | 3/2666             | 2711 | RowExclusiveLock | t
 transactionid |          |          |      |       |            |       2793613 |         |       |          | 4/2692             | 2710 | ExclusiveLock    | t
 virtualxid    |          |          |      |       | 2/19       |               |         |       |          | 2/19               | 2401 | ExclusiveLock    | t
 transactionid |          |          |      |       |            |       2793614 |         |       |          | 3/2666             | 2711 | ExclusiveLock    | t
 transactionid |          |          |      |       |            |       2793609 |         |       |          | 4/2692             | 2710 | ShareLock        | t
(23 rows)

pg_stat_activity: Información sobre todos los procesos clientes conectados a la base de datos.

postgres=# SELECT * from pg_stat_activity ;

 datid | datname  | procpid | usesysid | usename  | application_name | client_addr | client_port |         backend_start         |          xact_start           |          query_start          | wa
iting |                             current_query                             
-------+----------+---------+----------+----------+------------------+-------------+-------------+-------------------------------+-------------------------------+-------------------------------+---------+-----------------------------------------------------------------------
 11874 | postgres |    2401 |       10 | postgres | psql             |             |          -1 | 2011-02-17 22:48:08.090603+01 | 2011-02-17 22:52:31.297037+01 | 2011-02-17 22:52:31.297037+01 | f       | SELECT * from pg_stat_activity ;
 16385 | pgbench  |    2711 |       10 | postgres |                  |             |          -1 | 2011-02-17 22:51:12.209724+01 | 2011-02-17 22:52:31.296394+01 | 2011-02-17 22:52:31.296873+01 | f       | END;
 16385 | pgbench  |    2710 |       10 | postgres |                  |             |          -1 | 2011-02-17 22:51:12.1963+01   | 2011-02-17 22:52:31.295193+01 | 2011-02-17 22:52:31.29542+01  | t       | UPDATE pgbench_tellers SET tbalance = tbalance + -4443 WHERE tid = 1;
 16385 | pgbench  |    2811 |       10 | postgres |                  |             |             | 2011-02-17 22:52:27.549785+01 | 2011-02-17 22:52:31.247453+01 | 2011-02-17 22:52:31.247453+01 | f       | autovacuum: ANALYZE public.pgbench_history
(4 rows)

pg_stat_database: Información global de uso de todas las bases de datos.

postgres=# SELECT * from pg_stat_database ;

 datid |  datname  | numbackends | xact_commit | xact_rollback | blks_read | blks_hit | tup_returned | tup_fetched | tup_inserted | tup_updated | tup_deleted 
-------+-----------+-------------+-------------+---------------+-----------+----------+--------------+-------------+--------------+-------------+-------------
     1 | template1 |           0 |        3612 |             0 |      2840 |   100341 |       935386 |       33760 |            0 |           0 |           0
 11866 | template0 |           0 |           0 |             0 |         0 |        0 |            0 |           0 |            0 |           0 |           0
 11874 | postgres  |           1 |        4859 |             0 |      1304 |   132667 |      1425972 |       38209 |            0 |           0 |           0
 16385 | pgbench   |           2 |     2978446 |             1 |    659578 | 82868995 |     41262336 |    11863286 |      3178023 |     8934189 |           0
(4 rows)

pg_stat_user_tables: Información de uso de todas las tablas de usuario en una base de datos

pgbench=# SELECT * from pg_stat_user_tables ;

 relid | schemaname |     relname      | seq_scan | seq_tup_read | idx_scan | idx_tup_fetch | n_tup_ins | n_tup_upd | n_tup_del | n_tup_hot_upd | n_live_tup | n_dead_tup |          last_vacuum          |        last_autovacuum        |         last_analyze          |       last_autoanalyze        
-------+------------+------------------+----------+--------------+----------+---------------+-----------+-----------+-----------+---------------+------------+------------+-------------------------------+-------------------------------+-------------------------------+-------------------------------
 16395 | public     | pgbench_history  |        0 |            0 |          |               |   3074221 |         0 |         0 |             0 |     283308 |          0 | 2011-01-29 12:31:54.208813+01 |                               | 2011-01-29 12:31:54.209202+01 | 2011-02-17 22:53:34.126245+01
 16386 | public     | pgbench_branches |    38821 |        62452 |  3042999 |       3042999 |         2 |   3074222 |         0 |       3072054 |         75 |        493 | 2011-02-17 22:51:12.172321+01 | 2011-02-17 22:53:27.711111+01 | 2011-01-29 12:31:53.945088+01 | 2011-02-17 22:53:27.748393+01
 16389 | public     | pgbench_tellers  |    32474 |       621300 |  3043158 |       3043158 |        20 |   3074222 |         0 |       3052868 |         55 |        810 | 2011-02-17 22:51:12.175635+01 | 2011-02-17 22:53:27.870574+01 | 2011-01-29 12:31:53.946838+01 | 2011-02-17 22:53:27.871727+01
 16392 | public     | pgbench_accounts |        1 |       200000 |  6148444 |       6148444 |    200000 |   3074222 |         0 |       3033380 |     199999 |      10091 | 2011-01-29 12:31:54.049578+01 | 2011-01-29 12:59:29.982391+01 | 2011-01-29 12:31:54.204138+01 | 2011-02-17 22:53:31.476969+01
(4 rows)

pg_stat_user_indexes: Información de uso de todos los índices de usuarios en una base de datos

pgbench=# SELECT * from pg_stat_user_indexes ;

 relid | indexrelid | schemaname |     relname      |     indexrelname      | idx_scan | idx_tup_read | idx_tup_fetch 
-------+------------+------------+------------------+-----------------------+----------+--------------+---------------
 16386 |      16399 | public     | pgbench_branches | pgbench_branches_pkey |  3088826 |     10145852 |       2902404
 16389 |      16401 | public     | pgbench_tellers  | pgbench_tellers_pkey  |  3088985 |     24680003 |       2378762
 16392 |      16403 | public     | pgbench_accounts | pgbench_accounts_pkey |  6240098 |      6319966 |       6240098

pg_stat_user_functions: Información sobre estadísticas de uso de las funciones en uso.

pg_statio_user_tables: Información de acceso a disco y memoria cache de todas las tablas de usuario en una base de datos.

pgbench=# SELECT * from pg_statio_user_tables ;

 relid | schemaname |     relname      | heap_blks_read | heap_blks_hit | idx_blks_read | idx_blks_hit | toast_blks_read | toast_blks_hit | tidx_blks_read | tidx_blks_hit 
-------+------------+------------------+----------------+---------------+---------------+--------------+-----------------+----------------+----------------+---------------
 16392 | public     | pgbench_accounts |         547836 |       9289403 |          1361 |     19151376 |                 |                |                |              
 16395 | public     | pgbench_history  |         135074 |       3208010 |               |              |                 |                |                |              
 16386 | public     | pgbench_branches |           7587 |      17015504 |             6 |      3138237 |                 |                |                |              
 16389 | public     | pgbench_tellers  |           7160 |      28805005 |            25 |      6021187 |                 |                |                |              
(4 rows)

pg_statio_user_indexes: Información de acceso a disco y memoria cache de todos los índices de usuario en una base de datos.

pgbench=# SELECT * from pg_statio_user_indexes ;

 relid | indexrelid | schemaname |     relname      |     indexrelname      | idx_blks_read | idx_blks_hit 
-------+------------+------------+------------------+-----------------------+---------------+--------------
 16386 |      16399 | public     | pgbench_branches | pgbench_branches_pkey |             6 |      3163169
 16389 |      16401 | public     | pgbench_tellers  | pgbench_tellers_pkey  |            25 |      6076626
 16392 |      16403 | public     | pgbench_accounts | pgbench_accounts_pkey |          1361 |     19301010
(3 rows)

pg_stat_bgwriter: Información global sobre el proceso “background writer”

pgbench=# SELECT * from pg_stat_bgwriter ;

 checkpoints_timed | checkpoints_req | buffers_checkpoint | buffers_clean | maxwritten_clean | buffers_backend | buffers_alloc 
-------------------+-----------------+--------------------+---------------+------------------+-----------------+---------------
               474 |              81 |             223942 |        554746 |              573 |           85369 |        555848
(1 row)

Monitorización preventiva

Como hemos comentado al principio, este tipo de monitorización se utiliza para detectar interrupciones de servicios, alertar sobre posibles problemas y crea gráficos con tendencias y datos históricos sobre nuestros sistemas. Los dos programas de código abierto mas utilizados para este tipo de monitorización son:

  • Nagios: Se utiliza para detectar interrupciones de servicios y alertar sobre posibles problemas o situaciones que necesitan una atención especial por parte de los administradores del sistema. Su instalación y configuración se escapa al objetivo de este documento. Más adelante escribiremos un artículo sobre como utilizar Nagios.

    Aquí teneis un ejemplo de una de la pantallas de este programa:

  • Munin: Se utiliza para crear gráficas históricas con las tendencias y uso de nuestros sistemas. Imprescindible para ver como nuestros sistemas se están utilizando en el tiempo y si existen tendencias en el uso que van a requerir nuestra intervención en el futuro. Su instalación y configuración se escapa al objetivo de este documento. Más adelante escribiremos un artículo sobre como utilizar Munin.

    Aquí teneis algunos ejemplos de lo que se puede hacer con este programa:

Enlaces: