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

Inhenyero - gihubad gikan sa Latin - nagpasabut nga inspirado.
Ang usa ka inhenyero 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 bahin sa nganong angay hinumdoman sa usa ka database administrator ang iyang nangagi isip usa ka programmer.

Pasiuna

Ang tanang ngalan giusab. Ang bisan unsang mga sulagma kay sulagma lamang. Ang materyal nagrepresentar lamang sa personal nga opinyon sa tagsulat.

Pagpasabot sa mga garantiya: Ang giplanong serye sa artikulo dili maglakip sa detalyado ug tukma nga paghulagway sa mga talaan ug mga script nga gigamit. Ang mga materyales dili dayon magamit "sa pagkakaron."
Una, tungod sa dako nga gidaghanon sa mga materyales,
ikaduha, tungod sa pagtutok sa base sa produksiyon sa usa ka tinuod nga kustomer.
Busa, ang mga artikulo maglangkob lamang sa mga ideya ug mga deskripsyon sa labing kinatibuk-ang porma.
Basin sa umaabot nga ang sistema molambo hangtod sa lebel sa pagmantala sa GitHub, o basin dili. Ang panahon ra ang magsulti.

Ang sinugdanan sa istorya - "Nahinumdom ka ba kon giunsa kini tanan nagsugod?".
Ang nahitabo isip resulta, sa kinatibuk-ang termino, mao kini:Synthesis isip usa sa mga pamaagi aron mapaayo ang performance sa PostgreSQL»

Ngano nga kinahanglan nako kining tanan?

Aw, una, aron dili nako kini malimtan sa akong kaugalingon, nga nahinumdom sa mahimayaong mga adlaw sa pagretiro.
Ikaduha, aron masistematisa ang akong gisulat. Kay usahay magsugod ko og kalibog ug makalimot sa pipila ka mga bahin.

Ug ang labing importante, basin kini mapuslanon sa usa ka tawo ug makatabang kanila nga malikayan ang pag-imbento pag-usab sa ligid ug pagsubli sa parehas nga mga sayop. Sa ato pa, pauswagon ang ilang karma (dili ang kang Habr). Kay ang labing bililhon nga butang niining kalibutana mao ang mga ideya. Ang importante mao ang pagpangita og ideya. Ug ang paghimo niini nga realidad usa lamang ka teknikal nga butang.

Mao nga, magsugod kita, hinay-hinay...

Pahayag sa problema.

Anaa:

PostgreSQL database (10.5), sinagol nga workload (OLTP+DSS), medium-low load, nga nahimutang sa AWS cloud.
Walay database monitoring; ang infrastructure monitoring gihatag sa porma sa standard AWS tools sa gamay nga configuration.

Gikinahanglan kini:

Monitora ang performance ug kahimsog sa database, pangitaa ug pagbaton og inisyal nga impormasyon para sa pag-optimize sa bug-at nga mga pangutana sa database.

Usa ka mubo nga pasiuna o pagtuki sa mga kapilian sa solusyon

Sa pagsugod, atong sulayan pag-analisar ang posibleng mga solusyon sa problema gikan sa perspektibo sa usa ka pagtandi sa mga benepisyo ug disbentaha alang sa inhenyero, samtang kadtong gi-assign sa management team ang moatubang sa mga benepisyo ug disbentaha.

Opsyon 1 - "Pagtrabaho kung gikinahanglan"

Pasagdan lang nato ang tanan nga ingon ana. Kon ang kustomer dili matagbaw sa bisan unsang aspeto sa performance sa database o aplikasyon, ilang ipahibalo sa mga DBA engineer pinaagi sa email o pinaagi sa paghimo og insidente sa ticket system.
Ang inhenyero, human makadawat sa pahibalo, mosusi sa problema, motanyag og solusyon, o mopasagad lang sa problema, nga naglaum nga ang tanan masulbad ra sa iyang kaugalingon, ug bisan pa niana, ang tanan malimtan ra sa dili madugay.
Gingerbread ug donuts, mga bun-og ug mga bukolGingerbread ug donuts:
1. Dili na kinahanglan nga mobuhat ug bisan unsa nga dugang.
2. Kanunay adunay higayon sa paghimo og mga pasangil ug pag-ilag.
3. Daghang oras nga magamit sumala sa imong gusto.
Mga bun-og ug mga samad:
1. Sa madugay o madali, ang kliyente mamalandong sa esensya sa paglungtad ug hustisya sa tanan niining kalibutana ug mangutana pag-usab sa ilang kaugalingon: unsa may akong gibayad kanila? Ang sangputanan kanunay nga parehas: usa ra ka butang sa panahon sa dili pa ang kliyente makalaay ug mohunong. Ug ang kanal mahubsan. Makapasubo kana.
2. Sero ang kalamboan sa inhenyero.
3. Mga kalisud sa pagplano sa trabaho ug pagkarga

