แžœแžทแž’แžธแžŸแžถแžŸแŸ’แžšแŸ’แžแž˜แžฝแž™แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž‘แž‘แžฝแž›แž”แžถแž“แž‘แž˜แŸ’แžšแž„แŸ‹แž”แž“แŸ’แž‘แžปแž€แž€แžถแžšแž„แžถแžš แž“แžทแž„แž”แŸ’แžšแžœแžแŸ’แžแžทแžšแž„แŸ‹แž…แžถแŸ†แž“แŸ…แž€แŸ’แž“แžปแž„ PostgreSQL

แž€แžถแžšแž”แž“แŸ’แžแž“แŸƒแžขแžแŸ’แžแž”แž‘ "แž€แžถแžšแž”แŸ‰แžปแž“แž”แŸ‰แž„แž”แž„แŸ’แž€แžพแžแžขแžถแžŽแžถแžกแžผแž€ ASH แžŸแž˜แŸ’แžšแžถแž”แŸ‹ PostgreSQL "แŸ”

แžขแžแŸ’แžแž”แž‘แž“แžนแž„แž–แžทแž“แžทแžแŸ’แž™ แž“แžทแž„แž”แž„แŸ’แž แžถแž‰ แžŠแŸ„แž™แž”แŸ’แžšแžพแžŸแŸ†แžŽแžฝแžš แž“แžทแž„แžงแž‘แžถแž แžšแžŽแŸแž‡แžถแž€แŸ‹แž›แžถแž€แŸ‹ แžแžพแž–แŸแžแŸŒแž˜แžถแž“แž˜แžถแž“แž”แŸ’แžšแž™แŸ„แž‡แž“แŸแžขแŸ’แžœแžธแžแŸ’แž›แŸ‡แžขแžถแž…แž‘แž‘แžฝแž›แž”แžถแž“แžŠแŸ„แž™แž”แŸ’แžšแžพแž”แŸ’แžšแžœแžแŸ’แžแžทแž“แŸƒแž‘แžทแžŠแŸ’แž‹แž—แžถแž– pg_stat_activity แŸ”

แž–แŸ’แžšแž˜แžถแž“
แžŠแŸ„แž™แžŸแžถแžšแžแŸ‚แž—แžถแž–แžแŸ’แž˜แžธแžแŸ’แž˜แŸ„แž„แž“แŸƒแž”แŸ’แžšแž’แžถแž“แž”แž‘ แž“แžทแž„แžšแž™แŸˆแž–แŸแž›แžŸแžถแž€แž›แŸ’แž”แž„แž˜แžทแž“แž‘แžถแž“แŸ‹แž”แž‰แŸ’แž…แž”แŸ‹ แžขแžแŸ’แžแž”แž‘แžขแžถแž…แž˜แžถแž“แž€แŸ†แž แžปแžŸแŸ” แž€แžถแžšแžšแžทแŸ‡แž‚แž“แŸ‹ แž“แžทแž„แž˜แžแžทแžแŸ’แžšแžผแžœแž”แžถแž“แžŸแŸ’แžœแžถแž‚แž˜แž“แŸแž™แŸ‰แžถแž„แžแŸ’แž›แžถแŸ†แž„ แž“แžทแž„แžšแŸ†แž–แžนแž„แž‘แžปแž€แŸ”

แž”แž‰แŸ’แž…แžผแž›โ€‹แž‘แžทแž“แŸ’แž“แž“แŸแž™

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 );

