Pag-monitor sa performance sa mga pangutana sa PostgreSQL. Bahin 1 - pagreport

Engineer - gihubad gikan sa Latin - dinasig.
Ang usa ka engineer makahimo sa bisan unsa. (c) R. Diesel.
Mga epigraph.
Pag-monitor sa performance sa mga pangutana sa PostgreSQL. Bahin 1 - pagreport
O usa ka istorya kung ngano nga ang usa ka tagdumala sa database kinahanglan nga hinumdoman ang iyang nangagi nga pagprograma.

Pasiuna

Giilisan ang tanang ngalan. Ang mga posporo random. Ang materyal kay personal ra nga opinyon sa tagsulat.

Disclaimer sa mga garantiya: sa giplano nga serye sa mga artikulo walay detalyado ug tukma nga paghulagway sa mga lamesa ug mga script nga gigamit. Ang mga materyales dili dayon magamit "AS IS".
Una, tungod sa kadaghan sa materyal,
ikaduha, tungod sa kahait sa produksyon base sa usa ka tinuod nga kustomer.
Busa, ang mga ideya ug mga deskripsyon lamang sa pinakakinatibuk-ang porma ang ihatag sa mga artikulo.
Tingali sa umaabot nga ang sistema motubo sa lebel nga ma-post sa GitHub, o tingali dili. Mopakita ang panahon.

Pagsugod sa istorya-Nahinumdom ka ba kung giunsa kini tanan nagsugod".
Unsa ang nahitabo ingon usa ka sangputanan, sa kadaghanan nga mga termino - "Synthesis isip usa sa mga pamaagi aron mapaayo ang performance sa PostgreSQLΒ»

Nganong gikinahanglan ko kining tanan?

Aw, una, aron dili makalimtan ang imong kaugalingon, paghinumdom sa mahimayaon nga mga adlaw sa pagretiro.
Ikaduha, aron ma-systematize ang gisulat. Kay naa sa akong kaugalingon, usahay maglibog ko ug makalimot sa mga separadong parts.

Aw, ug labing importante - sa kalit kini mahimong magamit alang sa usa ka tawo ug makatabang nga dili mabag-o ang ligid ug dili mangolekta og rake. Sa laing pagkasulti, pauswaga ang imong karma (dili si Khabrovsky). Kay ang labing bililhon nga butang niining kalibutana mao ang mga ideya. Ang nag-unang butang mao ang pagpangita og ideya. Ug ang paghubad sa ideya ngadto sa kamatuoran usa na ka teknikal nga isyu.

Mao nga magsugod kita sa hinay-hinay ...

Pagporma sa problema.

Anaa:

PostgreSQL(10.5), mixed load (OLTP+DSS), medium to light load, gi-host sa AWS cloud.
Wala’y pag-monitor sa database; ang pag-monitor sa imprastraktura gihatag sa porma sa standard nga mga himan sa AWS sa gamay nga pagsumpo.

Gikinahanglan kini:

Pag-monitor sa pasundayag ug kahimtang sa database, pangitaa ug adunay inisyal nga kasayuran aron ma-optimize ang bug-at nga mga pangutana sa database.

Mubo nga pasiuna o pagtuki sa mga solusyon

Sa pagsugod, atong sulayan nga analisahon ang mga kapilian sa pagsulbad sa problema gikan sa punto sa pagtan-aw sa pagtandi nga pagtuki sa mga benepisyo ug kasamok alang sa inhenyero, ug tugoti ang mga kinahanglan nga naa sa lista sa mga kawani nga mag-atubang sa mga benepisyo ug kapildihan. sa pagdumala.

Opsyon 1 - "Pagtrabaho sa panginahanglan"

Gibiyaan namo ang tanan nga ingon niini. Kung ang kustomer dili matagbaw sa usa ka butang sa kahimsog, pasundayag sa database o aplikasyon, ipahibalo niya ang mga inhenyero sa DBA pinaagi sa e-mail o pinaagi sa paghimo og usa ka insidente sa kahon sa tiket.
Ang usa ka inhenyero, nga nakadawat usa ka pahibalo, makasabut sa problema, nagtanyag usa ka solusyon, o itago ang problema, naglaum nga ang tanan masulbad sa iyang kaugalingon, ug bisan pa, ang tanan sa dili madugay makalimtan.
Gingerbread ug mga donut, mga bun-og ug mga bun-ogGingerbread ug mga donut:
1. Walay dugang nga buhaton
2. Kanunay adunay higayon nga makagawas ug mahugawan.
3. Daghang panahon nga mahimo nimong igugol sa imong kaugalingong pagbuot.
Mga bun-og ug bun-og:
1. Sa madugay o sa madali, ang kustomer maghunahuna mahitungod sa esensya sa pagka-ug unibersal nga hustisya niining kalibutana ug sa makausa pa mangutana sa iyang kaugalingon sa pangutana - nganong ako nagbayad kanila sa akong salapi? Ang sangputanan mao ang kanunay nga managsama - ang bugtong pangutana mao kung ang kustomer mapul-an ug manamilit. Ug ang feeder walay sulod. Makasubo kini.
2. Ang pag-uswag sa usa ka engineer kay zero.
3. Mga kalisud sa pag-iskedyul sa trabaho ug pagkarga

Opsyon 2 - "Sayaw gamit ang mga tamburin, isul-ob ug isul-ob ang sapatos"

