Uno de los métodos para obtener el perfil de carga de trabajo y el historial de esperas en PostgreSQL

Continuación del artículo «Intento de crear un análogo de ASH para PostgreSQL «.

En este artículo se examinará y mostrará con consultas y ejemplos específicos — qué información útil se puede obtener a través de la vista pg_stat_activity.

Advertencia.
Debido a la novedad del tema y a que el período de prueba no ha finalizado, el artículo puede contener errores. Se agradecen y se esperan críticas y comentarios.

Datos de entrada

Historia de la vista pg_stat_statements

pg_stat_history

CREATE TABLE pg_stat_history ( 
id SERIAL, 
snapshot_timestamp  timestamp sin zona horaria, 
database_id integer,
dbid oid,
userid oid,
queryid bigint,
query text,
calls bigint, 
total_time doble precisión, 
min_time doble precisión, 
max_time doble precisión, 
mean_time doble precisión,
stddev_time doble precisión,
rows bigint,
shared_blks_hit bigint, 
shared_blks_read bigint, 
shared_blks_dirtied bigint, 
shared_blks_written bigint, 
local_blks_hit bigint, 
local_blks_read bigint,
local_blks_dirtied bigint, 
local_blks_written bigint, 
temp_blks_read bigint,
temp_blks_written bigint,
blk_read_time doble precisión, 
blk_write_time doble precisión, 
baseline_id integer );

La tabla se llena cada hora utilizando dblink a la base de datos de destino. La columna más interesante y útil en la tabla, por supuesto queryid.

Historia de la vista pg_stat_activity

archive_pg_stat_activity

CREATE TABLE archive_pg_stat_activity
(
  timepoint timestamp sin zona horaria,
  datid             oid, 
  datname           nombre,
  pid               integer,
  usesysid          oid,
  usename           nombre,
  application_name  text,
  client_addr       inet,
  client_hostname   text,
  client_port       integer,
  backend_start     timestamp sin zona horaria,
  xact_start        timestamp sin zona horaria,
  query_start       timestamp sin zona horaria,
  state_change      timestamp sin zona horaria,
  wait_event_type   text,                     
  wait_event        text,                   
  state             text,                  
  backend_xid       xid,                 
  backend_xmin      xid,                
  query             text,               
  backend_type      text,
  queryid           bigint
);

La tabla es una tabla de historial_pg_stat_activity segmentada por horas (más detalles aquí — pg_stat_statements + pg_stat_activity + loq_query = pg_ash? y aquí — Intento de crear un análogo de ASH para PostgreSQL.)

Datos de salida

TIEMPO DE CPU CLUSTER (SISTEMA + CLIENTES)

Consulta

CON 
 t COMO
 (
	SELECT 		
			date_trunc('second', timepoint)
	FROM 	activity_hist.archive_pg_stat_activity aa
	WHERE 	timepoint BETWEEN pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour')  AND 
			( aa.wait_event_type IS NULL  ) AND
			aa.state = 'active'
 )
 SELECT count(*) 
 INTO cpu_total
 FROM t ;

Ejemplo

TIEMPO DE CPU CLUSTER (SISTEMA + CLIENTES) : 28:37:46

TIEMPO DE ESPERAS CLUSTER

Consulta

CON 
 t COMO
 (
	SELECT 		
			date_trunc('second', timepoint)
	FROM 	activity_hist.archive_pg_stat_activity aa
	WHERE 	timepoint BETWEEN pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour')  AND 
			( aa.wait_event_type IS NOT NULL  ) AND
			aa.state = 'active'
 )
 SELECT count(*) 
 INTO cpu_total
 FROM t ;

Ejemplo

TIEMPO DE ESPERAS CLUSTER : 30:12:49

Valores totales de pg_stat_statements

