Suite de l'article ««.
Cet article examinera et illustrera, Ă l'aide de requĂȘtes et d'exemples concrets, quelles informations utiles peuvent ĂȘtre obtenues grĂące Ă la vue pg_stat_activity.
Avertissement.
En raison de la nouveauté du sujet et de l'achÚvement du processus de test, l'article peut contenir des erreurs. Les critiques et commentaires sont les bienvenus et attendus.
Données d'entrée
Vue d'historique pg_stat_statements
pg_stat_history
CREATE TABLE pg_stat_history (
id SERIAL,
snapshot_timestamp timestamp without time zone,
database_id integer,
dbid oid,
userid oid,
queryid bigint,
query text,
calls bigint,
total_time double precision,
min_time double precision,
max_time double precision,
mean_time double precision,
stddev_time double precision,
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 double precision,
blk_write_time double precision,
baseline_id integer );La table est remplie chaque heure en utilisant dblink vers la base de données cible. La colonne la plus intéressante et utile de la table est bien sûr queryid.
Vue d'historique pg_stat_activity
archive_pg_stat_activity
CREATE TABLE archive_pg_stat_activity
(
timepoint timestamp without time zone,
datid oid,
datname name,
pid integer,
usesysid oid,
usename name,
application_name text,
client_addr inet,
client_hostname text,
client_port integer,
backend_start timestamp without time zone,
xact_start timestamp without time zone,
query_start timestamp without time zone,
state_change timestamp without time zone,
wait_event_type text,
wait_event text,
state text,
backend_xid xid,
backend_xmin xid,
query text,
backend_type text,
queryid bigint
);La table reprĂ©sente une table partitionnĂ©e par heure de history_pg_stat_activity (En savoir plus ici â et ici â
Sortie
TEMPS CPU TOTAL (SYSTĂME + CLIENTS )
RequĂȘte
AVEC
t AS
(
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 heure') AND pg_stat_history_end+(current_hour_diff * interval '1 heure') AND
( aa.wait_event_type IS NULL ) AND
aa.state = 'active'
)
SELECT count(*)
INTO cpu_total
FROM t ;Exemple
TEMPS CPU TOTAL (SYSTĂME + CLIENTS ) : 28:37:46TEMPS D'ATTENTE TOTAL
RequĂȘte
AVEC
t AS
(
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 heure') AND pg_stat_history_end+(current_hour_diff * interval '1 heure') AND
( aa.wait_event_type IS NOT NULL ) AND
aa.state = 'active'
)
SELECT count(*)
INTO cpu_total
FROM t ;Exemple
TEMPS D'ATTENTE TOTAL : 30:12:49Valeurs totales pg_stat_statements
RequĂȘte
--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) AS 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 â temps d'exĂ©cution total des requĂȘtes
RequĂȘte
dbtime_total = interval '1 millisecond' * pg_total_stat_history_rec.total_time ;Exemple
SQL DBTIME : 136:49:36SQL CPU TIME â temps CPU consacrĂ© Ă l'exĂ©cution des requĂȘtes
RequĂȘte
WITH
t AS
(
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
backend_type = 'client backend' AND
aa.state = 'active'
)
SELECT count(*)
INTO cpu_total
FROM t ;Exemple
SQL CPU TIME : 27:40:15SQL WAITINGS TIME â temps total d'attente pour les requĂȘtes
RequĂȘte
WITH
t AS
(
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' AND
backend_type = 'client backend'
)
SELECT count(*)
INTO waiting_total
FROM t ;Exemple
SQL WAITINGS TIME : 30:04:09Les requĂȘtes suivantes sont triviales et pour Ă©conomiser de l'espace, les dĂ©tails de mise en Ćuvre sont omis :
Exemple
| 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
Passons au chapitre le plus intéressant
STATISTIQUES D'ATTENTE
TOP 10 DES ATTENTES PAR TEMPS D'ATTENTE TOTAL POUR LES PROCESSUS CLIENTS
RequĂȘte
SELECT
wait_event_type , wait_event ,
get_system_waiting_duration( wait_event_type , wait_event ,pg_stat_history_begin+(current_hour_diff * interval '1 hour') ,pg_stat_history_end+(current_hour_diff * interval '1 hour') ) AS duration
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 backend_type != 'client backend' AND wait_event_type IS NOT NULL
GROUP BY
wait_event_type, wait_event
ORDER BY 3 DESC
LIMIT 10Exemple
+------------------------------------------------------------------------------------ | TOP 10 ATTENTES PAR TEMPS TOTAL D'ATTENTE POUR LES PROCESSUS SYSTĂMES +-----+------------------------------+--------------------+-------------------- | #| type_d'attente| Ă©vĂ©nement_d'attente| durĂ©e +-----+------------------------------+--------------------+-------------------- | 1| ActivitĂ©| LogicalLauncherMain| 10:43:28 | 2| ActivitĂ©| AutoVacuumMain| 10:42:49 | 3| ActivitĂ©| WalWriterMain| 10:28:53 | 4| ActivitĂ©| CheckpointerMain| 10:23:50 | 5| ActivitĂ©| BgWriterMain| 09:11:59 | 6| ActivitĂ©| 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 DES ATTENTES PAR TEMPS D'ATTENTE TOTAL POUR LES PROCESSUS CLIENTS
RequĂȘte
SĂLECTIONNER
type_d'attente , événement_d'attente ,
get_clients_waiting_duration( type_d'attente , événement_d'attente , pg_stat_history_begin+(current_hour_diff * interval '1 hour') , pg_stat_history_end+(current_hour_diff * interval '1 hour') ) as durée
DE
activity_hist.archive_pg_stat_activity aa
OĂ
timepoint ENTRE pg_stat_history_begin+(current_hour_diff * interval '1 hour') ET pg_stat_history_end+(current_hour_diff * interval '1 hour') ET backend_type = 'client backend' ET type_d'attente EST NOT NULL
GROUP BY type_d'attente, événement_d'attente
ORDRE PAR 3 DESC
LIMIT 10Exemple
+-----+------------------------------+--------------------+--------------------+---------- | #| type_d'attente| événement_d'attente| durée| % temps_db +-----+------------------------------+--------------------+--------------------+---------- | 1| Verrou| transactionid| 08:16:47| 6.05 | 2| IO| DataFileRead| 06:13:41| 4.55 | 3| Timeout| 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| Verrou| tuple| 00:01:32| 0.02 | 8| Client| ClientRead| 00:01:19| 0.02 | 9| IO| BufFileRead| 00:00:37| 0.01 | 10| LWLock| buffer_content| 00:00:08| 0 +-----+------------------------------+--------------------+--------------------+----------
TYPES D'ATTENTES PAR TEMPS TOTAL D'ATTENTE, POUR LES PROCESSUS SYSTĂMES
RequĂȘte
SĂLECTIONNER
type_d'attente ,
get_system_waiting_type_duration( type_d'attente , pg_stat_history_begin+(current_hour_diff * interval '1 hour') , pg_stat_history_end+(current_hour_diff * interval '1 hour') ) as durée
DE
activity_hist.archive_pg_stat_activity aa
OĂ
timepoint ENTRE pg_stat_history_begin+(current_hour_diff * interval '1 hour') ET pg_stat_history_end+(current_hour_diff * interval '1 hour') ET backend_type != 'client backend' ET type_d'attente EST NOT NULL
GROUP BY type_d'attente
ORDRE PAR 2 DESCExemple
+-----+------------------------------+-------------------- | #| type_d_attente| durée +-----+------------------------------+-------------------- | 1| Activité| 53:08:45 | 2| I/O| 00:06:24 | 3| LWLock| 00:03:02 +-----+------------------------------+--------------------
TYPES D'ATTENTE PAR TEMPS D'ATTENTE TOTAL, POUR LES PROCESSES CLIENT
RequĂȘte
SELECT
type_d_attente ,
get_clients_waiting_type_duration( type_d_attente , pg_stat_history_begin+(current_hour_diff * interval '1 hour') , pg_stat_history_end+(current_hour_diff * interval '1 hour') ) as durée
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 backend_type = 'client backend' AND type_d_attente IS NOT NULL
GROUP BY type_d_attente
ORDER BY 2 DESCExemple
+-----+------------------------------+--------------------+-------------------- | #| type_d_attente| durée| % dbtime +-----+------------------------------+--------------------+-------------------- | 1| Verrou| 08:18:19| 6.07 | 2| I/O| 06:16:01| 4.58 | 3| Délai| 02:53:21| 2.11 | 4| LWLock| 00:58:12| 0.71 | 5| Client| 00:01:19| 0.02 | 6| IPC| 00:00:04| 0 +-----+------------------------------+--------------------+--------------------
DurĂ©es d'attente, pour les processus systĂšme et les requĂȘtes individuelles.
ATTENTES POUR LES PROCESSES SYSTĂMES
RequĂȘte
SELECT
type_backend , datname , type_d_attente , évÚnement_d_attente , get_backend_type_waiting_duration( type_backend , type_d_attente , évÚnement_d_attente , pg_stat_history_begin+(current_hour_diff * interval '1 hour') , pg_stat_history_end+(current_hour_diff * interval '1 hour') ) as durée
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 type_backend != 'client backend' AND type_d_attente IS NOT NULL
GROUP BY type_backend , datname , type_d_attente , évÚnement_d'attente
ORDER BY 5 DESCExemple
+-----+-----------------------------+----------+--------------------+----------------------+-------------------- | #| backend_type| dbname| wait_event_type| wait_event| duration +-----+-----------------------------+----------+--------------------+----------------------+-------------------- | 1| lancement de réplication logique| | Activité| LogicalLauncherMain| 10:43:28 | 2| lancement d'autovacuum| | Activité| AutoVacuumMain| 10:42:49 | 3| walwriter| | Activité| WalWriterMain| 10:28:53 | 4| vérificateur| | Activité| CheckpointerMain| 10:23:50 | 5| écrivain d'arriÚre-plan| | Activité| BgWriterMain| 09:11:59 | 6| écrivain d'arriÚre-plan| | Activité| BgWriterHibernate| 01:37:46 | 7| travailleur parallÚle| tdb1| IO| BufFileWrite| 00:02:35 | 8| travailleur parallÚle| tdb1| LWLock| buffer_mapping| 00:01:41 | 9| travailleur parallÚle| tdb1| IO| DataFileRead| 00:01:22 | 10| travailleur parallÚle| tdb1| IO| BufFileRead| 00:00:59 | 11| walwriter| | IO| WALWrite| 00:00:57 | 12| travailleur parallÚle| tdb1| LWLock| buffer_io| 00:00:47 | 13| travailleur d'autovacuum| tdb1| LWLock| buffer_mapping| 00:00:13 | 14| écrivain d'arriÚre-plan| | IO| DataFileWrite| 00:00:12 | 15| vérificateur| | IO| DataFileWrite| 00:00:11 | 16| walwriter| | LWLock| WALWriteLock| 00:00:09 | 17| vérificateur| | LWLock| WALWriteLock| 00:00:06 | 18| écrivain d'arriÚre-plan| | LWLock| WALWriteLock| 00:00:06 | 19| walwriter| | IO| WALInitWrite| 00:00:02 | 20| travailleur d'autovacuum| tdb1| LWLock| WALWriteLock| 00:00:02 | 21| walwriter| | IO| WALInitSync| 00:00:02 | 22| travailleur d'autovacuum| tdb1| IO| DataFileRead| 00:00:01 | 23| vérificateur| | IO| ControlFileSyncUpdate| 00:00:01 | 24| écrivain d'arriÚre-plan| | IO| WALWrite| 00:00:01 | 25| écrivain d'arriÚre-plan| | IO| DataFileFlush| 00:00:01 | 26| vérificateur| | IO| SLRUFlushSync| 00:00:01 | 27| travailleur d'autovacuum| tdb1| IO| WALWrite| 00:00:01 | 28| vérificateur| | IO| DataFileSync| 00:00:01 +-----+-----------------------------+----------+--------------------+----------------------+--------------------
ATTENTES POUR SQL â attentes pour des requĂȘtes spĂ©cifiques par queryid
RequĂȘte
SĂLECTIONNER
queryid, datname, wait_event_type, wait_event, get_query_waiting_duration( queryid, wait_event_type, wait_event, pg_stat_history_begin+(current_hour_diff * interval '1 hour'), pg_stat_history_end+(current_hour_diff * interval '1 hour') ) comme durée
FROM
activity_hist.archive_pg_stat_activity aa
WHERE
timepoint ENTRE pg_stat_history_begin+(current_hour_diff * interval '1 hour') ET pg_stat_history_end+(current_hour_diff * interval '1 hour') ET backend_type = 'client backend' ET wait_event_type EST NON NULL ET queryid EST NON NULL
GROUPE PAR queryid, datname, wait_event_type, wait_event
ORDER BY 1, 5 DESC Exemple
+-----+-------------------------+----------+--------------------+--------------------+--------------------+-------------------- | #| queryid| dbname| wait_event_type| wait_event| waitings| total | | | | | | duration| duration +-----+-------------------------+----------+--------------------+--------------------+--------------------+-------------------- | 1| -8247416849404883188| tdb1| Client| ClientRead| 00:00:02| | 2| -6572922443698419129| tdb1| Client| ClientRead| 00:00:05| | 3| -6572922443698419129| tdb1| IO| DataFileRead| 00:00:01| | 4| -5917408132400665328| tdb1| Client| ClientRead| 00:00:04| | 5| -4091009262735781873| tdb1| Client| ClientRead| 00:00:03| | 6| -1473395109729441239| tdb1| Client| ClientRead| 00:00:01| | 7| 28942442626229688| tdb1| IO| BufFileWrite| 00:01:34| 00:46:06 | 8| 28942442626229688| tdb1| LWLock| buffer_mapping| 00:01:05| 00:46:06 | 9| 28942442626229688| tdb1| IO| DataFileRead| 00:00:44| 00:46:06 | 10| 28942442626229688| tdb1| IO| BufFileRead| 00:00:37| 00:46:06 | 11| 28942442626229688| tdb1| LWLock| buffer_io| 00:00:35| 00:46:06 | 12| 28942442626229688| tdb1| Client| ClientRead| 00:00:05| 00:46:06 | 13| 28942442626229688| tdb1| IPC| MessageQueueReceive| 00:00:03| 00:46:06 | 14| 28942442626229688| tdb1| IPC| BgWorkerShutdown| 00:00:01| 00:46:06 | 15| 389015618226997618| tdb1| Lock| transactionid| 03:55:09| 04:14:15 | 16| 389015618226997618| tdb1| IO| DataFileRead| 03:23:09| 04:14:15 | 17| 389015618226997618| tdb1| LWLock| buffer_mapping| 00:12:09| 04:14:15 | 18| 389015618226997618| tdb1| LWLock| buffer_io| 00:10:18| 04:14:15 | 19| 389015618226997618| tdb1| Lock| tuple| 00:00:35| 04:14:15 | 20| 389015618226997618| tdb1| LWLock| WALWriteLock| 00:00:02| 04:14:15 | 21| 389015618226997618| tdb1| IO| DataFileWrite| 00:00:01| 04:14:15 | 22| 389015618226997618| tdb1| LWLock| SyncScanLock| 00:00:01| 04:14:15 | 23| 389015618226997618| tdb1| Client| ClientRead| 00:00:01| 04:14:15 | 24| 734234407411547467| tdb1| Client| ClientRead| 00:00:11| | 25| 734234407411547467| tdb1| LWLock| buffer_mapping| 00:00:05| | 26| 734234407411547467| tdb1| IO| DataFileRead| 00:00:02| | 27| 1237430309438971376| tdb1| LWLock| buffer_mapping| 00:02:18| 02:45:40 | 28| 1237430309438971376| tdb1| IO| DataFileRead| 00:00:27| 02:45:40 | 29| 1237430309438971376| tdb1| Client| ClientRead| 00:00:02| 02:45:40 | 30| 2404820632950544954| tdb1| Client| ClientRead| 00:00:01| | 31| 2515308626622579467| tdb1| Client| ClientRead| 00:00:02| | 32| 4710212362688288619| tdb1| LWLock| buffer_mapping| 00:03:08| 02:18:21 | 33| 4710212362688288619| tdb1| IO| DataFileRead| 00:00:22| 02:18:21 | 34| 4710212362688288619| tdb1| Client| ClientRead| 00:00:06| 02:18:21 | 35| 4710212362688288619| tdb1| LWLock| buffer_io| 00:00:02| 02:18:21 | 36| 9150846928388977274| tdb1| IO| DataFileRead| 00:01:19| | 37| 9150846928388977274| tdb1| LWLock| buffer_mapping| 00:00:34| | 38| 9150846928388977274| tdb1| Client| ClientRead| 00:00:10| | 39| 9150846928388977274| tdb1| LWLock| buffer_io| 00:00:01| +-----+-------------------------+----------+--------------------+--------------------+--------------------+--------------------
STATISTIQUES SQL CLIENT â TOP des requĂȘtes
Les requĂȘtes pour obtenir Ă nouveau, sont triviales et pour Ă©conomiser de l'espace, ne sont pas indiquĂ©es.
Exemples
+------------------------------------------------------------------------------------ | CLIENT SQL classĂ© par Temps ĂcoulĂ© +--------------------+----------+----------+----------+----------+----------+-------------------- | temps Ă©coulĂ©| appels| % dbtime| % CPU| % IO| nom_base| 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 classĂ© par Temps CPU +--------------------+----------+----------+----------+----------+----------+----------+-------------------- | temps cpu| appels| % dbtime|temps_total| % CPU| % IO| nom_base| 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 classĂ© par Temps d'Attente I/O Utilisateur +--------------------+----------+----------+----------+----------+----------+----------+-------------------- | temps_io_wait| appels| % dbtime|temps_total| % CPU| % IO| nom_base| 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 classĂ© par Lectures des Buffers PartagĂ©s +--------------------+----------+----------+----------+----------+----------+----------+-------------------- | lectures buffers| appels| % dbtime|temps_total| % CPU| % IO| nom_base| 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 classĂ© par Temps de Lectures de Disque +--------------------+----------+----------+----------+----------+----------+----------+-------------------- | temps lecture| appels| % dbtime|temps_total| % CPU| % IO| nom_base| 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 classĂ© par ExĂ©cutions +--------------------+----------+----------+----------+----------+----------+----------+-------------------- | appels| lignes| % dbtime|temps_total| % CPU| % IO| nom_base| 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 +--------------------+----------+----------+----------+----------+----------+----------+--------------------
Conclusion
En utilisant les requĂȘtes prĂ©sentĂ©es et les rapports obtenus, vous pouvez obtenir une vision plus complĂšte pour analyser et rĂ©soudre les problĂšmes de dĂ©gradation des performances, tant pour les requĂȘtes individuelles que pour l'ensemble du cluster.
Développement
Les projets de développement suivants sont en cours :
- ComplĂ©ter les rapports avec l'historique des verrouillages. Les requĂȘtes sont en cours de test et seront prĂ©sentĂ©es prochainement.
- Utiliser l'extension TimescaleDB pour stocker l'historique de pg_stat_activity et pg_locks.
- Préparer une solution en lot sur GitHub pour un déploiement massif sur les bases de données de production.
Ă suivre...
Source : habr.com
