Мониторинги иҷрои дархостҳои PostgreSQL. Қисми 1 - гузоришдиҳӣ

Муҳандис - аз лотинӣ тарҷума шудааст - илҳом гирифта шудааст.
Инженер хар кор карда метавонад. (в) Р. Дизел.
Эпиграфҳо.
Мониторинги иҷрои дархостҳои PostgreSQL. Қисми 1 - гузоришдиҳӣ
Ё ҳикояе дар бораи он, ки чаро мудири пойгоҳи додаҳо бояд гузаштаи барномасозии худро дар ёд дошта бошад.

Пешгуфтор

Ҳама номҳо иваз карда шуданд. Тасодуфҳо тасодуфӣ мебошанд. Мавод танҳо фикри шахсии муаллифро ифода мекунад.

Радди кафолатҳо: Силсилаи мақолаҳои ба нақша гирифташуда тавсифи муфассал ва дақиқи ҷадвалҳо ва скриптҳои истифодашударо дар бар намегирад. Маводҳоро фавран истифода бурдан мумкин нест "Чунон ки ҳаст".
Аввалан, аз сабаби ҳаҷми зиёди мавод,
дуюм, аз сабаби алокаи зич бо базаи истехсолии харидори хакикй.
Аз ин рӯ, мақолаҳо танҳо идеяҳо ва тавсифҳоро дар шакли умумӣ дар бар мегиранд.
Шояд дар оянда система ба сатҳи ҷойгиршавӣ дар GitHub афзоиш ёбад ё шояд не. Вақт нишон медиҳад.

Оғози ҳикоя - "Дар хотир доред, ки ҳамааш чӣ гуна оғоз ёфт".
Дар натиҷа чӣ рӯй дод, ба ибораи умумӣ - "Синтез ҳамчун яке аз усулҳои баланд бардоштани самаранокии PostgreSQL»

Чаро ин ҳама ба ман лозим аст?

Хуб, аввалан, барои он ки фаромӯш накунем, рӯзҳои пуршарафи нафақахӯриро ба ёд меорем.
Сониян, ба низом даровардани он чи навишта шудааст. Зеро баъзан ман саргардон шудам ва баъзе қисматҳоро фаромӯш мекунам.

Хуб, ва аз ҳама муҳимаш он аст, ки он метавонад барои касе муфид бошад ва ба онҳо кӯмак кунад, ки чархро аз нав ихтироъ накунанд ва нагиранд. Ба ибораи дигар, кармаи худро беҳтар кунед (на Хабров). Чунки бу дунёда энг қиммат нарса ғоялардир. Чизи асосиаш пайдо кардани идея аст. Аммо ба воқеият табдил додани идея як масъалаи сирф техникӣ аст.

Пас, биёед оҳиста-оҳиста оғоз кунем ...

Тартиб додани мушкилот.

Дастрас:

Пойгоҳи пойгоҳи додаҳои PostgreSQL (10.5), навъи бори омехта (OLTP+DSS), сарбории миёна, ки дар абри AWS ҷойгир аст.
Мониторинги пойгоҳи додаҳо вуҷуд надорад; мониторинги инфрасохтор дар шакли абзорҳои стандартии AWS дар конфигуратсияи ҳадди ақал таъмин карда мешавад.

Талабот:

Фаъолият ва ҳолати пойгоҳи додаҳоро назорат кунед, маълумоти аввалияро барои оптимизатсияи дархостҳои вазнини пойгоҳи додаҳо пайдо кунед ва дошта бошед.

Муқаддима ё таҳлили вариантҳои ҳалли

Аввалан, биёед кушиш кунем, ки вариантхои халли масъаларо аз нуктаи назари тахлили мукоисавии фоида ва зарари инженер тахлил кунем ва бигузор онхое, ки аз руи графики штатй ба он хукук доранд, бо фоида ва талафоти идора.

Варианти 1 - "Кор аз рӯи талабот"