Consulta

 --TOTAL pg_stat
  SELECT 
    SUM(calls) AS calls, SUM(total_time)  AS total_time, SUM(rows) AS rows ,
	SUM(shared_blks_hit)  AS shared_blks_hit,SUM(shared_blks_read) AS shared_blks_read ,
	SUM(shared_blks_dirtied) AS shared_blks_dirtied,SUM(shared_blks_written) AS shared_blks_written , 
    SUM(local_blks_hit) AS local_blks_hit , SUM(local_blks_read) AS local_blks_read , 
	SUM(local_blks_dirtied) AS local_blks_dirtied , SUM(local_blks_written)  AS local_blks_written,
	SUM(temp_blks_read) AS temp_blks_read, SUM(temp_blks_written) temp_blks_written , 
	SUM(blk_read_time) AS blk_read_time , SUM(blk_write_time) AS blk_write_time
  INTO 
    pg_total_stat_history_rec
  FROM 
    pg_stat_history
  WHERE 
 	snapshot_timestamp BETWEEN pg_stat_history_begin AND pg_stat_history_end AND 
	queryid IS NULL;

SQL DBTIME — tiempo total de ejecución de consultas

Consulta

dbtime_total = intervalo '1 milisegundo' * pg_total_stat_history_rec.total_time ;

Ejemplo

SQL DBTIME : 136:49:36

SQL CPU TIME — tiempo de CPU gastado en la ejecución de consultas

Consulta

CON 
 t COMO
 (
	SELECT 		
			date_trunc('second', timepoint)
	FROM 	activity_hist.archive_pg_stat_activity aa
	WHERE 	timepoint BETWEEN pg_stat_history_begin+(current_hour_diff * intervalo '1 hora') AND pg_stat_history_end+(current_hour_diff * intervalo '1 hora')  AND 
			( aa.wait_event_type IS NULL  ) AND
			backend_type = 'client backend' AND 
			aa.state = 'active'
 )
 SELECT count(*) 
 INTO cpu_total
 FROM t ;

Ejemplo

SQL CPU TIME : 27:40:15

SQL WAITINGS TIME — tiempo total de espera para consultas

Consulta

CON 
 t COMO
 (
	SELECT 		
			date_trunc('second', timepoint)
	FROM 	activity_hist.archive_pg_stat_activity aa
	WHERE 	timepoint BETWEEN pg_stat_history_begin+(current_hour_diff * intervalo '1 hora') AND pg_stat_history_end+(current_hour_diff * intervalo '1 hora')  AND 
			( aa.wait_event_type IS NOT NULL  ) AND
			aa.state = 'active' AND 
		backend_type = 'client backend'
 )
 SELECT count(*) 
 INTO waiting_total
 FROM t ;

Ejemplo

SQL WAITINGS TIME : 30:04:09

Las siguientes consultas son triviales y por economía de espacio, se omiten los detalles de implementación:

Ejemplo

| SQL IOTIME : 19:44:50
| SQL READ TIME : 19:44:32
| SQL WRITE TIME : 00:00:17
|
| SQL CALLS : 12188248
-------------------------------------------------------------
| SQL SHARED BLOCKS READS : 7997039120
| SQL SHARED BLOCKS HITS : 8868286092
| SQL SHARED BLOCKS HITS/READS % : 110.89
| SQL SHARED BLOCKS DIRTED : 419945
| SQL SHARED BLOCKS WRITTEN : 19857
|
| SQL TEMPORARY BLOCKS READS : 7836169
| SQL TEMPORARY BLOCKS WRITTEN : 10683938

Pasamos a la sección más interesante

ESTADÍSTICAS DE ESPERAS

TOP 10 ESPERAS POR TIEMPO TOTAL DE ESPERA PARA PROCESOS DE CLIENTES

Consulta

SELECT 
  wait_event_type , wait_event ,
  get_system_waiting_duration( wait_event_type , wait_event ,pg_stat_history_begin+(current_hour_diff * intervalo '1 hora') ,pg_stat_history_end+(current_hour_diff * intervalo '1 hora') ) como duración 
FROM
  activity_hist.archive_pg_stat_activity aa
WHERE 
  timepoint BETWEEN pg_stat_history_begin+(current_hour_diff * intervalo '1 hora') AND pg_stat_history_end+(current_hour_diff * intervalo '1 hora') AND backend_type != 'client backend' AND wait_event_type IS NOT NULL 
GROUP BY 
  wait_event_type, wait_event
ORDER BY 3 DESC
LIMIT 10

Ejemplo