แžแžถแžšแžถแž„แžแŸ’แžšแžผแžœแž”แžถแž“แž”แž‰แŸ’แž…แžผแž›แžšแžถแž›แŸ‹แž˜แŸ‰แŸ„แž„แžŠแŸ„แž™แž”แŸ’แžšแžพ dblink แž‘แŸ…แž€แžถแž“แŸ‹แž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž‘แžทแž“แŸ’แž“แž“แŸแž™แž‚แŸ„แž›แžŠแŸ…แŸ” แž‡แžถแž€แžถแžšแž–แžทแžแžŽแžถแžŸแŸ‹แž‡แžฝแžšแžˆแžšแž‚แžฝแžšแžฑแŸ’แž™แž…แžถแž”แŸ‹แžขแžถแžšแž˜แŸ’แž˜แžŽแŸแž“แžทแž„แž˜แžถแž“แž”แŸ’แžšแž™แŸ„แž‡แž“แŸแž”แŸ†แž•แžปแžแž“แŸ…แž€แŸ’แž“แžปแž„แžแžถแžšแžถแž„ แžŸแŸ†แžŽแžฝแžš.

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
);

แžแžถแžšแžถแž„แž‚แžบแž‡แžถแžแžถแžšแžถแž„ history_pg_stat_activity แžŠแŸ‚แž›แž”แŸ‚แž„แž…แŸ‚แž€แžแžถแž˜แž˜แŸ‰แŸ„แž„ (แž–แŸแžแŸŒแž˜แžถแž“แž›แž˜แŸ’แžขแžทแžแž”แž“แŸ’แžแŸ‚แž˜แž“แŸ…แž‘แžธแž“แŸแŸ‡ - pg_stat_statements + pg_stat_activity + loq_query = pg_ash? แž แžพแž™แž“แŸ…แž‘แžธแž“แŸแŸ‡ - แž€แžถแžšแž”แŸ‰แžปแž“แž”แŸ‰แž„แž”แž„แŸ’แž€แžพแž analogue แž“แŸƒ ASH แžŸแž˜แŸ’แžšแžถแž”แŸ‹ PostgreSQL แŸ” )

แž›แž‘แŸ’แž’แž•แž›

CLUSTER CPU TIME (แž”แŸ’แžšแž–แŸแž“แŸ’แž’ + แžขแžแžทแžแžทแž‡แž“)

แžŸแŸ†แžŽแžพ

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
			aa.state = 'active'
 )
 SELECT count(*) 
 INTO cpu_total
 FROM t ;

แžงแž‘แžถแž แžšแžŽแŸ:

CLUSTER CPU TIME (SYSTEM + CLIENTS ) : 28:37:46

CLUSTER แž–แŸแž›แžœแŸแž›แžถแžšแž„แŸ‹แž…แžถแŸ†

แžŸแŸ†แžŽแžพ

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'
 )
 SELECT count(*) 
 INTO cpu_total
 FROM t ;

แžงแž‘แžถแž แžšแžŽแŸ:

CLUSTER WAITINGS TIME : 30:12:49

แžแž˜แŸ’แž›แŸƒแžŸแžšแžปแž” pg_stat_statements

แžŸแŸ†แžŽแžพ

 --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 - แž–แŸแž›แžœแŸแž›แžถแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแžŸแŸ†แžŽแžฝแžšแžŸแžšแžปแž”

แžŸแŸ†แžŽแžพ

dbtime_total = interval '1 millisecond' * pg_total_stat_history_rec.total_time ;

แžงแž‘แžถแž แžšแžŽแŸ:

SQL DBTIME : 136:49:36

SQL CPU TIME - แž–แŸแž›แžœแŸแž›แžถแžŸแŸŠแžธแž—แžธแž™แžผแž…แŸ†แžŽแžถแž™แž€แŸ’แž“แžปแž„แž€แžถแžšแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแžŸแŸ†แžŽแžฝแžš

แžŸแŸ†แžŽแžพ

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 ;

แžงแž‘แžถแž แžšแžŽแŸ:

SQL CPU TIME : 27:40:15

SQL WAITINGS TIME - แž–แŸแž›แžœแŸแž›แžถแžšแž„แŸ‹แž…แžถแŸ†แžŸแžšแžปแž”แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžŸแŸ†แžŽแžฝแžš

แžŸแŸ†แžŽแžพ

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 ;

แžงแž‘แžถแž แžšแžŽแŸ:

SQL WAITINGS TIME : 30:04:09