Мо ҳама чизро тавре мегузорем. Агар муштарӣ аз функсия, иҷрои пойгоҳи додаҳо ё барнома қаноатманд набошад, вай муҳандисони DBA-ро тавассути почтаи электронӣ ё эҷоди ҳодиса дар лавҳаи чипта огоҳ мекунад.
Муҳандис, ки огоҳиномаро гирифтааст, мушкилотро мефаҳмад, роҳи ҳалли онро пешниҳод мекунад ё мушкилотро дар паси оташ мегузорад ва умедвор аст, ки ҳама чиз худаш ҳал мешавад ва ба ҳар ҳол ҳама чиз ба зудӣ фаромӯш мешавад.
Gingerbread ва donuts, кӯфтаҳо ва зарбаҳоЗанҷабил ва нонпазҳо:
1. Ҳеҷ чизи иловагӣ лозим нест.
2. Ҳамеша имкони узрхоҳӣ ва ғазаб кардан вуҷуд дорад.
3. Вақти зиёде, ки шумо метавонед бо ихтиёри худ сарф кунед.
Дардҳо ва доғҳо:
1. Муштарӣ дер ё зуд дар бораи моҳияти мавҷудият ва адолати умумибашарӣ дар ин дунё андеша мекунад ва бори дигар ба худ савол медиҳад, ки чаро ман пули худро ба онҳо медиҳам? Оқибат ҳамеша як хел аст - саволи ягона ин аст, ки кай муштарӣ дилгир мешавад ва хайрухуш мекунад. Ва ғизодиҳанда холӣ хоҳад буд. аламовар аст.
2. Такмили инженер — сифр.
3. Мушкилоти банаќшагирии кор ва борбардорї

Варианти 2- "Рақс бо даф, буғ кардан ва пӯшидани пойафзол"

Сархати 1-Чаро системаи мониторинг лозим аст, мо ҳама чизро бо дархостҳо мегирем. Мо як қатор ҳама гуна дархостҳоро ба луғати додаҳо ва намуди динамикӣ иҷро мекунем, ҳама намудҳои ҳисобкунакҳоро фаъол мекунем, ҳама чизро ба ҷадвалҳо мегузорем ва рӯйхатҳо ва ҷадвалҳоро мунтазам таҳлил мекунем. Дар натича мо графикхо, чадвалхо, хисоботхои зебо ё на он кадар зебо дорем. Чизи асосй он аст, ки бештар, бештар.
Сархати 2-Мо фаъолият ба вуҷуд меорем ва таҳлили ҳамаи инҳоро оғоз мекунем.
Сархати 3-Мо њуљљати муайян омода карда истодаем, мо ин њуљљатро содда меномем - «чї тавр бояд базаи маълумотро таъсис дињем».
Сархати 4-Муштарӣ ин ҳама шукӯҳи графикҳо ва рақамҳоро дида, дар як боварии кӯдакона ва соддалавҳона аст - акнун ҳама чиз барои мо кор мекунад, ба зудӣ. Ва, ӯ ба осонӣ ва бедард бо захираҳои молиявии худ ҷудо мешавад. Рохбарон низ боварй доранд, ки инженерони мо аъло кор мекунанд. Дар ҳадди аксар бор карда мешавад.
Сархати 5- Қадами 1-ро мунтазам такрор кунед.
Gingerbread ва donuts, кӯфтаҳо ва зарбаҳоЗанҷабил ва нонпазҳо:
1. Ҳаёти роҳбарон ва муҳандисон содда, пешгӯинашаванда ва пур аз фаъолият аст. Ҳама чиз садо медиҳад, ҳама банд аст.
2. Зиндагии муштарӣ низ бад нест - ӯ ҳамеша боварӣ дорад, ки ба ӯ каме сабр кардан лозим аст ва ҳамааш хуб мешавад. Вазъият беҳтар намешавад, хуб, дунё беадолат аст, дар ҳаёти оянда шумо бахт хоҳед дошт.
Дардҳо ва доғҳо:
1. Дер ё зуд, як провайдери зудтари хидмати шабеҳ пайдо мешавад, ки ҳамон корро мекунад, аммо каме арзонтар. Ва агар натиҷа якхела бошад, чаро бештар пардохт кунед. Ин боз боиси аз байн рафтани ғизодиҳанда мегардад.
2. дилгиркунанда аст. Хар як машгулияти бемаънй чй кадар дилгиркунанда аст.
3. Тавре ки дар версияи қаблӣ, ҳеҷ рушд вуҷуд надорад. Аммо барои муҳандис, манфии он дар он аст, ки бар хилофи варианти аввал, шумо бояд доимо IBD тавлид кунед. Ва ин вақт мегирад. Ки шумо метавонед ба манфиати дӯстдоштаатон сарф кунед. Азбаски шумо наметавонед ба худ ғамхорӣ кунед, ҳеҷ кас ба шумо ғамхорӣ намекунад.