+------------------------------------------------------------------------------------
| TOP 10 ESPERAS POR TIEMPO TOTAL DE ESPERA PARA PROCESOS DEL SISTEMA
+-----+------------------------------+--------------------+--------------------
|    #|               tipo_evento_espera|          evento_espera|            duración
+-----+------------------------------+--------------------+--------------------
|    1|                      Actividad| LogicalLauncherMain|            10:43:28
|    2|                      Actividad|      AutoVacuumMain|            10:42:49
|    3|                      Actividad|       WalWriterMain|            10:28:53
|    4|                      Actividad|    CheckpointerMain|            10:23:50
|    5|                      Actividad|        BgWriterMain|            09:11:59
|    6|                      Actividad|   BgWriterHibernate|            01:37:46
|    7|                            IO|        BufFileWrite|            00:02:35
|    8|                        LWLock|      buffer_mapping|            00:01:54
|    9|                            IO|        DataFileRead|            00:01:23
|   10|                            IO|            WALWrite|            00:00:59
+-----+------------------------------+--------------------+--------------------

TOP 10 ESPERAS POR TIEMPO TOTAL DE ESPERA PARA PROCESOS DE CLIENTES

Consulta

SELECCIONAR 
  tipo_evento_espera , evento_espera ,
  get_clients_waiting_duration( tipo_evento_espera , evento_espera , pg_stat_history_begin+(current_hour_diff * interval '1 hour') , pg_stat_history_end+(current_hour_diff * interval '1 hour') ) como duración
DE 
  activity_hist.archive_pg_stat_activity aa
DONDE 
  timepoint ENTRE pg_stat_history_begin+(current_hour_diff * interval '1 hour') Y pg_stat_history_end+(current_hour_diff * interval '1 hour') Y backend_type = 'client backend' Y tipo_evento_espera NO ES NULO 
AGRUPAR POR tipo_evento_espera, evento_espera
ORDENAR POR 3 DESC
LIMITE 10

Ejemplo

+-----+------------------------------+--------------------+--------------------+----------
|    #|               tipo_evento_espera|          evento_espera|            duración|  % tiempo_db
+-----+------------------------------+--------------------+--------------------+----------
|    1|                          Bloqueo|       transactionid|            08:16:47|      6.05
|    2|                            IO|        DataFileRead|            06:13:41|      4.55
|    3|                       Tiempo de espera|             PgSleep|            02:53:21|      2.11
|    4|                        LWLock|      buffer_mapping|            00:40:42|       0.5
|    5|                        LWLock|           buffer_io|            00:17:17|      0.21
|    6|                            IO|        BufFileWrite|            00:01:34|      0.02
|    7|                          Bloqueo|               tuple|            00:01:32|      0.02
|    8|                        Cliente|          ClientRead|            00:01:19|      0.02
|    9|                            IO|         BufFileRead|            00:00:37|      0.01
|   10|                        LWLock|      buffer_content|            00:00:08|         0
+-----+------------------------------+--------------------+--------------------+----------

TIPOS DE ESPERA POR TIEMPO TOTAL DE ESPERA, PARA PROCESOS DEL SISTEMA

Consulta

SELECCIONAR 
  tipo_evento_espera ,
  get_system_waiting_type_duration( tipo_evento_espera , pg_stat_history_begin+(current_hour_diff * interval '1 hour') , pg_stat_history_end+(current_hour_diff * interval '1 hour') ) como duración
DE
  activity_hist.archive_pg_stat_activity aa
DONDE 
  timepoint ENTRE pg_stat_history_begin+(current_hour_diff * interval '1 hour') Y pg_stat_history_end+(current_hour_diff * interval '1 hour') Y  backend_type != 'client backend' Y tipo_evento_espera NO ES NULO 
AGRUPAR POR tipo_evento_espera
ORDENAR POR 2 DESC

Ejemplo

+-----+------------------------------+--------------------
|    #|               tipo_evento_espera|            duración
+-----+------------------------------+--------------------
|    1|                      Actividad|            53:08:45
|    2|                            IO|            00:06:24
|    3|                        LWLock|            00:03:02
+-----+------------------------------+--------------------

TIPOS DE ESPERA POR TIEMPO TOTAL DE ESPERA, PARA PROCESOS DE CLIENTES

Consulta

SELECCIONAR 
  tipo_evento_espera ,
  get_clients_waiting_type_duration( tipo_evento_espera , pg_stat_history_begin+(current_hour_diff * interval '1 hora') , pg_stat_history_end+(current_hour_diff * interval '1 hora') ) como duración