Parapo 1-Ngano nga kita kinahanglan sa usa ka monitoring nga sistema, kita makadawat sa tanan nga mga hangyo. Naglunsad kami og usa ka hugpong sa tanang matang sa mga pangutana ngadto sa diksyonaryo sa datos ug dinamikong mga panglantaw, i-on ang tanang matang sa mga counter, dad-on ang tanan ngadto sa mga lamesa, matag karon ug unya analisa ang mga lista ug mga lamesa, ingon nga kaniadto. Ingon usa ka sangputanan, kami adunay matahum o dili kaayo nga mga graph, mga lamesa, mga taho. Ang nag-unang butang - nga mahimong labaw pa, labaw pa.
Parapo 2-Paghimo og kalihokan-pagdagan ang pagtuki niining tanan.
Parapo 3-Nag-andam kami sa usa ka piho nga dokumento, gitawag namon kini nga dokumento, yano - "unsaon namon gisangkapan ang database."
Parapo 4-Ang kustomer, nga nakakita niining tanan nga katahum sa mga graph ug mga numero, naa sa usa ka bata, walay pulos nga pagsalig - karon ang tanan molihok alang kanamo, sa dili madugay. Ug, siya dali ug walay sakit nga nakigbahin sa iyang pinansyal nga mga kapanguhaan. Masaligon usab ang management nga maayo ang pagtrabaho sa among mga inhenyero. Nag-load sa labing taas.
Parapo 5- Balika ang lakang 1 kanunay.
Gingerbread ug mga donut, mga bun-og ug mga bun-ogGingerbread ug mga donut:
1. Ang kinabuhi sa mga manedyer ug mga inhenyero yano, matag-an ug puno sa kalihokan. Ang tanan nagsaba, ang tanan busy.
2. Dili usab daotan ang kinabuhi sa kustomer - sigurado siya nga kinahanglan nimo nga mapailubon gamay ug mahuman ang tanan. Dili kini maayo, maayo, maayo - kini nga kalibutan dili patas, sa sunod nga kinabuhi - swerte ka.
Mga bun-og ug bun-og:
1. Sa madugay o sa madali, adunay mas maalamon nga tighatag sa susama nga serbisyo nga mobuhat sa samang butang, apan mas barato. Ug kung parehas ang resulta, nganong magbayad pa. Nga modala na usab sa pagkahanaw sa feeder.
2. Laay na. Unsa ka boring ang bisan unsang gamay nga makahuluganon nga kalihokan.
3. Sama sa miaging bersyon - walay kalamboan. Apan alang sa usa ka inhenyero, ang minus mao nga, dili sama sa una nga kapilian, dinhi kinahanglan nimo nga kanunay nga maghimo usa ka IDB. Ug kana nagkinahanglan og panahon. Nga mahimong gastohon alang sa kaayohan sa imong minahal. Kay dili nimo maatiman ang imong kaugalingon, ang tanan nagpakabana kanimo.

Opsyon 3-Dili kinahanglan nga mag-imbento og bisikleta, kinahanglan nimo kini paliton ug isakay.

Ang mga inhenyero gikan sa ubang mga kompanya nahibal-an nga mokaon sa pizza nga adunay beer (oh, ang mahimayaon nga mga panahon sa St. Petersburg sa 90s). Gamiton nato ang mga sistema sa pag-monitor nga gihimo, gi-debug ug nagtrabaho, ug sa kinatibuk-an, nagdala sila og mga benepisyo (maayo, labing menos sa ilang mga tiglalang).
Gingerbread ug mga donut, mga bun-og ug mga bun-ogGingerbread ug mga donut:
1. Dili kinahanglan nga mag-usik ug panahon sa pag-imbento sa na-imbento na. Kuhaa ug gamita.
2. Ang mga sistema sa pagmonitor wala gisulat sa mga buang, ug siyempre kini mapuslanon.
3. Ang nagtrabaho nga mga sistema sa pagmonitor kasagarang naghatag ug mapuslanong nasala nga impormasyon.
Mga bun-og ug bun-og:
1. Ang inhenyero niini nga kaso dili usa ka enhinyero, apan usa lamang ka tiggamit sa produkto sa uban.O usa ka tiggamit.
2. Ang kustomer kinahanglan nga kombinsido sa panginahanglan sa pagpalit sa usa ka butang nga sa kasagaran dili niya gusto nga makasabut, ug siya kinahanglan nga dili, ug sa kinatibuk-ang budget alang sa tuig naaprobahan ug dili mausab. Unya kinahanglan nimo nga maggahin usa ka lahi nga kapanguhaan, i-configure kini alang sa usa ka piho nga sistema. Mga. Una kinahanglan nimo nga magbayad, magbayad ug magbayad pag-usab. Ug kuripot ang kustomer. Kini ang naandan niining kinabuhia.

Unsa ang buhaton, Chernyshevsky? Pertinent kaayo imong pangutana. (Kauban)

Niini nga partikular nga kaso ug sa kasamtangan nga sitwasyon, mahimo nimo nga gamay nga lahi - maghimo ta ug kaugalingong monitoring system.
Pag-monitor sa performance sa mga pangutana sa PostgreSQL. Bahin 1 - pagreport
Aw, dili usa ka sistema, siyempre, sa bug-os nga diwa sa pulong, kini kusog kaayo ug mapangahason, apan labing menos sa usa ka paagi nga mas sayon ​​​​alang sa imong kaugalingon ug pagkolekta og dugang nga impormasyon aron masulbad ang mga insidente sa pasundayag. Aron dili makit-an ang imong kaugalingon sa usa ka sitwasyon - "adto didto, wala ko kabalo kung asa, pangitaa kana, wala ko kahibalo kung unsa."

Unsa ang mga bentaha ug disbentaha niini nga kapilian:

Mga Pro:
1. Makapainteres kini. Aw, labing menos mas makapaikag kay sa kanunay nga "pag-urong sa datafile, pag-usab sa tablespace, ug uban pa."
2. Kini mga bag-ong kahanas ug bag-ong kalamboan. Nga sa umaabot, sa madugay o sa madali, mohatag og maayo nga gingerbread ug donuts.
Kahinumduman:
1. Kinahanglang magtrabaho. Trabaho ug daghan.
2. Kinahanglang kanunay nimong ipasabot ang kahulogan ug mga panglantaw sa tanang kalihokan.
3. Kinahanglang isakripisyo ang usa ka butang, tungod kay ang bugtong kahinguhaan nga magamit sa inhenyero - panahon - limitado sa Uniberso.
4. Ang pinakagrabe ug labing dili maayo - Ingon usa ka sangputanan, ang basura sama sa "Dili usa ka ilaga, dili usa ka baki, apan usa ka wala mailhi nga gamay nga hayop" mahimong mogawas.

Kinsa ang dili magpameligro sa usa ka butang dili moinom og champagne.
Busa, nagsugod ang kalingawan.

Kinatibuk-ang ideya - eskematiko

Pag-monitor sa performance sa mga pangutana sa PostgreSQL. Bahin 1 - pagreport
(Ilustrasyon nga gikuha gikan sa artikulo Β«Synthesis isip usa sa mga pamaagi aron mapaayo ang performance sa PostgreSQLΒ»)

Pagpatin-aw:

  • Ang target nga database gi-install gamit ang standard nga extension sa PostgreSQL nga "pg_stat_statements".
  • Sa database sa pagmonitor, naghimo kami usa ka set sa mga lamesa sa serbisyo aron tipigan ang kasaysayan sa pg_stat_statements sa inisyal nga yugto ug aron ma-configure ang mga sukatan ug pag-monitor sa umaabot.
  • Sa monitoring host, naghimo kami usa ka hugpong sa mga script sa bash, lakip ang alang sa pagmugna og mga insidente sa sistema sa tiket.

Mga lamesa sa serbisyo

Sa pagsugod, usa ka schematically nga gipasimple nga ERD, kung unsa ang nahitabo sa katapusan:
Pag-monitor sa performance sa mga pangutana sa PostgreSQL. Bahin 1 - pagreport
Mubo nga paghulagway sa mga lamesakatapusang punto - host, punto sa koneksyon sa pananglitan
database - mga kapilian sa database
pg_stat_history - usa ka talaan sa kasaysayan alang sa pagtipig sa temporaryo nga mga snapshot sa pagtan-aw sa pg_stat_statements sa target nga database
metric_glossary - diksyonaryo sa mga sukatan sa pasundayag
metric_config - pag-configure sa indibidwal nga mga sukatan
metriko - usa ka piho nga sukatan alang sa hangyo nga gibantayan
metric_alert_history - kasaysayan sa mga pasidaan sa pasundayag
log_query - service table para sa pagtipig sa mga parsed records gikan sa PostgreSQL log file nga gi-download gikan sa AWS
baseline - mga parameter sa yugto sa panahon nga gigamit ingon sukaranan
checkpoint - Pag-configure sa mga sukatan alang sa pagsusi sa kahimtang sa database
checkpoint_alert_history - kasaysayan sa pasidaan sa mga sukatan sa pagsusi sa status sa database
pg_stat_db_queries - lamesa sa serbisyo sa mga aktibo nga hangyo
activity_log - talaan sa serbisyo sa log sa kalihokan
trap_oid - lamesa sa serbisyo sa pag-configure sa lit-ag

Stage 1 - pagkolekta mga istatistika sa pasundayag ug pagkuha mga taho

Ang usa ka lamesa gigamit sa pagtipig sa impormasyon sa istatistika. pg_stat_history
pg_stat_history nga istruktura sa lamesa

                                          Talaan nga "public.pg_stat_history" Column | tipo | Mga Modifier--------------------+--------------------- -------------- -------------------------------- id | integer | dili null default nextval('pg_stat_history_id_seq'::regclass) snapshot_timestamp | timestamp nga walay timezone | database_id | integer | dbid | ood | userid | ood | pangutana | dako | pangutana | teksto | tawag | dako | kinatibuk-ang_panahon | doble nga katukma | min_panahon | doble nga katukma | max_time | doble nga katukma | mean_time | doble nga katukma | stddev_time | doble nga katukma | mga laray | dako | shared_blks_hit | dako | shared_blks_read | dako | shared_blks_dirtied | dako | shared_blks_written | dako | local_blks_hit | dako | local_blks_read | dako | local_blks_hugaw | dako | local_blks_written | dako | temp_blks_read | dako | temp_blks_written | dako | blk_read_time | doble nga katukma | blk_write_time | doble nga katukma | baseline_id | integer | Mga indeks: "pg_stat_history_pkey" PRIMARY KEY, btree (id) "database_idx" btree (database_id) "queryid_idx" btree (queryid) "snapshot_timestamp_idx" btree (snapshot_timestamp) Foreign-key nga mga limitasyon: (Yfdatabase_idx_id) ) SA DELETE CASCADE

Sama sa imong nakita, ang lamesa usa ra ka kumulatibo nga datos sa pagtan-aw pg_stat_nga mga pahayag sa target nga database.

Ang paggamit niini nga lamesa yano ra kaayo.

pg_stat_history magrepresentar sa natipon nga estadistika sa pagpatuman sa pangutana alang sa matag oras. Sa sinugdanan sa matag oras, human sa pagpuno sa lamesa, statistics pg_stat_nga mga pahayag i-reset sa pg_stat_statements_reset().
Mubo nga sulat: ang mga estadistika gikolekta alang sa mga hangyo nga adunay gidugayon nga labaw pa sa 1 segundo.
Pag-populate sa pg_stat_history nga lamesa