Opsyon 2 - "Pagsayaw nga may mga tamburin, pagpamaligya ug pagsinina og sapatos"

Punto 1Ngano nga kinahanglan nato og sistema sa pagmonitor? Atong makuha ang tanan pinaagi sa mga pangutana. Nagpadagan ko og daghang mga pangutana batok sa data dictionary ug dynamic views, nag-enable sa tanang klase sa counters, nagsumaryo sa tanan sa mga lamesa, ug panagsa nga nag-analisar sa mga lista ug mga lamesa. Ang resulta kay nindot o dili kaayo nindot nga mga graph, lamesa, ug mga report. Ang importante kay daghan kutob sa mahimo.
Punto 2-Nagmugna kita og kalihokan - gisugdan nato ang pag-analisar niining tanan.
Punto 3- Nag-andam kami og usa ka piho nga dokumento, gitawag namon kini nga dokumento nga yano - "unsaon pag-organisar ang usa ka database".
Punto 4Ang kliyente, nga nakakita niining tanang maanindot nga mga graph ug mga numero, napuno sa binata ug inosenteng pagsalig: karon ang tanan molihok na, sa dili madugay. Busa, ilang gigahin ang ilang pinansyal nga mga kahinguhaan nga dali ug walay kahasol. Masaligon usab ang management: ang among mga inhenyero nagbuhat ug maayo kaayong trabaho. Ang workload anaa sa kinatas-an niini.
Punto 5-Balika ang Punto 1 kanunay.
Gingerbread ug donuts, mga bun-og ug mga bukolGingerbread ug donuts:
1. Ang kinabuhi sa mga manedyer ug mga inhenyero yano, matag-an, ug puno sa kalihokan. Ang tanan nagsaba-saba, ang tanan busy.
2. Dili usab daotan ang kinabuhi sa kliyente—kanunay siyang sigurado nga kinahanglan lang siyang magpailob sulod sa gamay nga panahon ug mamaayo ra ang tanan. Kon dili, aw, dili patas ang kalibutan; swertehon siya sa sunod nga kinabuhi.
Mga bun-og ug mga samad:
1. Sa madugay o madali, motungha ang usa ka mas episyente nga tighatag og parehas nga serbisyo, nga nagtanyag sa parehas nga serbisyo sa gamay nga mas barato nga presyo. Ug kung parehas ra ang resulta, nganong mobayad pa man og dugang? Nga, sa makausa pa, mosangpot sa pagkawala sa gravy train.
2. Makalaay. Sama ka makalaay sa bisan unsang kalihokan nga walay kahulugan.
3. Sama sa miaging kapilian, walay progreso. Apan para sa usa ka inhenyero, ang disbentaha kay, dili sama sa unang kapilian, kinahanglan nimo nga kanunay nga maghimo og IDB. Ug kana magkinahanglan og panahon, nga mahimong magamit nga mapuslanon. Kay kon dili nimo atimanon ang imong kaugalingon, walay magpakabana kanimo.

Opsyon 3: Dili kinahanglan nga usbon nimo ang manibela, kinahanglan lang nimo kini paliton ug sakyan.