DE
  activity_hist.archive_pg_stat_activity aa
DONDE 
  timepoint ENTRE pg_stat_history_begin+(current_hour_diff * interval '1 hora') Y pg_stat_history_end+(current_hour_diff * interval '1 hora') Y tipo_backend = 'backend de cliente' Y tipo_evento_espera IS NOT NULL 
AGRUPAR POR tipo_evento_espera
ORDENAR POR 2 DESC

Ejemplo

+-----+------------------------------+--------------------+--------------------
|    #|               tipo_evento_espera|            duración|            % tiempo_db
+-----+------------------------------+--------------------+--------------------
|    1|                          Bloqueo|            08:18:19|                6.07
|    2|                            IO|            06:16:01|                4.58
|    3|                       Timeout|            02:53:21|                2.11
|    4|                        LWLock|            00:58:12|                0.71
|    5|                        Cliente|            00:01:19|                0.02
|    6|                           IPC|            00:00:04|                   0
+-----+------------------------------+--------------------+--------------------

Duraciones de espera, para procesos del sistema y consultas individuales.

ESPERAS PARA PROCESOS DEL SISTEMA

Consulta

SELECCIONAR 
  tipo_backend , datname , tipo_evento_espera , evento_espera , get_backend_type_waiting_duration( tipo_backend , tipo_evento_espera , evento_espera , pg_stat_history_begin+(current_hour_diff * interval '1 hora') , pg_stat_history_end+(current_hour_diff * interval '1 hora') ) como duración 
DE 
  activity_hist.archive_pg_stat_activity aa
DONDE 
  timepoint ENTRE pg_stat_history_begin+(current_hour_diff * interval '1 hora') Y pg_stat_history_end+(current_hour_diff * interval '1 hora') Y tipo_backend != 'backend de cliente' Y tipo_evento_espera IS NOT NULL 
AGRUPAR POR tipo_backend , datname , tipo_evento_espera , evento_espera
ORDENAR POR 5 DESC

Ejemplo

+-----+-----------------------------+----------+--------------------+----------------------+--------------------
|    #|                 backend_type|    dbname|     wait_event_type|            wait_event|            duration
+-----+-----------------------------+----------+--------------------+----------------------+--------------------
|    1| lanzador de replicación lógica|          |            Actividad|   LogicalLauncherMain|            10:43:28
|    2|          lanzador de autovacuum|          |            Actividad|        AutoVacuumMain|            10:42:49
|    3|                    walwriter|          |            Actividad|         WalWriterMain|            10:28:53
|    4|                 verificador|          |            Actividad|      CheckpointerMain|            10:23:50
|    5|            escritor en segundo plano|          |            Actividad|          BgWriterMain|            09:11:59
|    6|            escritor en segundo plano|          |            Actividad|     BgWriterHibernate|            01:37:46
|    7|              trabajador paralelo|      tdb1|                  IO|          BufFileWrite|            00:02:35
|    8|              trabajador paralelo|      tdb1|              LWLock|        buffer_mapping|            00:01:41
|    9|              trabajador paralelo|      tdb1|                  IO|          DataFileRead|            00:01:22
|   10|              trabajador paralelo|      tdb1|                  IO|           BufFileRead|            00:00:59
|   11|                    walwriter|          |                  IO|              WALWrite|            00:00:57
|   12|              trabajador paralelo|      tdb1|              LWLock|             buffer_io|            00:00:47
|   13|            trabajador de autovacuum|      tdb1|              LWLock|        buffer_mapping|            00:00:13
|   14|            escritor en segundo plano|          |                  IO|         DataFileWrite|            00:00:12
|   15|                 verificador|          |                  IO|         DataFileWrite|            00:00:11
|   16|                    walwriter|          |              LWLock|          WALWriteLock|            00:00:09
|   17|                 verificador|          |              LWLock|          WALWriteLock|            00:00:06
|   18|            escritor en segundo plano|          |              LWLock|          WALWriteLock|            00:00:06
|   19|                    walwriter|          |                  IO|          WALInitWrite|            00:00:02
|   20|            trabajador de autovacuum|      tdb1|              LWLock|          WALWriteLock|            00:00:02
|   21|                    walwriter|          |                  IO|           WALInitSync|            00:00:02
|   22|            trabajador de autovacuum|      tdb1|                  IO|          DataFileRead|            00:00:01
|   23|                 verificador|          |                  IO| ControlFileSyncUpdate|            00:00:01
|   24|            escritor en segundo plano|          |                  IO|              WALWrite|            00:00:01
|   25|            escritor en segundo plano|          |                  IO|         DataFileFlush|            00:00:01
|   26|                 verificador|          |                  IO|         SLRUFlushSync|            00:00:01
|   27|            trabajador de autovacuum|      tdb1|                  IO|              WALWrite|            00:00:01
|   28|                 verificador|          |                  IO|          DataFileSync|            00:00:01
+-----+-----------------------------+----------+--------------------+----------------------+--------------------