แžŸแŸ†แžŽแžฝแžšแžแžถแž„แž€แŸ’แžšแŸ„แž˜แž‡แžถแžŸแŸ†แžŽแžฝแžšแžแŸ’แž›แžธแŸ— แž แžพแž™แž–แŸแžแŸŒแž˜แžถแž“แž›แž˜แŸ’แžขแžทแžแž“แŸƒแž€แžถแžšแžขแž“แžปแžœแžแŸ’แžแžแŸ’แžšแžผแžœแž”แžถแž“แž›แžปแž”แž…แŸ„แž› แžŠแžพแž˜แŸ’แž”แžธแžŸแž“แŸ’แžŸแŸ†แž‘แŸ†แž แŸ†แŸ–

แžงแž‘แžถแž แžšแžŽแŸ:

| 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

แž…แžผแžšแž”แž“แŸ’แžแž‘แŸ…แž•แŸ’แž“แŸ‚แž€แžŠแŸ‚แž›แž‚แžฝแžšแžฑแŸ’แž™แž…แžถแž”แŸ‹แžขแžถแžšแž˜แŸ’แž˜แžŽแŸแž”แŸ†แž•แžปแžแŸ”

แž€แŸ†แž–แžปแž„แžšแž„แŸ‹แž…แžถแŸ†แž‹แžทแžแžทแžœแž“แŸ’แž

แž€แžถแžšแžšแž„แŸ‹แž…แžถแŸ†แž€แŸ†แž–แžผแž›แž‘แžถแŸ†แž„ 10 แžŠแŸ„แž™แž€แžถแžšแžšแž„แŸ‹แž…แžถแŸ†แžŸแžšแžปแž”แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžšแž”แžŸแŸ‹แžขแžแžทแžแžทแž‡แž“

แžŸแŸ†แžŽแžพ

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 10

แžงแž‘แžถแž แžšแžŽแŸ:

+------------------------------------------------ ----------------------------------- | แž€แžถแžšแžšแž„แŸ‹แž…แžถแŸ†แž€แŸ†แž–แžผแž›แž‘แžถแŸ†แž„ 10 แžŠแŸ„แž™แž€แžถแžšแžšแž„แŸ‹แž…แžถแŸ†แžŸแžšแžปแž”แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž”แŸ’แžšแž–แŸแž“แŸ’แž’ +-----+--------------------------------+-- ------------------+-------------------- | #| wait_event_type| wait_event| แžšแž™แŸˆแž–แŸแž› +-----+--------------------------------+---------------- -------+---------- | แŸก| แžŸแž€แž˜แŸ’แž˜แž—แžถแž–| LogicalLauncherMain| 1:10:43 | แŸข| แžŸแž€แž˜แŸ’แž˜แž—แžถแž–| AutoVacuumMain| 28:2:10 | แŸฃ| แžŸแž€แž˜แŸ’แž˜แž—แžถแž–| WalWriterMain| 42:49:3 | แŸค| แžŸแž€แž˜แŸ’แž˜แž—แžถแž–| CheckpointerMain| 10:28:53 | แŸฅ| แžŸแž€แž˜แŸ’แž˜แž—แžถแž–| BgWriterMain| แŸ แŸฉ:แŸกแŸก:แŸฅแŸฉ | แŸฆ| แžŸแž€แž˜แŸ’แž˜แž—แžถแž–| BgWriterHibernate| 4:10:23 | แŸง| แžขแžถแž™แžขแžผ | BufFileWrite| 50:5:09 | แŸจ| LWLock| buffer_mapping| 11:59:6 | แŸฉ| แžขแžถแž™แžขแžผ | DataFileRead| 01:37:46 | แŸกแŸ | แžขแžถแž™แžขแžผ | WALWrite| 7:00:02 +-----+--------------------------------+--------- ----------+-----------

แž€แžถแžšแžšแž„แŸ‹แž…แžถแŸ†แž€แŸ†แž–แžผแž›แž‘แžถแŸ†แž„ 10 แžŠแŸ„แž™แž€แžถแžšแžšแž„แŸ‹แž…แžถแŸ†แžŸแžšแžปแž”แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžšแž”แžŸแŸ‹แžขแžแžทแžแžทแž‡แž“