--pg_stat_history.sql
CREATE OR REPLACE FUNCTION pg_stat_history( ) RETURNS boolean AS $$
DECLARE
  endpoint_rec record ;
  database_rec record ;
  pg_stat_snapshot record ;
  current_snapshot_timestamp timestamp without time zone;
BEGIN
  current_snapshot_timestamp = date_trunc('minute',now());  
  
  FOR endpoint_rec IN SELECT * FROM endpoint 
  LOOP
    FOR database_rec IN SELECT * FROM database WHERE endpoint_id = endpoint_rec.id 
	  LOOP
	    
		RAISE NOTICE 'NEW SHAPSHOT IS CREATING';
		
		--Connect to the target DB	  
	    EXECUTE 'SELECT dblink_connect(''LINK1'',''host='||endpoint_rec.host||' dbname='||database_rec.name||' user=USER password=PASSWORD '')';
 
        RAISE NOTICE 'host % and dbname % ',endpoint_rec.host,database_rec.name;
		RAISE NOTICE 'Creating snapshot of pg_stat_statements for database %',database_rec.name;
		
		SELECT 
	      *
		INTO 
		  pg_stat_snapshot
	    FROM dblink('LINK1',
	      'SELECT 
	       dbid , SUM(calls),SUM(total_time),SUM(rows) ,SUM(shared_blks_hit) ,SUM(shared_blks_read) ,SUM(shared_blks_dirtied) ,SUM(shared_blks_written) , 
           SUM(local_blks_hit) , SUM(local_blks_read) , SUM(local_blks_dirtied) , SUM(local_blks_written) , SUM(temp_blks_read) , SUM(temp_blks_written) , SUM(blk_read_time) , SUM(blk_write_time)
	       FROM pg_stat_statements WHERE dbid=(SELECT oid from pg_database where datname=current_database() ) 
		   GROUP BY dbid
  	      '
	               )
	      AS t
	       ( dbid oid , calls bigint , 
  	         total_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	  
	       );
		 
		INSERT INTO pg_stat_history
          ( 
		    snapshot_timestamp  ,database_id  ,
			dbid , calls  ,total_time ,
            rows ,shared_blks_hit  ,shared_blks_read  ,shared_blks_dirtied  ,shared_blks_written ,local_blks_hit , 	 	
            local_blks_read,local_blks_dirtied,local_blks_written,temp_blks_read,temp_blks_written, 	
            blk_read_time, blk_write_time 
		  )		  
	    VALUES
	      (
	       current_snapshot_timestamp ,
		   database_rec.id ,
	       pg_stat_snapshot.dbid ,pg_stat_snapshot.calls,
	       pg_stat_snapshot.total_time,
	       pg_stat_snapshot.rows ,pg_stat_snapshot.shared_blks_hit ,pg_stat_snapshot.shared_blks_read ,pg_stat_snapshot.shared_blks_dirtied ,pg_stat_snapshot.shared_blks_written , 
           pg_stat_snapshot.local_blks_hit , pg_stat_snapshot.local_blks_read , pg_stat_snapshot.local_blks_dirtied , pg_stat_snapshot.local_blks_written , 
	       pg_stat_snapshot.temp_blks_read , pg_stat_snapshot.temp_blks_written , pg_stat_snapshot.blk_read_time , pg_stat_snapshot.blk_write_time 	   
	      );		   
		  
        RAISE NOTICE 'Creating snapshot of pg_stat_statements for queries with min_time more than 1000ms';
	
        FOR pg_stat_snapshot IN
          --All queries with max_time greater than 1000 ms
	      SELECT 
	        *
	      FROM dblink('LINK1',
	        'SELECT 
	         dbid , userid ,queryid,query,calls,total_time,min_time ,max_time,mean_time, stddev_time ,rows ,shared_blks_hit ,
			 shared_blks_read ,shared_blks_dirtied ,shared_blks_written , 
             local_blks_hit , local_blks_read , local_blks_dirtied , 
			 local_blks_written , temp_blks_read , temp_blks_written , blk_read_time , 
			 blk_write_time
	         FROM pg_stat_statements 
			 WHERE dbid=(SELECT oid from pg_database where datname=current_database() AND min_time >= 1000 ) 
  	        '

	                  )
	        AS t
	         ( 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	  
	         )
	    LOOP
		  INSERT INTO pg_stat_history
          ( 
		    snapshot_timestamp  ,database_id  ,
			dbid ,userid  , queryid  , query  , calls  ,total_time ,min_time ,max_time ,mean_time ,stddev_time ,
            rows ,shared_blks_hit  ,shared_blks_read  ,shared_blks_dirtied  ,shared_blks_written ,local_blks_hit , 	 	
            local_blks_read,local_blks_dirtied,local_blks_written,temp_blks_read,temp_blks_written, 	
            blk_read_time, blk_write_time 
		  )		  
	      VALUES
	      (
	       current_snapshot_timestamp ,
		   database_rec.id ,
	       pg_stat_snapshot.dbid ,pg_stat_snapshot.userid ,pg_stat_snapshot.queryid,pg_stat_snapshot.query,pg_stat_snapshot.calls,
	       pg_stat_snapshot.total_time,pg_stat_snapshot.min_time ,pg_stat_snapshot.max_time,pg_stat_snapshot.mean_time, pg_stat_snapshot.stddev_time ,
	       pg_stat_snapshot.rows ,pg_stat_snapshot.shared_blks_hit ,pg_stat_snapshot.shared_blks_read ,pg_stat_snapshot.shared_blks_dirtied ,pg_stat_snapshot.shared_blks_written , 
           pg_stat_snapshot.local_blks_hit , pg_stat_snapshot.local_blks_read , pg_stat_snapshot.local_blks_dirtied , pg_stat_snapshot.local_blks_written , 
	       pg_stat_snapshot.temp_blks_read , pg_stat_snapshot.temp_blks_written , pg_stat_snapshot.blk_read_time , pg_stat_snapshot.blk_write_time 	   
	      );
		  
        END LOOP;

        PERFORM dblink_disconnect('LINK1');  
				
	  END LOOP ;--FOR database_rec IN SELECT * FROM database WHERE endpoint_id = endpoint_rec.id 
    
  END LOOP;