ESPERAS PARA SQL — esperas para consultas individuales por queryid

Consulta

SELECCIONAR 
queryid, datname, tipo_evento_espera, evento_espera, obtener_duracion_espera_consulta(queryid, tipo_evento_espera, evento_espera, pg_stat_history_begin + (diferencia_horas_actual * intervalo '1 hora'), pg_stat_history_end + (diferencia_horas_actual * intervalo '1 hora')) como duración 
DE 
  activity_hist.archive_pg_stat_activity aa
DONDE 
  timepoint ENTRE pg_stat_history_begin + (diferencia_horas_actual * intervalo '1 hora') Y pg_stat_history_end + (diferencia_horas_actual * intervalo '1 hora') Y tipo_backend = 'backend del cliente' Y tipo_evento_espera NO ES NULO Y queryid NO ES NULO 
AGRUPAR POR queryid, datname, tipo_evento_espera, evento_espera
ORDENAR POR 1, 5 DESC 

Ejemplo

+-----+-------------------------+----------+--------------------+--------------------+--------------------+--------------------
|    #|                  queryid|    dbname|     wait_event_type|          wait_event|            waitings|               total
|     |                         |          |                    |                    |            duration|            duration
+-----+-------------------------+----------+--------------------+--------------------+--------------------+--------------------
|    1|     -8247416849404883188|      tdb1|              Cliente|          LecturaCliente|            00:00:02|
|    2|     -6572922443698419129|      tdb1|              Cliente|          LecturaCliente|            00:00:05|
|    3|     -6572922443698419129|      tdb1|                  IO|        LecturaArchivoDatos|            00:00:01|
|    4|     -5917408132400665328|      tdb1|              Cliente|          LecturaCliente|            00:00:04|
|    5|     -4091009262735781873|      tdb1|              Cliente|          LecturaCliente|            00:00:03|
|    6|     -1473395109729441239|      tdb1|              Cliente|          LecturaCliente|            00:00:01|
|    7|        28942442626229688|      tdb1|                  IO|        EscrituraBufArchivo|            00:01:34|            00:46:06
|    8|        28942442626229688|      tdb1|              LWLock|      mapeo_buffer|            00:01:05|            00:46:06
|    9|        28942442626229688|      tdb1|                  IO|        LecturaArchivoDatos|            00:00:44|            00:46:06
|   10|        28942442626229688|      tdb1|                  IO|         LecturaBufArchivo|            00:00:37|            00:46:06
|   11|        28942442626229688|      tdb1|              LWLock|           io_buffer|            00:00:35|            00:46:06
|   12|        28942442626229688|      tdb1|              Cliente|          LecturaCliente|            00:00:05|            00:46:06
|   13|        28942442626229688|      tdb1|                 IPC| RecepciónColaMensajes|            00:00:03|            00:46:06
|   14|        28942442626229688|      tdb1|                 IPC|    ApagarBgWorker|            00:00:01|            00:46:06
|   15|       389015618226997618|      tdb1|                Lock|       idtransacción|            03:55:09|            04:14:15
|   16|       389015618226997618|      tdb1|                  IO|        LecturaArchivoDatos|            03:23:09|            04:14:15
|   17|       389015618226997618|      tdb1|              LWLock|      mapeo_buffer|            00:12:09|            04:14:15
|   18|       389015618226997618|      tdb1|              LWLock|           io_buffer|            00:10:18|            04:14:15
|   19|       389015618226997618|      tdb1|                Lock|               tupla|            00:00:35|            04:14:15
|   20|       389015618226997618|      tdb1|              LWLock|        LockEscrituraWAL|            00:00:02|            04:14:15
|   21|       389015618226997618|      tdb1|                  IO|       EscrituraArchivoDatos|            00:00:01|            04:14:15
|   22|       389015618226997618|      tdb1|              LWLock|        LockEscaneoSincronización|            00:00:01|            04:14:15
|   23|       389015618226997618|      tdb1|              Cliente|          LecturaCliente|            00:00:01|            04:14:15
|   24|       734234407411547467|      tdb1|              Cliente|          LecturaCliente|            00:00:11|
|   25|       734234407411547467|      tdb1|              LWLock|      mapeo_buffer|            00:00:05|
|   26|       734234407411547467|      tdb1|                  IO|        LecturaArchivoDatos|            00:00:02|
|   27|      1237430309438971376|      tdb1|              LWLock|      mapeo_buffer|            00:02:18|            02:45:40
|   28|      1237430309438971376|      tdb1|                  IO|        LecturaArchivoDatos|            00:00:27|            02:45:40
|   29|      1237430309438971376|      tdb1|              Cliente|          LecturaCliente|            00:00:02|            02:45:40
|   30|      2404820632950544954|      tdb1|              Cliente|          LecturaCliente|            00:00:01|
|   31|      2515308626622579467|      tdb1|              Cliente|          LecturaCliente|            00:00:02|
|   32|      4710212362688288619|      tdb1|              LWLock|      mapeo_buffer|            00:03:08|            02:18:21
|   33|      4710212362688288619|      tdb1|                  IO|        LecturaArchivoDatos|            00:00:22|            02:18:21
|   34|      4710212362688288619|      tdb1|              Cliente|          LecturaCliente|            00:00:06|            02:18:21
|   35|      4710212362688288619|      tdb1|              LWLock|           io_buffer|            00:00:02|            02:18:21
|   36|      9150846928388977274|      tdb1|                  IO|        LecturaArchivoDatos|            00:01:19|
|   37|      9150846928388977274|      tdb1|              LWLock|      mapeo_buffer|            00:00:34|
|   38|      9150846928388977274|      tdb1|              Cliente|          LecturaCliente|            00:00:10|
|   39|      9150846928388977274|      tdb1|              LWLock|           io_buffer|            00:00:01|
+-----+-------------------------+----------+--------------------+--------------------+--------------------+--------------------