Варианти 3 - Ба шумо велосипед ихтироъ кардан лозим нест, ба шумо танҳо лозим аст, ки онро харед ва савор шавед.

Бесабаб нест, ки муҳандисони ширкатҳои дигар пиццаро ​​бо пиво мехӯранд (оҳ, айёми шукӯҳи Санкт-Петербург дар солҳои 90-ум). Биёед системаҳои мониторингро истифода барем, ки сохта, ислоҳшуда ва кор мекунанд ва умуман фоиданоканд (хуб, ҳадди аққал ба эҷодкорони онҳо).
Gingerbread ва donuts, кӯфтаҳо ва зарбаҳоЗанҷабил ва нонпазҳо:
1. Ҳеҷ зарурате нест, ки вақтро барои таҳияи чизе, ки аллакай ихтироъ шудааст, сарф кунед. Онро гиред ва истифода баред.
2. Системаҳои мониторинг аз ҷониби аблаҳон навишта нашудаанд ва онҳо, албатта, муфиданд.
3. Системаҳои мониторинги корӣ одатан иттилооти филтршудаи муфидро пешниҳод мекунанд.
Дардҳо ва доғҳо:
1. Муҳандис дар ин ҳолат муҳандис нест, балки танҳо истифодабарандаи маҳсулоти ягон каси дигар ё корбар аст.
2. Фармоишгар бояд ба зарурати харидани чизе, ки ба таври умум фахмидан намехохад ва набояд мутмаин бошад ва умуман бучети сол тасдик шудааст ва тагйир намеёбад. Пас шумо бояд захираи алоҳида ҷудо кунед ва онро барои системаи мушаххас танзим кунед. Онхое. аввал шумо бояд пардохт кунед, пардохт кунед ва боз пардохт кунед. Ва муштарӣ бахил аст. Ин меъёри ин зиндагӣ аст.

Чӣ бояд кард - Чернышевский? Саволи шумо хеле асоснок аст. (Бо)

Дар ин ҳолат ва вазъияти кунунӣ, шумо метавонед онро каме дигар кунед - системаи назорати худамонро созем.
Мониторинги иҷрои дархостҳои PostgreSQL. Қисми 1 - гузоришдиҳӣ
Хуб, на система, албатта, ба маънои пурраи ин калима, он хеле баланд ва ғурур аст, аммо ҳадди ақалл вазифаи шуморо осонтар мекунад ва барои ҳалли ҳодисаҳои иҷроиш маълумоти бештар ҷамъ кунед. Барои он ки худро дар вазъият наёбед - "он ҷо равед, ман намедонам, ки дар куҷо чизе ёбам, ман намедонам."

Тарафҳои мусбат ва манфии ин вариант чист:

Тарафдор:
1. Ин ҷолиб аст. Хуб, ҳадди аққал ин назар ба доимии "кам кардани файли додаҳо, тағир додани фазои ҷадвал ва ғайра" ҷолибтар аст.
2. Инҳо малакаҳои нав ва рушди нав мебошанд. Ки дер ё зуд ба шумо прённик ва донаҳои арзанда медиҳад.
Эзоҳ:
1. Шумо бояд кор кунед. Сахт мехнат кунед.
2. Ба шумо лозим меояд, ки мунтазам моҳият ва дурнамои тамоми фаъолиятҳоро фаҳмонед.
3. Чизеро қурбон кардан лозим меояд, зеро ягона захирае, ки барои муҳандис мавҷуд аст - вақт - аз ҷониби Коинот маҳдуд аст.
4. Бадтарин ва нохушояндтарин чиз - натиҷа метавонад беҳуда ба монанди "На муш, на қурбоққа, балки ҳайвони номаълум" бошад.

Онҳое, ки таваккал намекунанд, шампан намехӯранд.
Ҳамин тавр - фароғат оғоз меёбад.

Идеяи умумӣ - ба таври схематикӣ