RETURN TRUE;  
END
$$ LANGUAGE plpgsql;

Ingon sa usa ka resulta, human sa usa ka piho nga yugto sa panahon sa lamesa pg_stat_history kita adunay usa ka hugpong sa mga snapshot sa mga sulod sa lamesa pg_stat_nga mga pahayag target nga database.

Nagreport gyud

Gamit ang yano nga mga pangutana, mahimo kang makakuha og mapuslanon ug makapaikag nga mga taho.

Aggregated data alang sa usa ka gihatag nga yugto sa panahon

Paghangyo

SELECT 
  database_id , 
  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
FROM 
  pg_stat_history
WHERE 
  queryid IS NULL AND
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
GROUP BY database_id ;

Panahon sa D.B

to_char(interval '1 millisecond' * pg_total_stat_history_rec.total_time, 'HH24:MI:SS.MS')

Panahon sa I/O

to_char(interval '1 millisecond' * ( pg_total_stat_history_rec.blk_read_time + pg_total_stat_history_rec.blk_write_time ), 'HH24:MI:SS.MS')

TOP10 SQL sa total_time

Paghangyo

SELECT 
  queryid , 
  SUM(calls) AS calls ,
  SUM(total_time)  AS total_time  	
FROM 
  pg_stat_history
WHERE 
  queryid IS NOT NULL AND 
  database_id = DATABASE_ID AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT 
GROUP BY queryid 
ORDER BY 3 DESC 
LIMIT 10
------------------------------------------------- ------------------------------------ | TOP10 SQL PINAAGI SA TOTAL NGA PANAHON SA PAGPAHIGAYON | #| queryid| mga tawag| nagtawag sa %| total_time (ms) | dbtime % +----+-----------+-----------+-----------+------ --------------------+---------- | 1| 821760255| 2| .00001|00:03:23.141( 203141.681 ms.)| 5.42 | 2| 4152624390| 2| .00001|00:03:13.929( 193929.215 ms.)| 5.17 | 3| 1484454471| 4| .00001|00:02:09.129( 129129.057 ms.)| 3.44 | 4| 655729273| 1| .00000|00:02:01.869( 121869.981 ms.)| 3.25 | 5| 2460318461| 1| .00000|00:01:33.113( 93113.835 ms.)| 2.48 | 6| 2194493487| 4| .00001|00:00:17.377( 17377.868 ms.)| .46 | 7| 1053044345| 1| .00000|00:00:06.156( 6156.352 ms.)| .16 | 8| 3644780286| 1| .00000|00:00:01.063( 1063.830 ms.)| .03

TOP10 SQL sa kinatibuk-ang oras sa I/O

Paghangyo

SELECT 
  queryid , 
  SUM(calls) AS calls ,
  SUM(blk_read_time + blk_write_time)  AS io_time
FROM 
  pg_stat_history
WHERE 
  queryid IS NOT NULL AND 
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
GROUP BY  queryid 
ORDER BY 3 DESC 
LIMIT 10
------------------------------------------------- ---------------------------------------------------- | TOP10 SQL PINAAGI SA TOTAL I/O TIME | #| queryid| mga tawag| nagtawag %| I/O nga oras (ms)|db I/O nga oras % +----+-----------+-----------+------ --------------------+--------------------------------+----------- -- | 1| 4152624390| 2| .00001|00:08:31.616( 511616.592 ms.)| Hunyo 31.06 | 2| 821760255| 2| .00001|00:08:27.099( 507099.036 ms.)| 30.78 | 3| 655729273| 1| .00000|00:05:02.209( 302209.137 ms.)| 18.35 | 4| 2460318461| 1| .00000|00:04:05.981( 245981.117 ms.)| 14.93 | 5| 1484454471| 4| .00001|00:00:39.144( 39144.221 ms.)| 2.38 | 6| 2194493487| 4| .00001|00:00:18.182( 18182.816 ms.)| 1.10 | 7| 1053044345| 1| .00000|00:00:16.611( 16611.722 ms.)| 1.01 | 8| 3644780286| 1| .00000|00:00:00.436( 436.205 ms.)| .03

TOP10 SQL pinaagi sa labing taas nga oras sa pagpatuman

Paghangyo

SELECT 
  id AS snapshotid , 
  queryid , 
  snapshot_timestamp ,  
  max_time 
FROM 
  pg_stat_history 
WHERE 
  queryid IS NOT NULL AND 
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
ORDER BY 4 DESC 
LIMIT 10