Naa gyuy rason nganong ang mga inhenyero sa ubang kompanya mokaon og pizza ug moinom niini uban sa beer (ah, ang mahimayaong mga adlaw sa St. Petersburg niadtong dekada 90). Gamiton nato ang mga sistema sa pagmonitor nga gitukod, gi-debug, ug gigamit, ug sa kinatibuk-an mapuslanon (labing menos sa ilang mga tiglalang).
Gingerbread ug donuts, mga bun-og ug mga bukolGingerbread ug donuts:
1. Ayaw usiki ang oras sa pag-imbento og bag-ong butang nga naimbento na. Kuhaa lang kini ug gamita.
2. Ang mga sistema sa pagmonitor dili gisulat sa mga buang ug kini siguradong mapuslanon.
3. Ang mga sistema sa pagmonitor nga nagtrabaho kasagaran naghatag ug mapuslanong sinala nga impormasyon.
Mga bun-og ug mga samad:
1. Ang inhenyero niini nga kaso dili usa ka inhenyero, kondili usa lamang ka tiggamit sa produkto sa uban. O usa ka tiggamit.
2. Kinahanglan nga kombinsihon ang kliyente sa panginahanglan nga mopalit og butang nga dili nila gusto masabtan, ug dili angay, ug ang tinuig nga badyet gitakda na ug dili mausab. Dayon, kinahanglan nga igahin ug ipasibo ang usa ka gipahinungod nga kapanguhaan alang sa usa ka piho nga sistema. Busa, una kinahanglan ka nga mobayad, mobayad, ug mobayad pag-usab. Ug ang kliyente kuripot. Mao kana ang naandan.

Unsa may angay natong buhaton, Chernyshevsky? Angayan kaayo ang imong pangutana. (c)

Niining partikular nga kaso ug sa kasamtangang sitwasyon, mahimo kang molihok nga medyo lahi - Maghimo ta sa atong kaugalingong sistema sa pagmonitor.
Pag-monitor sa performance sa mga pangutana sa PostgreSQL. Bahin 1 - pagreport
Aw, dili kini usa ka sistema sa bug-os nga kahulugan sa pulong, siyempre—sobra ra kana ka bug-at nga pulong ug mapangahason—apan labing menos himoa nga mas sayon ​​ang imong trabaho ug magtigom og dugang impormasyon aron masulbad ang mga isyu sa performance. Aron dili ka matapos sa sitwasyon diin kinahanglan ka nga "moadto sa usa ka lugar, mangita og usa ka butang, wala ko kabalo unsa."

Unsa ang mga bentaha ug disbentaha niini nga opsyon:

Mga Pro:
1. Makapainteres kini. Aw, labing menos mas makapainteres kay sa kanunay nga "shrink datafile, alter tablespace, etc."
2. Kini mga bag-ong kahanas ug bag-ong kalamboan. Nga, sa madugay o madali, magdala ug angay nga mga ganti.
Kahinumduman:
1. Kinahanglan kang magtrabaho. Trabaho og maayo.
2. Kinahanglan nimong ipasabut kanunay ang kahulugan ug mga posibilidad sa tanang mga kalihokan.
3. Kinahanglan adunay isakripisyo, tungod kay ang bugtong kapanguhaan nga magamit sa usa ka inhenyero—ang oras—limitado sa Uniberso.
4. Ang labing makalilisang ug ang labing dili maayo — tungod niini, mahimo kang makakuha og sama sa “Dili ilaga, dili baki, kondili usa ka wala mailhing hayop.”

Siya nga dili mo-risgo, dili moinom og champagne.
Mao na, magsugod na ang labing makapainteres nga bahin.

Ang kinatibuk-ang ideya kay eskematiko

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

Pagpatin-aw:

  • Ang standard nga PostgreSQL extension nga "pg_stat_statements" na-install sa target nga database.
  • Sa monitoring database, maghimo kita og set sa service tables aron tipigan ang pg_stat_statements history sa inisyal nga yugto ug aron ma-configure ang metrics ug monitoring sa umaabot.
  • Sa monitoring host, maghimo kita og set sa mga bash script, lakip ang usa para sa pagmugna og mga insidente sa ticket system.

Mga lamesa sa serbisyo