Мониторинги иҷрои дархостҳои PostgreSQL. Қисми 1 - гузоришдиҳӣ
(Иллюстратсия аз мақола гирифта шудааст «Синтез ҳамчун яке аз усулҳои баланд бардоштани самаранокии PostgreSQL")

Шарҳ:

  • Васеъгардонии стандартии PostgreSQL "pg_stat_statements" дар пойгоҳи додаҳои ҳадаф насб карда шудааст.
  • Дар базаи мониторинг, мо маҷмӯи ҷадвалҳои хидматрасониро барои нигоҳ доштани таърихи pg_stat_statements дар марҳилаи ибтидоӣ ва танзими метрика ва мониторинг дар оянда эҷод мекунем.
  • Дар мизбони мониторинг, мо маҷмӯи скриптҳои bash эҷод мекунем, аз ҷумла онҳое, ки барои тавлиди ҳодисаҳо дар системаи чиптаҳо.

Ҷадвалҳои хидматрасонӣ

Аввалан, схемаи соддакардашудаи ERD, ки дар ниҳоят чӣ рӯй дод:
Мониторинги иҷрои дархостҳои PostgreSQL. Қисми 1 - гузоришдиҳӣ
Тавсифи мухтасари ҷадвалҳоохири нуқта — мизбон, нуқтаи пайвастшавӣ ба инстансия
Махзани - параметрҳои пойгоҳи додаҳо
pg_stat_history - ҷадвали таърихӣ барои нигоҳ доштани аксҳои муваққатии намуди pg_stat_statements базаи мақсаднок
луғати метрикӣ - луғати нишондиҳандаҳои иҷроиш
metric_config — конфигуратсияи ченакҳои инфиродӣ
Метрика — нишондиҳандаи мушаххас барои дархосте, ки назорат карда мешавад
metric_alert_history - таърихи огоҳиҳои иҷроиш
log_query — ҷадвали хидматрасонӣ барои нигоҳ доштани сабтҳои таҳлилшуда аз файли гузориши PostgreSQL, ки аз AWS бор карда шудааст
асос — параметрхои даврахои ба сифати асос истифодашаванда
гузариш — конфигуратсияи ченакҳо барои санҷиши ҳолати пойгоҳи додаҳо
таърихи checkpoint_alert - таърихи огоҳии ченакҳои санҷиши саломатии махзани маълумот
pg_stat_db_queries — ҷадвали хидматрасонии дархостҳои фаъол
журнали фаъолият — ҷадвали хадамоти сабти фаъолият
trap_oid — ҷадвали хидматрасонии конфигуратсияи дом

Марҳилаи 1 - ҷамъоварии маълумоти оморӣ дар бораи иҷроиш ва гирифтани ҳисобот

Ҷадвал барои нигоҳ доштани маълумоти оморӣ истифода мешавад pg_stat_history
Сохтори ҷадвали pg_stat_history

                                          Ҷадвали "public.pg_stat_history" Сутуни | Навъи | Тағйирдиҳанда ---------------------+-------------------------- - -+--------------------------------- id | бутун | не нул пешфарз nextval('pg_stat_history_id_seq'::regclass) snapshot_timestamp | тамғаи вақт бе минтақаи вақт | database_id | бутун | dbid | oid | userid | oid | queryid | bigint | пурсиш | матн | занг | bigint | умумии_вақт | дақиқии дукарата | дақиқа_вақт | дақиқии дукарата | максимум_вақт | дақиқии дукарата | миёна_вақт | дақиқии дукарата | stddev_time | дақиқии дукарата | сатр | 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 | дақиқии дукарата | blk_write_time | дақиқии дукарата | baseline_id | бутун | Индексҳо: "pg_stat_history_pkey" PRIMARY KEY, btree (id) "database_idx" btree (database_id) "queryid_idx" btree (queryid) "snapshot_timestamp_idx" btree (snapshot_timestamp) constraints-калидҳои берунӣ Ktabaseid "EYFD:" МАДАНИЯТИ МАЪЛУМОТИ МАЪЛУМОТ (id ) ДАР БОРАИ ТОҶИКИСТОН КАСКАД

Тавре ки шумо мебинед, ҷадвал танҳо маълумоти ҷамъшудаи намоиш аст pg_stat_statements дар базаи мақсаднок.

Истифодаи ин ҷадвал хеле оддӣ аст

pg_stat_history омори ҷамъшудаи иҷрои дархостро барои ҳар як соат муаррифӣ мекунад. Дар аввали хар соат баъди пур кардани чадвал маълумотхои статистикй pg_stat_statements аз нав танзим кардан бо pg_stat_statements_reset().
Эзоҳ: Омор барои дархостҳое, ки давомнокии иҷро аз 1 сония зиёд аст, ҷамъоварӣ карда мешавад.
Пур кардани ҷадвали pg_stat_history

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

Дар натича баъди чанд вакт дар чадвал pg_stat_history мо маҷмӯи аксҳои мундариҷаи ҷадвалро хоҳем дошт pg_stat_statements базаи мақсаднок.

Дар асл гузориш медиҳад

Бо истифода аз дархостҳои оддӣ, шумо метавонед гузоришҳои хеле муфид ва ҷолиб ба даст оред.

Маълумоти ҷамъшуда барои як давраи муайян

Пурсиш

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 ;

Вақти DB

to_char(фосилаи '1 миллисония' * pg_total_stat_history_rec.total_time, 'HH24:MI:SS.MS')

Вақти I/O

ба_чар(фосилаи '1 миллисекунд' * ( pg_total_stat_history_rec.blk_read_time + pg_total_stat_history_rec.blk_write_time ), 'HH24:MI:SS.MS')

TOP10 SQL аз рӯи total_time

Пурсиш

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 АЗ РУИ ВАҚТИ УМУМИИ ИҶРО | #| queryid| занг | занг мезанад %| умумии_вақт (мс) | 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 мс.)| .03

TOP10 SQL аз рӯи вақти умумии I/O

Пурсиш

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 АЗ РУИ ВАҚТИ УМУМИИ I/O | #| queryid| занг | занг мезанад %| Вақти В/Х (мс)|дб вақти В/Х % +----+-----------+-----------+------ -----------+---------------------------------+----- ------ -- | 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 мс.)| .03

TOP10 SQL аз рӯи вақти максималии иҷро

Пурсиш

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 АЗ МУҲлати МАКС ИҶРО | #| акси | snapshotID| queryid| максимум_вақт (мс) +----+------------------+-----------+--------- --+--------------------------------------- | 1| 05.04.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| 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 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 аз ҷониби буфери SHARED хондан/навиштан

Пурсиш

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 аз ҷониби буфери муштарак хондан/навиштан | #| акси | snapshotID| queryid| блокҳои муштарак хонда | блокҳои муштарак менависанд +----+------------------+-----------+---------- -+--------------------+--------------------- | 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 ------------------------------------------------- -----------------------------------------------------

Гистограммаи тақсимоти дархостҳо аз рӯи вақти максималии иҷро

Пурсишҳо

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 | УМУМИИ ЗАНГХО: 33851920 | MIN ВАҚТ: 00:00:01.063 | МАКС ВАҚТ: 00:02:01.869 ------------------------------------------ --------------------------------------- | давомнокии дақиқа| давомнокии максимум| занг мезанад +---------------------------------+---------------------- --------------------+---------- | 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 аксбардорӣ аз рӯи дархост дар як сония

Пурсишҳо

--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 аксҳои лаҳзае, ки аз рӯи рақамҳои QueryPerSeconds фармоиш дода шудаанд --------------------------------------------- ---------------------------------- ------------------------------------------------- | #| акси | snapshotID| занг | dbtime умумии | QPS | вақти 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| 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 ms.)| 313.004 | 00:00:01.319( 1319.676 ms.)| 1.666

Таърихи иҷроиши соатбайъ бо QueryPerSeconds ва Time I/O

Пурсиш

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

Матни ҳамаи интихобҳои SQL

Пурсиш

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

Натиҷа

Тавре ки шумо мебинед, бо истифода аз воситаҳои хеле содда, шумо метавонед дар бораи сарбории кор ва ҳолати базаи маълумот бисёр маълумоти муфид гиред.

Шарҳ:Агар мо дархостро дар дархостҳо сабт кунем, мо таърихро барои дархости алоҳида мегирем (барои сарфаи ҷой, гузоришҳо барои дархости алоҳида партофта мешаванд).

Ҳамин тариқ, маълумоти оморӣ дар бораи иҷрои дархостҳо дастрас ва ҷамъоварӣ карда мешаванд.
Марҳилаи якум «ҷамъоварии маълумоти оморӣ» анҷом ёфт.

Шумо метавонед ба марҳилаи дуюм гузаред - "танзими ченакҳои иҷроиш".
Мониторинги иҷрои дархостҳои PostgreSQL. Қисми 1 - гузоришдиҳӣ

Аммо ин як ҳикояи дигар аст.

Давом дорад…

Манбаъ: will.com

Илова Эзоҳ