แžŸแŸ†แžŽแžพ

SELECT 
  wait_event_type , wait_event ,
  get_clients_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 10

แžงแž‘แžถแž แžšแžŽแŸ:

----------+--------------------------------+--------- -----------+----------+---------- | #| wait_event_type| wait_event| แžšแž™แŸˆแž–แŸแž› | % dbtime ----+--------------------------------+---------- ----------+----------+---------- | แŸก| แž…แžถแž€แŸ‹แžŸแŸ„| แž›แŸแžแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžš| แŸ แŸจ:แŸกแŸฆ:แŸคแŸง| 1 | แŸข| แžขแžถแž™แžขแžผ | DataFileRead| แŸ แŸฆ:แŸกแŸฃ:แŸคแŸก| แŸค.แŸฅแŸฅ | แŸฃ| แžขแžŸแŸ‹แž–แŸแž›| PgSleep| แŸ แŸข:แŸฅแŸฃ:แŸขแŸก | 08 | แŸค| LWLock| buffer_mapping| 16:47:6.05| 2 | แŸฅ| LWLock| buffer_io| 06:13:41| 4.55 | แŸฆ| แžขแžถแž™แžขแžผ | BufFileWrite| 3:02:53| 21 | แŸง| แž…แžถแž€แŸ‹แžŸแŸ„| tuple| 2.11:4:00| 40 | แŸจ| แžขแžแžทแžแžทแž‡แž“ | แžขแžแžทแžแžทแž‡แž“แžขแžถแž“| 42:0.5:5| 00 | แŸฉ| แžขแžถแž™แžขแžผ | BufFileRead| 17:17:0.21| 6 | แŸกแŸ | LWLock| buffer_content| 00:01:34| 0.02 +-----+--------------------------------+----------------- --------+-----------+----------

แž”แŸ’แžšแž—แŸแž‘แž“แŸƒแž€แžถแžšแžšแž„แŸ‹แž…แžถแŸ†แžŠแŸ„แž™แž–แŸแž›แžœแŸแž›แžถแžšแž„แŸ‹แž…แžถแŸ†แžŸแžšแžปแž” แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž”แŸ’แžšแž–แŸแž“แŸ’แž’

แžŸแŸ†แžŽแžพ