Sa pagsugod, aniay gipasimple nga eskematiko sa ERD, nga nagpakita sa among nahuman:
Pag-monitor sa performance sa mga pangutana sa PostgreSQL. Bahin 1 - pagreport
Mubo nga paghulagway sa mga lamesakatapusang punto — host, punto sa koneksyon sa instance
database — mga parametro sa database
pg_stat_history — usa ka makasaysayanong talaan para sa pagtipig sa temporaryong mga snapshot sa pg_stat_statements view sa target database
metric_glosary — diksyonaryo sa mga sukdanan sa pasundayag
metric_config — pag-configure sa indibidwal nga mga sukatan
metriko — usa ka piho nga sukdanan para sa hangyo nga gimonitor
kasaysayan sa metric_alert — kasaysayan sa mga pasidaan sa pasundayag
log_query — usa ka utility table para sa pagtipig sa mga na-parse nga rekord gikan sa usa ka PostgreSQL log file nga gi-download gikan sa AWS
baseline — mga parametro sa yugto sa panahon nga gigamit isip basehan
checkpoint — pag-configure sa mga sukdanan sa pagsusi sa kahimsog sa database
checkpoint_alert_history — kasaysayan sa mga pasidaan sa sukdanan sa pagsusi sa kahimsog sa database
pg_stat_db_queries — talaan sa serbisyo sa mga aktibong pangutana
talaan sa kalihokan — talaan sa serbisyo sa talaan sa kalihokan
trap_oid — lamesa sa serbisyo sa pag-configure sa lit-ag

Lakang 1: Kolektaha ang mga estadistika sa pasundayag ug paghimo og mga report

Ang usa ka talaan gigamit sa pagtipig sa estadistikal nga impormasyon. pg_stat_history
Istruktura sa talaan sa pg_stat_history

                                          Talahanayan nga "public.pg_stat_history" Kolum | Tipo | Mga Modifier --------------------+---------------+------------------------------------------- id | integer | dili null default nextval('pg_stat_history_id_seq'::regclass) snapshot_timestamp | timestamp nga walay time zone | database_id | integer | dbid | oid | userid | oid | queryid | bigint | query | text | mga tawag | bigint | total_time | doble nga katukma | min_time | doble nga katukma | max_time | doble nga katukma | mean_time | doble nga katukma | stddev_time | doble nga katukma | mga laray | 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 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) Mga limitasyon sa langyaw nga yawe: "database_id_fk" FOREIGN KEY (database_id) MGA REFERENCES database(id) SA PAGTANGTANG SA CASCADE

Sama sa imong makita, ang lamesa usa lamang ka kinatibuk-ang pagtan-aw sa datos pg_stat_nga mga pahayag sa target nga database.

Sayon ra kaayo gamiton kini nga lamesa.

pg_stat_history morepresentar sa natipon nga estadistika sa pagpatuman sa pangutana alang sa matag oras. Sa pagsugod sa matag oras, human mapuno ang lamesa, ang estadistika pg_stat_nga mga pahayag i-reset gamit ang pg_stat_statements_reset().
Mubo nga sulat: Ang mga estadistika gikolekta alang sa mga pangutana nga mokabat ug sobra sa 1 segundos aron mapatuman.
Pagpuno sa pg_stat_history table

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

Tungod niini, human sa pipila ka 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.

Ang aktuwal nga pagreport

Gamit ang yano nga mga pangutana, makakuha ka og mapuslanon ug makapaikag nga mga report.

Gitigom nga datos alang sa usa ka gitakdang 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 ;

Oras sa DB

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

Oras sa Pagsulod/Pag-obra

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

TOP10 SQL pinaagi 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 KINATIBUK-ANG ORAS SA PAGPADAYON | #| queryid| mga tawag| mga tawag %| kinatibuk-ang_oras (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