------------------------------------------------- ------------------------------------ | TOP10 SQL PINAAGI SA MAX NGA ORAS SA PAGPAHIGAYON | #| snapshot| snapshotID| queryid| max_time (ms) +----+-------+------------+--------- -------------------------------------------- | 1| 05.04.2019/01/03 4169:655729273| 00| 02| 01.869:121869.981:2( 04.04.2019 ms.) | 17| 00/4153/821760255 00:01| 41.570| 101570.841| 3:04.04.2019:16( 00 ms.) | 4146| 821760255/00/01 41.570:101570.841| 4| 04.04.2019| 16:00:4144( 4152624390 ms.) | 00| 01/36.964/96964.607 5:04.04.2019| 17| 00| 4151:4152624390:00( 01 ms.) | 36.964| 96964.607/6/05.04.2019 10:00| 4188| 1484454471| 00:01:33.452( 93452.150 ms.) | 7| 04.04.2019/17/00 4150:2460318461 | 00| 01| 33.113:93113.835:8( 04.04.2019 ms.) | 15| 00/4140/1484454471 00:00| 11.892| 11892.302| 9:04.04.2019:16( 00 ms.) | 4145| 1484454471/00/00 11.892:11892.302| 10| 04.04.2019| 17:00:4152( 1484454471 ms.) | 00| 00/11.892/11892.302 XNUMX:XNUMX| XNUMX| XNUMX| XNUMX:XNUMX:XNUMX( XNUMX ms.) | XNUMX| XNUMX/XNUMX/XNUMX XNUMX:XNUMX| XNUMX| XNUMX| XNUMX:XNUMX:XNUMX( XNUMX ms.)

TOP10 SQL pinaagi sa SHARED buffer pagbasa / pagsulat

Paghangyo

SELECT 
  id AS snapshotid , 
  queryid ,
  snapshot_timestamp , 
  shared_blks_read , 
  shared_blks_written 
FROM 
  pg_stat_history
WHERE 
  queryid IS NOT NULL AND 
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT AND
  ( shared_blks_read > 0 OR shared_blks_written > 0 )
ORDER BY 4 DESC  , 5 DESC 
LIMIT 10
------------------------------------------------- ------------------------------------ | TOP10 SQL PINAAGI SA GIBAHAGI NGA BUFFER BASAHA/SULAT | #| snapshot| snapshotID| queryid| gipaambit nga mga bloke nga gibasa| gipaambit nga mga bloke isulat +----+-------------------+---------- --------------------------------------------------- | 1| 04.04.2019/17/00 4153:821760255| 797308| 0| 2| 04.04.2019 | 16| 00/4146/821760255 797308:0| 3| 05.04.2019| 01| 03 | 4169| 655729273/797158/0 4:04.04.2019| 16| 00| 4144| 4152624390 | 756514| 0/5/04.04.2019 17:00| 4151| 4152624390| 756514| 0 | 6| 04.04.2019/17/00 4150:2460318461| 734117| 0| 7| 04.04.2019 | 17| 00/4155/3644780286 52973:0| 8| 05.04.2019| 01| 03 | 4168| 1053044345/52818/0 9:04.04.2019| 15| 00| 4141| 2194493487 | 52813| 0/10/04.04.2019 16:00| 4147| 2194493487| 52813| 0 | XNUMX| XNUMX/XNUMX/XNUMX XNUMX:XNUMX| XNUMX| XNUMX| XNUMX| XNUMX | XNUMX| XNUMX/XNUMX/XNUMX XNUMX:XNUMX| XNUMX| XNUMX| XNUMX| XNUMX ------------------------------------------------- -------------------------------------------------

Histogram sa pag-apod-apod sa pangutana pinaagi sa labing taas nga oras sa pagpatuman

Mga hangyo

SELECT  
  MIN(max_time) AS hist_min  , 
  MAX(max_time) AS hist_max , 
  (( MAX(max_time) - MIN(min_time) ) / hist_columns ) as hist_width
FROM 
  pg_stat_history 
WHERE 
  queryid IS NOT NULL AND
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT ;

SELECT 
  SUM(calls) AS calls
FROM 
  pg_stat_history 
WHERE 
  queryid IS NOT NULL AND
  database_id =DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT AND 
  ( max_time >= hist_current_min AND  max_time < hist_current_max ) ;
|------------------------------------------------ - ------------------------------------------- | MAX_TIME HISTOGRAM | TOTAL TAWAG: 33851920 | MIN ORAS: 00:00:01.063 | MAX NGA ORAS: 00:02:01.869 ------------------------------------------ ---------------------------------------------------- | min gidugayon| max nga gidugayon| nagtawag +------------------------------------------------+------------------------- ----------------------+---------- | 00:00:01.063( 1063.830 ms.) | 00:00:13.144( 13144.445 ms.) | 9 | 00:00:13.144( 13144.445 ms.) | 00:00:25.225( 25225.060 ms.) | 0 | 00:00:25.225( 25225.060 ms.) | 00:00:37.305( 37305.675 ms.) | 0 | 00:00:37.305( 37305.675 ms.) | 00:00:49.386( 49386.290 ms.) | 0 | 00:00:49.386( 49386.290 ms.) | 00:01:01.466( 61466.906 ms.) | 0 | 00:01:01.466( 61466.906 ms.) | 00:01:13.547( 73547.521 ms.) | 0 | 00:01:13.547( 73547.521 ms.) | 00:01:25.628( 85628.136 ms.) | 0 | 00:01:25.628( 85628.136 ms.) | 00:01:37.708( 97708.751 ms.) | 4 | 00:01:37.708( 97708.751 ms.) | 00:01:49.789( 109789.366 ms.) | 2 | 00:01:49.789( 109789.366 ms.) | 00:02:01.869( 121869.981 ms.) | 0

TOP10 Snapshots pinaagi sa Pangutana kada Segundo

Mga hangyo

--pg_qps.sql
--Calculate Query Per Second 
CREATE OR REPLACE FUNCTION pg_qps( pg_stat_history_id integer ) RETURNS double precision AS $$
DECLARE
 pg_stat_history_rec record ;
 prev_pg_stat_history_id integer ;
 prev_pg_stat_history_rec record;
 total_seconds double precision ;
 result double precision;