SELECT 
  wait_event_type ,
  get_system_waiting_type_duration( wait_event_type , 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
ORDER BY 2 DESC

แžงแž‘แžถแž แžšแžŽแŸ:

----------+--------------------------------+--------- ----------- | #| wait_event_type| แžšแž™แŸˆแž–แŸแž› +-----+--------------------------------+---------------- ------- | แŸก| แžŸแž€แž˜แŸ’แž˜แž—แžถแž–| 1:53:08 | แŸข| แžขแžถแž™แžขแžผ | 45:2:00 | แŸฃ| LWLock| 06:24:3 +-----+--------------------------------+------ -------------

แž”แŸ’แžšแž—แŸแž‘แž“แŸƒแž€แžถแžšแžšแž„แŸ‹แž…แžถแŸ†แžŠแŸ„แž™แž–แŸแž›แžœแŸแž›แžถแžšแž„แŸ‹แž…แžถแŸ†แžŸแžšแžปแž” แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžšแž”แžŸแŸ‹แžขแžแžทแžแžทแž‡แž“

แžŸแŸ†แžŽแžพ

SELECT 
  wait_event_type ,
  get_clients_waiting_type_duration( wait_event_type , 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
ORDER BY 2 DESC

แžงแž‘แžถแž แžšแžŽแŸ:

----------+--------------------------------+--------- -----------+---------- | #| wait_event_type| แžšแž™แŸˆแž–แŸแž› | % dbtime ----+--------------------------------+---------- ----------+-------------------------------- | แŸก| แž…แžถแž€แŸ‹แžŸแŸ„| แŸ แŸจ:แŸกแŸจ:แŸกแŸฉ | 1 | แŸข| แžขแžถแž™แžขแžผ | แŸ แŸฆ:แŸกแŸฆ:แŸ แŸก| แŸค.แŸฅแŸจ | แŸฃ| แžขแžŸแŸ‹แž–แŸแž›| แŸ แŸข:แŸฅแŸฃ:แŸขแŸก | 08 | แŸค| LWLock| 18:19:6.07| 2 | แŸฅ| แžขแžแžทแžแžทแž‡แž“ | 06:16:01| 4.58 | แŸฆ| IPC| 3:02:53| 21 +-----+--------------------------------+----------------- --------+--------------------

แžšแž™แŸˆแž–แŸแž›แžšแž„แŸ‹แž…แžถแŸ†แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž”แŸ’แžšแž–แŸแž“แŸ’แž’ แž“แžทแž„แžŸแŸ†แžŽแžพแž”แžปแž‚แŸ’แž‚แž›แŸ”

แž€แŸ†แž–แžปแž„แžšแž„แŸ‹แž…แžถแŸ†แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž”แŸ’แžšแž–แŸแž“แŸ’แž’

แžŸแŸ†แžŽแžพ

SELECT 
  backend_type , datname , wait_event_type , wait_event , get_backend_type_waiting_duration( backend_type , 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 backend_type , datname , wait_event_type , wait_event
ORDER BY 5 DESC

แžงแž‘แžถแž แžšแžŽแŸ:

+-----+-----------------------------+----------+--------------------+----------------------+--------------------
|    #|                 backend_type|    dbname|     wait_event_type|            wait_event|            duration
+-----+-----------------------------+----------+--------------------+----------------------+--------------------
|    1| logical replication launcher|          |            Activity|   LogicalLauncherMain|            10:43:28
|    2|          autovacuum launcher|          |            Activity|        AutoVacuumMain|            10:42:49
|    3|                    walwriter|          |            Activity|         WalWriterMain|            10:28:53
|    4|                 checkpointer|          |            Activity|      CheckpointerMain|            10:23:50
|    5|            background writer|          |            Activity|          BgWriterMain|            09:11:59
|    6|            background writer|          |            Activity|     BgWriterHibernate|            01:37:46
|    7|              parallel worker|      tdb1|                  IO|          BufFileWrite|            00:02:35
|    8|              parallel worker|      tdb1|              LWLock|        buffer_mapping|            00:01:41
|    9|              parallel worker|      tdb1|                  IO|          DataFileRead|            00:01:22
|   10|              parallel worker|      tdb1|                  IO|           BufFileRead|            00:00:59
|   11|                    walwriter|          |                  IO|              WALWrite|            00:00:57
|   12|              parallel worker|      tdb1|              LWLock|             buffer_io|            00:00:47
|   13|            autovacuum worker|      tdb1|              LWLock|        buffer_mapping|            00:00:13
|   14|            background writer|          |                  IO|         DataFileWrite|            00:00:12
|   15|                 checkpointer|          |                  IO|         DataFileWrite|            00:00:11
|   16|                    walwriter|          |              LWLock|          WALWriteLock|            00:00:09
|   17|                 checkpointer|          |              LWLock|          WALWriteLock|            00:00:06
|   18|            background writer|          |              LWLock|          WALWriteLock|            00:00:06
|   19|                    walwriter|          |                  IO|          WALInitWrite|            00:00:02
|   20|            autovacuum worker|      tdb1|              LWLock|          WALWriteLock|            00:00:02
|   21|                    walwriter|          |                  IO|           WALInitSync|            00:00:02
|   22|            autovacuum worker|      tdb1|                  IO|          DataFileRead|            00:00:01
|   23|                 checkpointer|          |                  IO| ControlFileSyncUpdate|            00:00:01
|   24|            background writer|          |                  IO|              WALWrite|            00:00:01
|   25|            background writer|          |                  IO|         DataFileFlush|            00:00:01
|   26|                 checkpointer|          |                  IO|         SLRUFlushSync|            00:00:01
|   27|            autovacuum worker|      tdb1|                  IO|              WALWrite|            00:00:01
|   28|                 checkpointer|          |                  IO|          DataFileSync|            00:00:01
+-----+-----------------------------+----------+--------------------+----------------------+--------------------

แžšแž„แŸ‹แž…แžถแŸ†แžŸแž˜แŸ’แžšแžถแž”แŸ‹ SQL - แžšแž„แŸ‹แž…แžถแŸ†แžŸแŸ†แžŽแžฝแžšแž“แžธแž˜แžฝแž™แŸ—แžŠแŸ„แž™ queryid

แžŸแŸ†แžŽแžพ

SELECT 
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') ) 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 AND queryid IS NOT NULL 
GROUP BY queryid , datname , wait_event_type , wait_event
ORDER BY 1 , 5 DESC 

แžงแž‘แžถแž แžšแžŽแŸ:

+-----+-------------------------+----------+--------------------+--------------------+--------------------+--------------------
|    #|                  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|
+-----+-------------------------+----------+--------------------+--------------------+--------------------+--------------------

แžŸแŸ’แžแžทแžแžท SQL แžšแž”แžŸแŸ‹แžขแžแžทแžแžทแž‡แž“ - แžŸแŸ†แžŽแžฝแžšแž€แŸ†แž–แžผแž›

แžŸแŸ†แžŽแžพโ€‹แžŸแžปแŸ†โ€‹แž‘แž‘แžฝแž›โ€‹แž‚แžบโ€‹แž‡แžถโ€‹แžšแžฟแž„โ€‹แžแžผแž…แžแžถแž…โ€‹แž˜แŸ’แžŠแž„โ€‹แž‘แŸ€แž แž แžพแž™โ€‹แž˜แžทแž“โ€‹แžแŸ’แžšแžผแžœโ€‹แž”แžถแž“โ€‹แž•แŸ’แžŠแž›แŸ‹โ€‹แžฑแŸ’แž™โ€‹แžŠแžพแž˜แŸ’แž”แžธโ€‹แžŸแž“แŸ’แžŸแŸ†โ€‹แž‘แŸ†แž แŸ†โ€‹แž‘แŸแŸ”

แžงแž‘แž แžšแžŽแŸ

+------------------------------------------------------------------------------------
| CLIENT SQL ordered by Elapsed Time
+--------------------+----------+----------+----------+----------+----------+--------------------
|        elapsed time|     calls|  % dbtime|     % CPU|      % IO|    dbname|             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 ordered by CPU Time
+--------------------+----------+----------+----------+----------+----------+----------+--------------------
|            cpu time|     calls|  % dbtime|total_time|     % CPU|      % IO|    dbname|             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 ordered by User I/O Wait Time
+--------------------+----------+----------+----------+----------+----------+----------+--------------------
|        io_wait time|     calls|  % dbtime|total_time|     % CPU|      % IO|    dbname|             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 ordered by Shared Buffers Reads
+--------------------+----------+----------+----------+----------+----------+----------+--------------------
|       buffers reads|     calls|  % dbtime|total_time|     % CPU|      % IO|    dbname|             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 ordered by Disk Reads Time
+--------------------+----------+----------+----------+----------+----------+----------+--------------------
|           read time|     calls|  % dbtime|total_time|     % CPU|      % IO|    dbname|             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 ordered by Executions
+--------------------+----------+----------+----------+----------+----------+----------+--------------------
|               calls|      rows|  % dbtime|total_time|     % CPU|      % IO|    dbname|             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
+--------------------+----------+----------+----------+----------+----------+----------+--------------------

แž›แž‘แŸ’แž’แž•แž›

แžŠแŸ„แž™แž”แŸ’แžšแžพแžŸแŸ†แžŽแžฝแžšแžŠแŸ‚แž›แž”แžถแž“แžŠแžถแž€แŸ‹แžŸแŸ’แž“แžพ แž“แžทแž„แžšแž”แžถแž™แž€แžถแžšแžŽแŸแž›แž‘แŸ’แž’แž•แž› แžขแŸ’แž“แž€แžขแžถแž…แž‘แž‘แžฝแž›แž”แžถแž“แžšแžผแž”แž—แžถแž–แž–แŸแž‰แž›แŸแž‰แž”แž“แŸ’แžแŸ‚แž˜แž‘แŸ€แžแžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแžœแžทแž—แžถแž‚ แž“แžทแž„แžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แž”แž‰แŸ’แž แžถแž“แŸƒแž€แžถแžšแžแž™แž…แžปแŸ‡แž€แžถแžšแžขแž“แžปแžœแžแŸ’แžแžŸแž˜แŸ’แžšแžถแž”แŸ‹แžŸแŸ†แžŽแžฝแžšแž“แžธแž˜แžฝแž™แŸ— แž“แžทแž„แž€แŸ’แžšแžปแž˜แž‘แžถแŸ†แž„แž˜แžผแž›แž‘แžถแŸ†แž„แž˜แžผแž›แŸ”

แž€แžถแžšแžขแž—แžทแžœแžŒแŸ’แžแž“แŸ

แžšแž แžผแžแž˜แž€แžŠแž›แŸ‹แž–แŸแž›แž“แŸแŸ‡ แž•แŸ‚แž“แž€แžถแžšแžขแž—แžทแžœแžŒแŸ’แžแž“แŸแž˜แžถแž“แžŠแžผแž…แžแžถแž„แž€แŸ’แžšแŸ„แž˜แŸ–

  • แž”แž“แŸ’แžแŸ‚แž˜แž€แžถแžšแžšแžถแž™แž€แžถแžšแžŽแŸแž‡แžถแž˜แžฝแž™แž“แžนแž„แž”แŸ’แžšแžœแžแŸ’แžแžทแž“แŸƒแž€แžถแžšแž‘แž”แŸ‹แžŸแŸ’แž€แžถแžแŸ‹แŸ” แžŸแŸ†แžŽแžพแž€แŸ†แž–แžปแž„แžแŸ’แžšแžผแžœแž”แžถแž“แžŸแžถแž€แž›แŸ’แž”แž„ แž แžพแž™แž“แžนแž„แžแŸ’แžšแžผแžœแž”แžถแž“แžŠแžถแž€แŸ‹แž‡แžผแž“แž€แŸ’แž“แžปแž„แž–แŸแž›แž†แžถแž”แŸ‹แŸ—แž“แŸแŸ‡แŸ”
  • แž”แŸ’แžšแžพแž•แŸ’แž“แŸ‚แž€แž”แž“แŸ’แžแŸ‚แž˜ TimescaleDB แžŠแžพแž˜แŸ’แž”แžธแžšแž€แŸ’แžŸแžถแž‘แžปแž€ pg_stat_activity แž“แžทแž„ pg_locks แž”แŸ’แžšแžœแžแŸ’แžแžทแŸ”
  • แžšแŸ€แž”แž…แŸ†แžŠแŸ†แžŽแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แž€แž‰แŸ’แž…แž”แŸ‹แž“แŸ…แž›แžพ github แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแžŠแžถแž€แŸ‹แž–แž„แŸ’แžšแžถแž™แž‘แŸ’แžšแž„แŸ‹แž‘แŸ’แžšแžถแž™แž’แŸ†แž“แŸ…แž›แžพแž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž•แž›แžทแžแž€แž˜แŸ’แž˜แŸ”

แž“แŸ…โ€‹แž˜แžถแž“โ€‹แž‡แžถโ€‹แž”แž“แŸ’แžโ€‹แž‘แŸ€แžโ€ฆ

แž”แŸ’แžšแž—แž–: www.habr.com

แž”แž“แŸ’แžแŸ‚แž˜แž˜แžแžทแž™แŸ„แž”แž›แŸ‹