TOP 10 SQL pinaagi 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 SA KINATIBUK-ANG ORAS SA I/O | #| queryid| mga tawag| mga tawag %| Oras sa I/O (ms)|db Oras sa I/O % +----+-----------+-----------+-----------+------------------------+----------- | 1| 4152624390| 2| .00001|00:08:31.616( 511616.592 ms.)| 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 pinakataas 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 PAGPADAYON | #| snapshot| snapshotID| queryid| max_time (ms) +----+------------------+-----------+-----------+---------------------------------------- | 1| 04/05/2019 01:03| 4169| 655729273| 00:02:01.869( 121869.981 ms.) | 2| 04/04/2019 17:00| 4153| 821760255| 00:01:41.570( 101570.841 ms.) | 3| 04/04/2019 16:00| 4146| 821760255| 00:01:41.570( 101570.841 ms.) | 4| 04/04/2019 16:00| 4144| 4152624390| 00:01:36.964(96964.607 ms.) | 5| 04/04/2019 17:00| 4151| 4152624390| 00:01:36.964(96964.607 ms.) | 6| 04/05/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 ms.) | 8| 04/04/2019 15:00| 4140| 1484454471| 00:00:11.892( 11892.302 ms.) | 9| 04/04/2019 16:00| 4145| 1484454471| 00:00:11.892( 11892.302 ms.) | 10| 04/04/2019 17:00| 4152| 1484454471| 00:00:11.892( 11892.302 ms.)

TOP10 SQL pinaagi sa SHARED buffer read/write

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 PINAGI SA GIPAHIGAYONG BUFFER BASA/SULAT | #| snapshot| snapshotID| queryid| gipaambit nga mga bloke basahon| gipaambit nga mga bloke pagsulat +----+------------------+-----------+-----------+----------------------+----------------------- | 1| 04/04/2019 17:00| 4153| 821760255| 797308| 0 | 2| 04/04/2019 16:00| 4146| 821760255| 797308| 0 | 3| 04/05/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 -------------------------------------------------------------------------------------------

Histogram sa distribusyon sa pangutana pinaagi sa pinakataas 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 | KINATIBUK-ANG MGA TAWAG: 33851920 | MINIMUM NGA ORAS: 00:00:01.063 | MAXIMUM NGA ORAS: 00:02:01.869 ---------------------------------------------------------------------------------- | min nga gidugayon| pinakataas nga gidugayon| mga tawag +----------------------------------+----------------------------------+---------- | 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 nga mga Snapshot 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 nga mga Snapshot nga gihan-ay pinaagi sa mga numero sa QueryPerSeconds ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | #| snapshot| snapshotID| mga tawag| kinatibuk-ang dbtime| QPS| oras sa I/O| oras sa I/O % +-----+-----------+-----------+-------------------+-----------+-------------------+-------------- | 1| 04/04/2019 20:04| 4161| 5758631| 00:06:30.513( 390513.926 ms.)| 1573.396| 00:00:01.470( 1470.110 ms.)| .376 | 2| 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 | 3| 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 | 4| 04/04/2019 21:03| 4163| 2781536| 00:03:06.470( 186470.979 ms.)| 785.745| 00:00:00.249(249.865 ms.)| .134 | 5| 04.04.2019 19:03| 4159| 2890362| 00:03:16.784( 196784.755 ms.)| 776.979| 00:00:01.441( 1441.386 ms.)| .732 | 6| 04/04/2019 14:00| 4137| 2397326| 00:04:43.033( 283033.854 ms.)| 665.924| 00:00:00.024(24.505 ms.)| .009 | 7| 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 | 8| 04.04.2019 13:00| 4135| 2373043| 00:04:26.791( 266791.988 ms.)| 659.179| 00:00:00.064( 64.261 ms.)| .024 | 9| 04/05/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 ms.)| 313.004| 00:00:01.319( 1319.676 ms.)| 1.666

Kasaysayan sa Pagpatuman kada Oras gamit ang 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 tanang pinili 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 makita, gamit ang medyo yano nga mga himan, makakuha ka daghang mapuslanon nga kasayuran bahin sa workload ug kahimtang sa database.

Mubo nga sulat:Kon imong irekord ang queryid sa mga hangyo, makuha nimo ang kasaysayan para sa laing hangyo (aron makadaginot og espasyo, ang mga report para sa laing hangyo dili iapil).

Mao nga, ang estadistikal nga datos sa performance sa query anaa na ug gikolekta na.
Nahuman na ang unang yugto sa "pagkolekta sa estadistikal nga datos".

Mahimo kang mopadayon sa ikaduhang yugto - "pag-set up sa mga sukdanan sa performance".
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