BEGIN 
  result = 0 ;
  
  SELECT *
  INTO pg_stat_history_rec
  FROM 
    pg_stat_history
  WHERE id = pg_stat_history_id ;

  IF pg_stat_history_rec.snapshot_timestamp IS NULL 
  THEN
    RAISE EXCEPTION 'ERROR - Not found pg_stat_history for id = %',pg_stat_history_id;
  END IF ;  
  
 --RAISE NOTICE 'pg_stat_history_id = % , snapshot_timestamp = %', pg_stat_history_id , 
 pg_stat_history_rec.snapshot_timestamp ;
  
  SELECT 
    MAX(id)   
  INTO
    prev_pg_stat_history_id
  FROM
    pg_stat_history
  WHERE 
    database_id = pg_stat_history_rec.database_id AND
	queryid IS NULL AND
	id < pg_stat_history_rec.id ;

  IF prev_pg_stat_history_id IS NULL 
  THEN
    RAISE NOTICE 'Not found previous pg_stat_history shapshot for id = %',pg_stat_history_id;
	RETURN NULL ;
  END IF;
  
  SELECT *
  INTO prev_pg_stat_history_rec
  FROM 
    pg_stat_history
  WHERE id = prev_pg_stat_history_id ;
  
  --RAISE NOTICE 'prev_pg_stat_history_id = % , prev_snapshot_timestamp = %', prev_pg_stat_history_id , prev_pg_stat_history_rec.snapshot_timestamp ;    

  total_seconds = extract(epoch from ( pg_stat_history_rec.snapshot_timestamp - prev_pg_stat_history_rec.snapshot_timestamp ));
  
  --RAISE NOTICE 'total_seconds = % ', total_seconds ;    
  
  --RAISE NOTICE 'calls = % ', pg_stat_history_rec.calls ;      
  
  IF total_seconds > 0 
  THEN
    result = pg_stat_history_rec.calls / total_seconds ;
  ELSE
   result = 0 ; 
  END IF;
   
 RETURN result ;
END
$$ LANGUAGE plpgsql;


SELECT 
  id , 
  snapshot_timestamp ,
  calls , 	
  total_time , 
  ( select pg_qps( id )) AS QPS ,
  blk_read_time ,
  blk_write_time
FROM 
  pg_stat_history
WHERE 
  queryid IS NULL AND 
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT AND
  ( select pg_qps( id )) IS NOT NULL 
ORDER BY 5 DESC 
LIMIT 10
|------------------------------------------------ ---------------------------------------- | TOP10 Snapshots nga gi-order sa QueryPerSeconds nga mga numero -------------------------------------- ------ -------------------------------------------- ------ ------------------------------------------ | #| snapshot| snapshotID| mga tawag| kinatibuk-ang dbtime| QPS | I/O nga oras | I/O nga oras % +------+---------------------------------+------- ----+-----------------------------------+---------- -------------------------------------+----------- | 1| 04.04.2019/20/04 4161:5758631| 00| 06| 30.513:390513.926:1573.396( 00 ms.)| 00| 01.470:1470.110:376( 2 ms.)| .04.04.2019 | 17| 00/4149/3529197 00:11| 48.830| 708830.618| 980.332:00:12( 47.834 ms.)| 767834.052| 108.324:3:04.04.2019( 16 ms.)| 00 | 4143| 3525360/00/10 13.492:613492.351| 979.267| 00| 08:41.396:521396.555( 84.988 ms.)| 4| 04.04.2019:21:03( 4163 ms.)| 2781536 | 00| 03/06.470/186470.979 785.745:00| 00| 00.249| 249.865:134:5( 04.04.2019 ms.)| 19| 03:4159:2890362( 00 ms.)| .03 | 16.784| 196784.755/776.979/00 00:01.441| 1441.386| 732| 6:04.04.2019:14( 00 ms.)| 4137| 2397326:00:04( 43.033 ms.)| .283033.854 | 665.924| 00/00/00.024 24.505:009| 7| 04.04.2019| 15:00:4139( 2394416 ms.)| 00| 04:51.435:291435.010( 665.116 ms.)| .00 | 00| 12.025/12025.895/4.126 8:04.04.2019| 13| 00| 4135:2373043:00( 04 ms.)| 26.791| 266791.988:659.179:00( 00 ms.)| 00.064 | 64.261| 024/9/05.04.2019 01:03 | 4167| 4387191| 00:06:51.380( 411380.293 ms.)| 609.332| 00:05:18.847( 318847.407 ms.)| .77.507 | 10| 04.04.2019/18/01 4157:1145596| 00| 01| 19.217:79217.372:313.004( 00 ms.)| 00| 01.319:1319.676:1.666( XNUMX ms.)| XNUMX | XNUMX| XNUMX/XNUMX/XNUMX XNUMX:XNUMX| XNUMX| XNUMX| XNUMX:XNUMX:XNUMX( XNUMX ms.)| XNUMX| XNUMX:XNUMX:XNUMX( XNUMX ms.)| XNUMX

Inoras nga Kasaysayan sa Pagpatuman sa QueryPerSeconds ug I/O Time

Paghangyo

SELECT 
  id , 
  snapshot_timestamp ,
  calls , 	
  total_time , 
  ( select pg_qps( id )) AS QPS ,
  blk_read_time ,
  blk_write_time
FROM 
  pg_stat_history
WHERE 
  queryid IS NULL AND 
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
ORDER BY 2
|-----------------------------------------------------------------------------------------------
| HOURLY EXECUTION HISTORY  WITH QueryPerSeconds and I/O Time
-----------------------------------------------------------------------------------------------------------------------------------------------
| QUERY PER SECOND HISTORY
|    #|          snapshot| snapshotID|      calls|                      total dbtime|        QPS|                          I/O time| I/O time %
+-----+------------------+-----------+-----------+----------------------------------+-----------+----------------------------------+-----------
|    1|  04.04.2019 11:00|       4131|       3747|  00:00:00.835(       835.374 ms.)|      1.041|  00:00:00.000(          .000 ms.)|       .000
|    2|  04.04.2019 12:00|       4133|    1002722|  00:01:52.419(    112419.376 ms.)|    278.534|  00:00:00.149(       149.105 ms.)|       .133
|    3|  04.04.2019 13:00|       4135|    2373043|  00:04:26.791(    266791.988 ms.)|    659.179|  00:00:00.064(        64.261 ms.)|       .024
|    4|  04.04.2019 14:00|       4137|    2397326|  00:04:43.033(    283033.854 ms.)|    665.924|  00:00:00.024(        24.505 ms.)|       .009
|    5|  04.04.2019 15:00|       4139|    2394416|  00:04:51.435(    291435.010 ms.)|    665.116|  00:00:12.025(     12025.895 ms.)|      4.126
|    6|  04.04.2019 16:00|       4143|    3525360|  00:10:13.492(    613492.351 ms.)|    979.267|  00:08:41.396(    521396.555 ms.)|     84.988
|    7|  04.04.2019 17:00|       4149|    3529197|  00:11:48.830(    708830.618 ms.)|    980.332|  00:12:47.834(    767834.052 ms.)|    108.324
|    8|  04.04.2019 18:01|       4157|    1145596|  00:01:19.217(     79217.372 ms.)|    313.004|  00:00:01.319(      1319.676 ms.)|      1.666
|    9|  04.04.2019 19:03|       4159|    2890362|  00:03:16.784(    196784.755 ms.)|    776.979|  00:00:01.441(      1441.386 ms.)|       .732
|   10|  04.04.2019 20:04|       4161|    5758631|  00:06:30.513(    390513.926 ms.)|   1573.396|  00:00:01.470(      1470.110 ms.)|       .376
|   11|  04.04.2019 21:03|       4163|    2781536|  00:03:06.470(    186470.979 ms.)|    785.745|  00:00:00.249(       249.865 ms.)|       .134
|   12|  04.04.2019 23:03|       4165|    1443155|  00:01:34.467(     94467.539 ms.)|    200.438|  00:00:00.015(        15.287 ms.)|       .016
|   13|  05.04.2019 01:03|       4167|    4387191|  00:06:51.380(    411380.293 ms.)|    609.332|  00:05:18.847(    318847.407 ms.)|     77.507
|   14|  05.04.2019 02:03|       4171|     189852|  00:00:10.989(     10989.899 ms.)|     52.737|  00:00:00.539(       539.110 ms.)|      4.906
|   15|  05.04.2019 03:01|       4173|       3627|  00:00:00.103(       103.000 ms.)|      1.042|  00:00:00.004(         4.131 ms.)|      4.010
|   16|  05.04.2019 04:00|       4175|       3627|  00:00:00.085(        85.235 ms.)|      1.025|  00:00:00.003(         3.811 ms.)|      4.471
|   17|  05.04.2019 05:00|       4177|       3747|  00:00:00.849(       849.454 ms.)|      1.041|  00:00:00.006(         6.124 ms.)|       .721
|   18|  05.04.2019 06:00|       4179|       3747|  00:00:00.849(       849.561 ms.)|      1.041|  00:00:00.000(          .051 ms.)|       .006
|   19|  05.04.2019 07:00|       4181|       3747|  00:00:00.839(       839.416 ms.)|      1.041|  00:00:00.000(          .062 ms.)|       .007
|   20|  05.04.2019 08:00|       4183|       3747|  00:00:00.846(       846.382 ms.)|      1.041|  00:00:00.000(          .007 ms.)|       .001
|   21|  05.04.2019 09:00|       4185|       3747|  00:00:00.855(       855.426 ms.)|      1.041|  00:00:00.000(          .065 ms.)|       .008
|   22|  05.04.2019 10:00|       4187|       3797|  00:01:40.150(    100150.165 ms.)|      1.055|  00:00:21.845(     21845.217 ms.)|     21.812

Teksto sa tanan nga gipili sa SQL

Paghangyo

SELECT 
  queryid , 
  query 
FROM 
  pg_stat_history
WHERE 
  queryid IS NOT NULL AND 
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
GROUP BY queryid , query

Ang resulta

Sama sa imong nakita, gamit ang medyo yano nga paagi, makakuha ka daghang mapuslanon nga kasayuran bahin sa workload ug kahimtang sa database.

Mubo nga sulat:Kung among irekord ang queryid sa mga pangutana, makuha namon ang kasaysayan alang sa usa ka bulag nga pangutana (aron makadaginot og espasyo, ang mga taho alang sa usa ka lahi nga pangutana wala iapil).

Busa, ang istatistikal nga datos sa pasundayag sa pangutana anaa ug nakolekta.
Ang unang yugto nga "pagkolekta sa istatistikal nga datos" nahuman.

Makapadayon ka sa ikaduhang yugto - "pag-configure sa mga sukatan sa pasundayag".
Pag-monitor sa performance sa mga pangutana sa PostgreSQL. Bahin 1 - pagreport

Apan kana usa ka hingpit nga lahi nga istorya.

Ipadayon…

Source: www.habr.com

Idugang sa usa ka comment