ESTADÍSTICAS SQL DEL CLIENTE — CONSULTAS PRINCIPALES

Las consultas para obtener, nuevamente, son triviales y, para ahorrar espacio, no se presentan.

Ejemplos

+------------------------------------------------------------------------------------
| CLIENT SQL ordenado por Tiempo Transcurrido
+--------------------+----------+----------+----------+----------+----------+--------------------
|        tiempo transcurrido|     llamadas|  % dbtime|     % CPU|      % IO|    nombre_basededatos|             queryid
+--------------------+----------+----------+----------+----------+----------+--------------------
|            04:14:15|        19|       3.1|     10.83|     11.52|      tdb1|  389015618226997618
|            02:45:40|       746|      2.02|      4.23|      0.08|      tdb1| 1237430309438971376
|            02:18:21|       749|      1.69|      3.39|       0.1|      tdb1| 4710212362688288619
|            00:46:06|       375|      0.56|      0.94|      0.41|      tdb1|   28942442626229688
+--------------------+----------+----------+----------+----------+----------+--------------------
| CLIENT SQL ordenado por Tiempo CPU
+--------------------+----------+----------+----------+----------+----------+----------+--------------------
|            tiempo cpu|     llamadas|  % dbtime|tiempo_total|     % CPU|      % IO|    nombre_basededatos|             queryid
+--------------------+----------+----------+----------+----------+----------+----------+--------------------
|            02:59:49|        19|       3.1|  04:14:15|     10.83|     11.52|      tdb1|  389015618226997618
|            01:10:12|       746|      2.02|  02:45:40|      4.23|      0.08|      tdb1| 1237430309438971376
|            00:56:15|       749|      1.69|  02:18:21|      3.39|       0.1|      tdb1| 4710212362688288619
|            00:15:35|       375|      0.56|  00:46:06|      0.94|      0.41|      tdb1|   28942442626229688
+--------------------+----------+----------+----------+----------+----------+----------+--------------------
| CLIENT SQL ordenado por Tiempo de Espera de Usuario I/O
+--------------------+----------+----------+----------+----------+----------+----------+--------------------
|        tiempo_io_espera|     llamadas|  % dbtime|tiempo_total|     % CPU|      % IO|    nombre_basededatos|             queryid
+--------------------+----------+----------+----------+----------+----------+----------+--------------------
|            03:23:10|        19|       3.1|  04:14:15|     10.83|     11.52|      tdb1|  389015618226997618
|            00:02:54|       375|      0.56|  00:46:06|      0.94|      0.41|      tdb1|   28942442626229688
|            00:00:27|       746|      2.02|  02:45:40|      4.23|      0.08|      tdb1| 1237430309438971376
|            00:00:22|       749|      1.69|  02:18:21|      3.39|       0.1|      tdb1| 4710212362688288619
+--------------------+----------+----------+----------+----------+----------+----------+--------------------
| CLIENT SQL ordenado por Lecturas de Buffers Compartidos
+--------------------+----------+----------+----------+----------+----------+----------+--------------------
|       lecturas_buffers|     llamadas|  % dbtime|tiempo_total|     % CPU|      % IO|    nombre_basededatos|             queryid
+--------------------+----------+----------+----------+----------+----------+----------+--------------------
|          1056388566|        19|       3.1|  04:14:15|     10.83|     11.52|      tdb1|  389015618226997618
|            11709251|       375|      0.56|  00:46:06|      0.94|      0.41|      tdb1|   28942442626229688
|             3439004|       746|      2.02|  02:45:40|      4.23|      0.08|      tdb1| 1237430309438971376
|             3373330|       749|      1.69|  02:18:21|      3.39|       0.1|      tdb1| 4710212362688288619
+--------------------+----------+----------+----------+----------+----------+----------+--------------------
| CLIENT SQL ordenado por Tiempo de Lecturas de Disco
+--------------------+----------+----------+----------+----------+----------+----------+--------------------
|           tiempo lectura|     llamadas|  % dbtime|tiempo_total|     % CPU|      % IO|    nombre_basededatos|             queryid
+--------------------+----------+----------+----------+----------+----------+----------+--------------------
|            02:16:30|        19|       3.1|  04:14:15|     10.83|     11.52|      tdb1|  389015618226997618
|            00:04:50|       375|      0.56|  00:46:06|      0.94|      0.41|      tdb1|   28942442626229688
|            00:01:10|       749|      1.69|  02:18:21|      3.39|       0.1|      tdb1| 4710212362688288619
|            00:00:57|       746|      2.02|  02:45:40|      4.23|      0.08|      tdb1| 1237430309438971376
+--------------------+----------+----------+----------+----------+----------+----------+--------------------
| CLIENT SQL ordenado por Ejecuciones
+--------------------+----------+----------+----------+----------+----------+----------+--------------------
|               llamadas|      filas|  % dbtime|tiempo_total|     % CPU|      % IO|    nombre_basededatos|             queryid
+--------------------+----------+----------+----------+----------+----------+----------+--------------------
|                 749|       749|      1.69|  02:18:21|      3.39|       0.1|      tdb1| 4710212362688288619
|                 746|       746|      2.02|  02:45:40|      4.23|      0.08|      tdb1| 1237430309438971376
|                 375|         0|      0.56|  00:46:06|      0.94|      0.41|      tdb1|   28942442626229688
|                  19|        19|       3.1|  04:14:15|     10.83|     11.52|      tdb1|  389015618226997618
+--------------------+----------+----------+----------+----------+----------+----------+--------------------

Summary

Utilizando las consultas presentadas y los informes obtenidos, se puede obtener una visión más completa para el análisis y la resolución de problemas de degradación del rendimiento, tanto de consultas individuales como del clúster en general.

Desarrollo

Los planes de desarrollo son los siguientes:

  • Complementar el informe con el historial de bloqueos. Las consultas están siendo probadas y se presentarán en breve.
  • Utilizar la extensión TimescaleDB para almacenar el historial de pg_stat_activity y pg_locks.
  • Preparar una solución por lotes en github para despliegue masivo en bases de datos de producción.

Continuará...

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster