Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

2015. gada Alekseja Lesovska ziņojuma "Deep dive into PostgreSQL internal statistics" atÅ”ifrējums.

Ziņojuma autora atruna: Norādu, ka Å”is ziņojums datēts ar 2015. gada novembri — pagājuÅ”i vairāk nekā 4 gadi un ir pagājis daudz laika. Ziņojumā aplÅ«kotā versija 9.4 vairs netiek atbalstÄ«ta. Pēdējo 4 gadu laikā ir izlaisti 5 jauni laidieni, kuros parādÄ«jās daudz jauninājumu, uzlabojumu un izmaiņu attiecÄ«bā uz statistiku, un daļa materiāla ir novecojusi un nav aktuāla. PārskatīŔanas procesā es centos iezÄ«mēt Ŕīs vietas, lai neievilinātu tevi, lasÄ«tāj, maldu lamatās. Tomēr es neizvēlējos pārrakstÄ«t Ŕīs vietas, to ir ļoti daudz, un beigās sanāks pilnÄ«gi cits ziņojums.

Datubāze PostgreSQL ir liels mehānisms, kas sastāv no daudziem apakÅ”sistēmām, kuru koordinēta darbÄ«ba tieÅ”i ietekmē datubāzes veiktspēju. Ekspluatācijas procesā tiek nodroÅ”ināta statistikas un informācijas par komponentu darbÄ«bu apkopoÅ”ana, kas ļauj novērtēt PostgreSQL efektivitāti un veikt pasākumus veiktspējas uzlaboÅ”anai. Tomēr Ŕīs informācijas ir ļoti daudz un tā tiek piedāvāta diezgan vienkārÅ”otā veidā. Å Ä«s informācijas apstrāde un interpretācija reizēm ir visai netriviāla uzdevums, un "zoodārzs" rÄ«ku un utilÄ«tu var viegli apjukt pat pieredzējuÅ”u DBA.
Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis


Atskaņot video

Labdien! Mans vārds ir Aleksejs. Kā Iļja teica, es stāstīŔu par PostgreSQL statistiku.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

PostgreSQL aktivitātes statistika. PostgreSQL ir divas statistikas. Aktivitātes statistika, par kuru bÅ«s runa. Un plānotāja statistika par datu sadalÄ«jumu. Es stāstīŔu tieÅ”i par PostgreSQL aktivitātes statistiku, kas ļauj mums spriest par veiktspēju un kaut kā to uzlabot.

PastāstīŔu, kā efektÄ«vi izmantot statistiku dažādu problēmu risināŔanai, kas jums raduŔās vai varētu rasties.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

Ko ziņojumā nebÅ«s? Ziņojumā es netikÅ”u pie plānotāja statistikas, jo tā ir atseviŔķa tēma atseviŔķam ziņojumam par to, kā dati tiek glabāti datubāzē un par to, kā plānotājs iegÅ«st priekÅ”statu par Å”o datu kvalitatÄ«vām un kvantitatÄ«vām Ä«paŔībām.

Un nebūs arī rīku apskatu, es nesalīdzināŔu vienu produktu ar citu. Nekādas reklāmas nebūs. Atmetīsim to.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

Es vēlos jums parādÄ«t, ka statistikas izmantoÅ”ana ir noderÄ«ga. Tas ir nepiecieÅ”ams. To izmantot nav grÅ«ti. Mums bÅ«s nepiecieÅ”ams tikai parasts SQL un pamatzināŔanas par SQL.

Un runāsim par to, kādu statistiku izvēlēties problēmu risināŔanai.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

Ja mēs paskatāmies uz PostgreSQL un operētājsistēmā izpildÄ«sim komandu, lai apskatÄ«tu procesus, mēs redzēsim "melno kārbu". Mēs redzēsim dažus procesus, kas kaut ko dara, un pēc nosaukuma varam aptuveni iedomāties, ko tie dara. Bet, bÅ«tÄ«bā, tas ir melns kārba, iekŔā mēs ieskatÄ«ties nevaram.

Mēs varam aplÅ«kot procesora slodzi top, varam pārbaudÄ«t atmiņas izmantoÅ”anu ar kādām sistēmas utilÄ«tēm, bet ieskatÄ«ties PostgreSQL iekÅ”pusē mēs nevarēsim. Tam mums ir nepiecieÅ”ami citi rÄ«ki.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

Un turpinot, es pastāstīŔu, uz kurieni tiek tērēts laiks. Ja mēs iedomājamies PostgreSQL kā Ŕādu shēmu, tad mēs varam atbildēt, uz kurieni tiek tērēts laiks. Tas ir divas lietas: klientu pieprasÄ«jumu apstrāde no lietotnēm un foniskie uzdevumi, ko PostgreSQL veic, lai nodroÅ”inātu savu darbspēju.

Ja mēs sākam apskatÄ«t no kreisā augŔējā stÅ«ra, mēs varam izsekot, kā tiek apstrādāti klientu pieprasÄ«jumi. PieprasÄ«jums nāk no lietotnes un nākamajai darbÄ«bai tiek atvērta klienta sesija. PieprasÄ«jums tiek nodots plānotājam. Plānotājs izveido pieprasÄ«juma plānu. To nosÅ«ta tālāk izpildei. Notiek kāda bloku I/O operācija, saistÄ«ta ar tabulām un indeksiem. NepiecieÅ”amie dati tiek nolasÄ«ti no diskiem atmiņā speciālā apgabalā "shared buffers". PieprasÄ«juma rezultāti, ja tas ir updates, deletes, tiek fiksēti darÄ«jumu žurnālā WAL. Dažas statistikas informācija nonāk žurnālā vai statistikas kolektorā. Un pieprasÄ«juma rezultāts tiek nodots atpakaļ klientam. Pēc tam klients var atkārtot visu ar jaunu pieprasÄ«jumu.

Kādas ir mÅ«su fonisko uzdevumu un fonisko procesu Ä«paŔības? Mums ir vairāki procesi, kas nodroÅ”ina darbÄ«bu un uztur datu bāzi normālā darba režīmā. Å ie procesi tiks skarti arÄ« ziņojumā: tas ir autovacuum, checkpointer, procesi, kas saistÄ«ti ar replikāciju, background writer. Par katru no tiem es runāŔu ziņojuma gaitā.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

Kādas problēmas ir saistītas ar statistiku?

  • Informācijas ir daudz. PostgreSQL 9.4 nodroÅ”ina 109 metriku datu statistikas skatīŔanai. Tomēr, ja datubāzē ir daudz tabulu, shēmu un datubāžu, tad visas Ŕīs metrikas bÅ«s jāreizina ar attiecÄ«go tabulu un datubāzu skaitu. T. i., informācijas kļūst vēl vairāk. Un tajā ļoti viegli iegrimt.
  • Nākamā problēma ir tā, ka statitika tiek attēlota skaitÄ«tāju formā. Ja mēs aplÅ«kojam Å”o statistiku, mēs redzēsim pastāvÄ«gi pieaugoÅ”us skaitÄ«tājus. Ja no statistikas dzēŔanas brīža ir pagājis ļoti ilgs laiks, mēs redzēsim miljardiem vērtÄ«bas. Un tās mums neko nepasaka.
  • Nav vēstures. Ja jums ir notikusi kāda kļūme, kas notika 15-30 minÅ«tes atpakaļ, jÅ«s nevarat izmantot statistiku, lai uzzinātu, kas notika 15-30 minÅ«tes iepriekÅ”. Tā ir problēma.
  • Iekļautā rÄ«ka trÅ«kums PostgreSQL ir problēma. Koda izstrādātāji nesniedz nekādu utilÄ«tu. Viņiem nav nekāda lÄ«dzÄ«ga. Viņi vienkārÅ”i sniedz statistiku datubāzē. Izmantojiet to, veiciet ar to pieprasÄ«jumus, dariet, ko vēlaties.
  • Tā kā iekļautā rÄ«ka PostgreSQL nav, tas ir iemesls citai problēmai. Daudzas treÅ”o puÅ”u lietotnes. Katrs uzņēmums, kuram ir vairāk vai mazāk prasÄ«gas rokas, mēģina izstrādāt savu programmu. Un rezultātā kopienā ir ļoti daudz rÄ«ku, kurus var izmantot statistikas apstrādei. Un vieniem rÄ«kiem ir noteiktas iespējas, citiem rÄ«kiem nav citu iespēju, vai arÄ« ir kādas jaunas iespējas. Un rodas situācija, kad ir nepiecieÅ”ams izmantot divus, trÄ«s, četrus rÄ«kus, kas viens otru pārklāj un kuriem ir dažādas funkcijas. Tas ir ļoti nepatÄ«kami.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

Ko no tā var secināt? Ir svarÄ«gi spēt iegÅ«t statistiku tieÅ”i, lai nepaļautos uz programmām, vai arÄ« kādā veidā uzlabot Ŕīs programmas: pievienojot noteiktas funkcijas, lai gÅ«tu savu labumu.

Un ir nepiecieÅ”amas pamatzināŔanas SQL. Lai iegÅ«tu datus no statistikas, ir jāformulē SQL pieprasÄ«jumi, t. i., jums jāzina, kā sastādÄ«t select, join.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

Statistika piedāvā mums vairākas lietas. Tās var iedalīt kategorijās.

  • Pirmā kategorija ir notikumi, kas notiek datubāzē. Tas ir tad, kad datubāzē notiek kāds notikums: pieprasÄ«jums, piekļuve tabulai, automātiskā vakumēŔana, apstiprinājumi — tas viss ir notikumi. AttiecÄ«gajiem notikumiem skaitÄ«tāji tiek incrementēti. Mēs varam izsekot Å”iem notikumiem.
  • Otrā kategorija ir objektu Ä«paŔības, piemēram, tabulas, datubāzes. Tām ir Ä«paŔības. Tas ir tabulu izmērs. Mēs varam izsekot tabulu izaugsmei, indeksu pieaugumam. Mēs varam apskatÄ«t izmaiņas dinamiskā veidā.
  • Un treŔā kategorija ir laiks, kas nepiecieÅ”ams notikumam. PieprasÄ«jums ir notikums. Tam ir sava konkrēta ilguma mēra. Å eit tas sākās, Å”eit tas beidzās. Mēs varam to izsekot. Vai arÄ« laiks, kas nepiecieÅ”ams bloka lasīŔanai no diska vai ierakstīŔanai. Tādas lietas arÄ« tiek izsekotas.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

Statistikas avoti ir Ŕādi:

  • KopÄ«gajā atmiņā (shared buffers) ir segments, lai tur ievietotu statiskos datus; tur ir arÄ« tie paÅ”i skaitÄ«tāji, kas pastāvÄ«gi tiek incrementēti, kad notiek kādi notikumi vai rodas kādi momenti datubāzes darbÄ«bā.
  • Visi Å”ie skaitÄ«tāji nav pieejami lietotājam un pat nav pieejami administratoram. Tie ir zema lÄ«meņa dati. Lai pie tiem piekļūtu, PostgreSQL piedāvā interfeisu SQL funkciju veidā. Mēs varam veikt select vaicājumus, izmantojot Ŕīs funkcijas, un iegÅ«t kādu metriku (vai metrikas kopumu).
  • Tomēr izmantot Ŕīs funkcijas vienmēr nav ērti, tāpēc funkcijas kalpo kā pamats skatu (VIEWs) izveidoÅ”anai. Tie ir virtuāli tabulas, kas sniedz statistiku par kādu konkrētu apakÅ”sistēmu vai kādu grupu notikumu datubāzē.
  • Å ie iebÅ«vētie skatÄ«jumi (VIEWs) ir galvenais lietotāja interfeiss statistikas apstrādē. Tie ir pieejami noklusēti bez papildu konfigurācijas, varat to uzreiz izmantot, apskatÄ«t, ņemt no turienes informāciju. Ir arÄ« contrib pakotnes. Ir oficiālas contrib pakotnes. JÅ«s varat instalēt postgresql-contrib pakotni (piemēram, postgresql94-contrib), ielādēt nepiecieÅ”amo moduli konfigurācijā, norādÄ«t tam parametrus, restartēt PostgreSQL un varat to lietot. (PiezÄ«me. AtkarÄ«bā no izplatīŔanas, pēdējās versijās contrib pakotne ir daļa no galvenās pakotnes.).
  • Ir pastāv neoficiālie contrib. Tie netiek piegādāti ar standarta PostgreSQL komplektu. Tos nepiecieÅ”ams vai nu kompilēt, vai instalēt kā bibliotēku. Varianti var bÅ«t ļoti dažādi, atkarÄ«bā no tā, ko izstrādātājs ir izdomājis Å”im neoficiālajam contrib.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

Šajā slaidā ir attēloti visi tie skati (VIEWs) un daļa no funkcijām, kas ir pieejamas PostgreSQL 9.4. Kā redzam, to ir daudz. Un ir diezgan viegli apjukt, ja ar to saskaras pirmo reizi.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

Tomēr, ja mēs paņemam iepriekŔējo attēlu Kā tiek iztērēts laiks uz PostgreSQL un salÄ«dzinām ar Å”o sarakstu, tad iegÅ«stam Ŕādu attēlu. Katru skatu (VIEWs) vai katru funkciju mēs varam izmantot dažādiem mērÄ·iem, lai iegÅ«tu atbilstoÅ”o statistiku, kad darbojas PostgreSQL. Un mēs varam saņemt kādu informāciju par apakÅ”sistēmas darbÄ«bu.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

Pirmais, ko mēs aplÅ«kosim, ir pg_stat_database. Kā redzam, Å”is ir skats. Tajā ir daudz informācijas. Ä»oti dažāda informācija. Un tā sniedz ļoti noderÄ«gas zināŔanas par to, kas notiek mÅ«su datu bāzē.

Ko noderÄ«gu mēs varam no turienes iegÅ«t? Sāksim ar paŔām vienkārŔākajām lietām.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

select
sum(blks_hit)*100/sum(blks_hit+blks_read) as hit_ratio
from pg_stat_database;

Pirmais, ko mēs varam apskatÄ«t, ir procentuālais kopsummas rādÄ«tājs. Procentuālais kopsummas rādÄ«tājs ir noderÄ«ga metrika. Tā ļauj novērtēt, cik liels datu apjoms tiek ņemts no shared buffers keÅ”atmiņas, un cik liels datu apjoms tiek nolasÄ«ts no diska.

Saprotams, ka jo lielāks mÅ«su keÅ”atmiņas trāpÄ«jums, jo labāk. Mēs Å”o metrikas rādÄ«tāju novērtējam kā procentu. Un, piemēram, ja mÅ«su keÅ”atmiņas trāpÄ«juma procents pārsniedz 90 %, tad tas ir labi. Ja tas pazeminās zem 90 %, tas nozÄ«mē, ka mums nepietiek atmiņas, lai saglabātu karstos "datus" atmiņā. Un, lai izmantotu Å”os datus, PostgreSQL ir spiests piekļūt diskam, un tas ir lēnāk nekā tad, ja dati tiktu nolasÄ«ti no atmiņas. Jādomā par atmiņas palielināŔanu: vai nu palielināt shared buffers, vai pievienot vairāk fiziskās atmiņas (RAM).

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

select
datname,
(xact_commit*100)/(xact_commit+xact_rollback) as c_ratio,
deadlocks, conflicts,
temp_file, pg_size_pretty(temp_bytes) as temp_size
from pg_stat_database;

Ko vēl varam ņemt no Ŕī skatÄ«juma? Varam apskatÄ«t anomālijas, kas notiek datu bāzē. Ko Å”eit rāda? Å eit ir commits, rollbacks, pagaidu failu izveide, to apjoms, deadlocks un konflikti.

Mēs varam izmantot Å”o vaicājumu. Å is SQL ir diezgan vienkārÅ”s. Un mēs varam apskatÄ«t Å”os datus pie sevis.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

Un Å”eit uzreiz ir sliekŔņa vērtÄ«bas. Mēs skatāmies attiecÄ«bu starp commits un rollbacks. Commits – tas ir veiksmÄ«gs darÄ«juma apstiprinājums. Rollbacks – tas ir atcelÅ”ana, t. i., darÄ«jums veica kādu darbu, noslogoja datubāzi, kaut ko skaitÄ«ja, bet pēc tam notika kļūda un darÄ«juma rezultāti tiek noraidÄ«ti. T. i. pārāk liels skaits rollbacks ir slikti. Un bÅ«tu jāizvairās no tiem un jāpārskata kods, lai tā nenotiktu.

Konflikti (conflicts) ir saistÄ«ti ar replikāciju. Un tiem arÄ« vajadzētu iztÄ«rÄ«t. Ja jums ir kādi vaicājumi, kas tiek izpildÄ«ti replikā un rodas konflikti, tad jāizpēta Å”ie konflikti, jāskatās, kas notiek. Detalizēti var atrast žurnālos. Un jānovērÅ” konfliktainas situācijas, lai aplikācijas vaicājumi darbotos bez kļūdām.

Deadlocks – tā ir arÄ« slikta situācija. Kad vaicājumi sacenÅ”as par resursiem, viens vaicājums piekļūst vienam resursam un iegÅ«st slēgÅ”anu, otrs vaicājums piekļūst otram resursam un arÄ« iegÅ«st slēgÅ”anu, bet pēc tam abi vaicājumi piekļūst viens otra resursiem un bloķējas gaidot, kad kaimiņŔ atbrÄ«vos slēgÅ”anu. Tas ir arÄ« problemātisks stāvoklis. Tos jārisina, pārstrādājot aplikācijas un sērijveidā piekļūstot resursiem. Un, ja jÅ«s redzat, ka jÅ«su deadlocks pastāvÄ«gi palielinās, ir jāskatās detaļas žurnālos, jāizpēta raduŔās situācijas un jāpārbauda, kur ir problēma.

Pagaidu faili (temp_files) – tas ir arÄ« slikti. Kad lietotāja vaicājumam trÅ«kst atmiņas, lai novietotu operatÄ«vos, pagaidu datus, tas izveido diska failu. Un visas operācijas, kuras tas varēja veikt pagaidu buferÄ« atmiņā, sāk veikt jau uz diska. Tas ir lēni. Tas palielina vaicājuma izpildes laiku. Un klients, kas nosÅ«tÄ«ja vaicājumu uz PostgreSQL, saņems atbildi nedaudz vēlāk. Ja visas Ŕīs operācijas tiks veiktas atmiņā, Postgres atbildēs daudz ātrāk un klients gaidÄ«s mazāk.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

Pg_stat_bgwriter – Å”is skats apraksta divu fona apakÅ”sistēmu darbu PostgreSQL: tas ir checkpointer un fona rakstÄ«tājs.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

Vispirms izpētÄ«sim kontrolpunktus, t. i. checkpoints. Kas ir kontrolpunkti? Kontrolpunkts ir pozÄ«cija transakciju žurnālā, kas norāda, ka visi datu izmaiņas, kas fiksētas žurnālā, ir veiksmÄ«gi sinhronizētas ar datiem diskā. Process, atkarÄ«bā no slodzes un iestatÄ«jumiem, var bÅ«t gara un lielākoties sastāv no netÄ«ro lapu sinhronizācijas koplietojamo buferu ar datu failiem diskā. Kāpēc tas ir nepiecieÅ”ams? Ja PostgreSQL pastāvÄ«gi piekļūtu diskam un ņemtu datus no turienes un rakstÄ«tu datus katru reizi, kad piekļūtu, tas bÅ«tu lēni. Tāpēc PostgreSQL ir atmiņas segments, kura lielums ir atkarÄ«gs no konfigurācijas parametriem. Postgres Å”ajā atmiņā ievieto operatÄ«vos datus turpmākai apstrādei vai izsniegÅ”anai pēc pieprasÄ«juma. Ja notiek pieprasÄ«jumi uz datu izmaiņām, tad tās tiek mainÄ«tas. Un mēs saņemam divas datu versijas. Viena ir mÅ«su atmiņā, otra diskā. Un periodiski ir jāsinhronizē Å”ie dati. Mums ir jāsinhronizē tas, kas ir mainÄ«ts atmiņā, uz disku. Tam ir nepiecieÅ”ams kontrolpunkts.

Kontrolpunkts iziet cauri koplietojamiem buferiem, atzÄ«mē netÄ«ras lapas, ka tās ir nepiecieÅ”amas kontrolpunktam. Pēc tam viņŔ veic otro gājienu pa koplietojamiem buferiem. Un lapas, kas ir atzÄ«mētas kontrolpunktam, viņŔ jau sinhronizē. Tādējādi notiek datu sinhronizācija ar disku.

Ir divu veidu kontrolpunkti. Viens kontrolpunkts tiek veikts pēc laika intervāla. Å is kontrolpunkts ir noderÄ«gs un labs – checkpoint_timed. Un ir kontrolpunkti pēc pieprasÄ«juma – checkpoint required. Šāds kontrolpunkts notiek, kad mums ir ļoti liela datu rakstīŔana. Mēs esam ierakstÄ«juÅ”i ļoti daudz transakciju žurnālu. Un PostgreSQL uzskata, ka tam ir nepiecieÅ”ams visu to sinhronizēt pēc iespējas ātrāk, veikt kontrolpunktu un turpināt dzÄ«vot.

Un, ja jÅ«s esat skatÄ«jies statistiku pg_stat_bgwriter un redzējāt, ka jums checkpoint_req ir daudz lielāks nekā checkpoint_timed, tad tas ir slikti. Kāpēc slikti? Tas nozÄ«mē, ka PostgreSQL atrodas pastāvÄ«gā stresa situācijā, kad tam ir jāieraksta dati diskā. Kontrolpunkts pēc laika intervāla ir mazāk stresa un tiek veikts saskaņā ar iekŔējo grafiku un ir kā izstiepts laika posms. PostgreSQL ir iespēja veikt pārtraukumus darbā un nenoslogot diskusistēmu. Tas ir labvēlÄ«gi PostgreSQL. Un pieprasÄ«jumi, kas tiek izpildÄ«ti kontrolpunkta laikā, neizjutÄ«s stresu no tā, ka diskusistēma ir aizņemta.

Un checkpoint regulēŔanai ir trÄ«s parametri:

  • checkpoint_segments.

  • checkpoint_timeout.

  • checkpoint_completion_target.

Tie ļauj regulēt kontrolpunktu darbÄ«bu. Bet es par tiem neapstāŔos. To ietekme ir jau atseviŔķa tēma.

Uzmanību: Pārskatā aplūkotā versija 9.4 jau nav aktuāla. Mūsdienu PostgreSQL versijās parametrs checkpoint_segments ir aizstāts ar parametriem min_wal_size un max_wal_size.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

Nākamā apakÅ”sistēma ir fona rakstÄ«tājs — fona rakstÄ«tājs. Ko viņŔ dara? ViņŔ strādā pastāvÄ«gi bezgalÄ«gā ciklā. ViņŔ skenē lapas kopshared buffers un tÄ«ras lapas, kuras viņŔ atrada, nospiež uz diska. Tādējādi viņŔ palÄ«dz checkpointer ’am paveikt mazāk darba kontrolpunktu izpildes procesā.

Kāpēc viņŔ vēl ir nepiecieÅ”ams? ViņŔ nodroÅ”ina vajadzÄ«bu pēc tÄ«rām lapām kopshared buffers, ja tās pēkŔņi nepiecieÅ”amas (lielā skaitā un uzreiz) datu izvietoÅ”anai. Pieņemsim, ka radusies situācija, kad, lai izpildÄ«tu pieprasÄ«jumu, nepiecieÅ”amas tÄ«ras lapas, un tās jau ir kopshared buffers. Postgres backend to vienkārÅ”i ņem un izmanto, viņam paÅ”am nevajag neko tÄ«rÄ«t. Bet, ja tādu lapu nav, backend aptur darbu un sāk meklēt lapas, lai nospiestu tās uz diska un izmantotu savām vajadzÄ«bām — tas negatÄ«vi ietekmē izpildāmo pieprasÄ«jumu laiku. Ja redzat, ka jÅ«su parametrs maxwritten_clean ir liels, tas nozÄ«mē, ka fona rakstÄ«tājs netiek galā ar savu uzdevumu un ir jāpalielina parametri bgwriter_lru_maxpages, lai viņŔ varētu vienā ciklā paveikt vairāk darba, vairāk notÄ«rÄ«t lapas.

Un vēl viens ļoti noderÄ«gs rādÄ«tājs — tas ir buffers_backend_fsync. Backend netiek veikta fsync, jo tas ir lēni. Viņi nodod fsync augstāk IO stakā checkpointer ’am. Checkpointer ’am ir savs gaidīŔanas rindas process, viņŔ periodiski apstrādā fsync un sinhronizē lapas atmiņā ar failiem diskā. Ja checkpointer ’a gaidīŔanas rinda ir liela un piepildÄ«ta, backend ir spiests pats veikt fsync un tas lēni ietekmē backend darbÄ«bu,, t.i., klients saņems atbildi vēlāk, nekā varētu. Ja redzat, ka Ŕī vērtÄ«ba ir lielāka par nulli, tad tas jau ir problēma un ir jāpieverÅ” uzmanÄ«ba fona rakstÄ«tāja iestatÄ«jumiem un arÄ« jānovērtē diska apakÅ”sistēmas veiktspēja.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

UzmanÄ«bu: _Nākamais teksts apraksta statistiskos attēlojumus, kas saistÄ«ti ar replikāciju. Lielākā daļa attēlojumu un funkciju nosaukumu tika pārdēvēti Postgres 10. PārdēvēŔanas bÅ«tÄ«ba bija nosaukumu nomaiņa xlog uz wal un location uz lsn funkciju un attēlojumu nosaukumos un tamlÄ«dzÄ«gi. Konkretās piemērs, funkcija pg_xlog_location_diff() tika pārdēvēta kā pg_wal_lsn_diff()._

Šeit mums arī ir daudz dažādu lietu. Bet mums būs nepiecieŔami tikai punkti, kas saistīti ar location.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

Ja mēs redzam, ka visi vērtības ir vienādas, tad tas ir ideāls variants, un replikācija nepaliek aiz meistara.

Å Ä« seÅ”u zÄ«mju pozÄ«cija ir pozÄ«cija darÄ«jumu žurnālā. Tā pastāvÄ«gi palielinās, ja datu bāzē ir kāda aktivitāte: insert, delete utt.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

cik xlog ir uzrakstīts baitos
$ select
pg_xlog_location_diff(pg_current_xlog_location(),'0/00000000');
replikācijas aizture baitos
$ select
client_addr,
pg_xlog_location_diff(pg_current_xlog_location(), replay_location)
from pg_stat_replication;
replikācijas aizture sekundēs
$ select
extract(epoch from now() - pg_last_xact_replay_timestamp());

Ja Ŕīs lietas atŔķiras, tātad ir kāda aizture. Aizture – tas ir replikas aizkavēŔanās pret meistaru, tas ir, dati atŔķiras starp serveriem.

Ir trÄ«s iemesli aizkavēŔanai:

  • Tas ir disku subsistēmas nepietiekama jauda, lai pareizi pierakstÄ«tu failu sinhronizāciju.
  • Tas var bÅ«t iespējamās tÄ«kla kļūdas vai tÄ«kla sastrēgumi, kad dati netiek laikus nogādāti replikā, un tas tos nevar reproducēt.
  • Un procesors. Procesors ir ļoti reta situācija. Un es tādu esmu redzējis divas vai trÄ«s reizes, bet tas tā var bÅ«t.

Un Å”ie trÄ«s vaicājumi, kas ļauj mums izmantot statistiku. Mēs varam novērtēt, cik daudz ir uzrakstÄ«ts mÅ«su darÄ«jumu žurnālā. Ir Ŕī funkcija pg_xlog_location_diff un varam novērtēt replikācijas aizturi baitos un sekundēs. Mēs arÄ« izmantojam Å”o vērtÄ«bu no Ŕī attēlojuma (VIEWs).

PiezÄ«me: _Pār pg_xlog_locationdiff() funkcijām var izmantot atņemÅ”anas operatoru un atņemt vienu pozÄ«ciju no otras. Tas ir ērti.

Runājot par aizturi, kas ir sekundēs, ir viens moments. Ja meistara pusē nenotiek nekāda aktivitāte, darÄ«jums tur bija pirms 15 minÅ«tēm, un nav nekādas aktivitātes, ja mēs Å”ajā brÄ«dÄ« pārbaudām Å”o aizturi replikā, mēs redzēsim 15 minūŔu aizturi. Par to jāatceras. Tas var apmulst, kad jÅ«s skatāties Å”o aizturi.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

Pg_stat_all_tables – vēl viena noderÄ«ga apskate. Tā rāda statistiku par tabulām. Kad mÅ«su datubāzē ir tabulas, kurām ir kāda aktivitāte, kādas darbÄ«bas, mēs varam Å”o informāciju iegÅ«t no Ŕīs apskates.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

select
relname,
pg_size_pretty(pg_relation_size(relname::regclass)) as size,
seq_scan, seq_tup_read,
seq_scan / seq_tup_read as seq_tup_avg
from pg_stat_user_tables
where seq_tup_read > 0 order by 3,4 desc limit 5;

Pirmais, ko varam apskatÄ«t, ir secÄ«gās skenēŔanas pēc tabulas. Pats skaitlis pēc Å”iem pārejām vēl nav obligāti slikts un nepierāda, ka mums jau kaut kas jādara.

Tomēr ir otrā metrika – seq_tup_read. Tas ir to rindu skaits, kas atgrieztas secÄ«gās skenēŔanas rezultātā. Ja vidējais skaitlis pārsniedz 1 000, 10 000, 50 000, 100 000, tad tas jau ir rādÄ«tājs, ka varbÅ«t jums ir jāpievieno indekss, lai piekļuves notiktu pēc indeksa, vai varbÅ«t optimizēt vaicājumus, kas izmanto Ŕādas secÄ«gas skenēŔanas, lai to nepieļautu.

VienkārÅ”s piemērs – pieņemsim, ka vaicājums ar lielu OFFSET un LIMIT ir izpildāms. Piemēram, tiek skenētas 100 000 rindas tabulā, un pēc tam tiek apkopotas 50 000 vajadzÄ«gās rindas, bet iepriekŔējās skenētās rindas tiek noraidÄ«tas. Tas arÄ« ir slikts gadÄ«jums. Un Ŕādus vaicājumus ir jāoptimizē. Å eit ir tāds vienkārÅ”s SQL vaicājums, ar kuru var apskatÄ«t un novērtēt iegÅ«tās ciparnotes.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

select
relname,
pg_size_pretty(pg_total_relation_size(relname::regclass)) as
full_size,
pg_size_pretty(pg_relation_size(relname::regclass)) as
table_size,
pg_size_pretty(pg_total_relation_size(relname::regclass) -
pg_relation_size(relname::regclass)) as index_size
from pg_stat_user_tables
order by pg_total_relation_size(relname::regclass) desc limit 10;

Tabulu izmērus var iegÅ«t arÄ« ar Ŕīs tabulas palÄ«dzÄ«bu un, izmantojot papildu funkcijas. pg_total_relation_size(), pg_relation_size().

ÄŖpaÅ”i ir metakomandas dt un di, kuras var izmantot PSQL un arÄ« apskatÄ«t tabulu un indeksu izmērus.

Tomēr funkciju izmantoÅ”ana palÄ«dz mums apskatÄ«t tabulu izmērus, ņemot vērā indeksus vai neņemot tos vērā, un jau veikt kādas novērtēŔanas, pamatojoties uz datu bāzes pieaugumu, t.i., kā tā mums aug, ar kādu intensitāti un jau veikt secinājumus par izmēru optimizēŔanu.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

Aktivitāte rakstīŔanai. Kas ir ieraksts? ApskatÄ«sim operāciju UPDATE – rindu atjaunināŔanas operācija tabulā. Faktiski update ir divas operācijas (vai pat vairāk). Tā ir jaunas rindas versijas ievietoÅ”ana un vecās rindas versijas atzÄ«mēŔana kā novecojusi. Pēc tam nāks automātiska vakuuma operācija, un Ŕīs novecojuŔās rindas versijas tiks izdzēstas, un Ŕī vieta tiks atzÄ«mēta kā pieejama atkārtotai izmantoÅ”anai.

Turklāt update nav tikai tabulas atjaunināŔana. Tas ir arī indeksu atjaunināŔana. Ja jums tabulā ir daudz indeksu, tad, veicot update, visi indeksi, kuros piedalās laukā atjauninātie dati, arī būs jāpiedāvā atjaunināt. Šajos indeksos arī būs novecojuŔas rindas versijas, kuras būs jāiztīra.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

select
s.relname,
pg_size_pretty(pg_relation_size(relid)),
coalesce(n_tup_ins,0) + 2 * coalesce(n_tup_upd,0) -
coalesce(n_tup_hot_upd,0) + coalesce(n_tup_del,0) AS total_writes,
(coalesce(n_tup_hot_upd,0)::float * 100 / (case when n_tup_upd > 0
then n_tup_upd else 1 end)::float)::numeric(10,2) AS hot_rate,
(select v[1] FROM regexp_matches(reloptions::text,E'fillfactor=(\d+)') as
r(v) limit 1) AS fillfactor
from pg_stat_all_tables s
join pg_class c ON c.oid=relid
order by total_writes desc limit 50;

Un pateicoties savai struktÅ«rai, UPDATE ir smagas operācijas. Tomēr tās var atvieglot. Ir hot updates. Tie parādÄ«jās PostgreSQL versijā 8.3. Un kas tas ir? Tas ir viegli atjaunināms update, kas neizsauc indeksu pārveidoÅ”anu. T.i., mēs atjaunojam ierakstu, bet tajā paŔā laikā tiek atjaunots tikai ieraksts lapā (kura pieder tabulai), bet indeksu pirms tam norādÄ«ja uz to paÅ”u ierakstu lapā. Tur nedaudz ir interesanta darba loÄ£ika, kad nāk vakuums, tad tas Ŕīs saites hot pārveido un viss turpina darboties bez indeksu atjaunināŔanas, un tas notiek ar mazākām resursu izmaksām.

Un kad jums ir n_tup_hot_upd liels, tas ir ļoti labi. Tas nozīmē, ka vieglie atjauninājumi pārsniedz un tas veidojas mums lētāk izmaksu ziņā, un viss ir izcili.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

ALTER TABLE table_name SET (fillfactor = 70);

Kā palielināt apjomu hot updateu? Mēs varam izmantot fillfactor. Tas nosaka rezervētā brÄ«vā vieta apjomu, kad tiek aizpildÄ«ta lapa tabulā ar INSERT. Kad tabulā tiek veiktas ievadīŔanas, tās pilnÄ«bā aizpilda lapu, neatstājot tajā tukÅ”u vietu. Pēc tam tiek pieŔķirta jauna lapa. Atkal dati tiek aizpildÄ«ti. Un Ŕī uzvedÄ«ba pēc noklusējuma ir fillfactor = 100 %.

Mēs varam iestatÄ«t fillfactor uz 70%. T.i., kad tiek veiktas ievades, tiek izveidota jauna lapa, bet tiek aizpildÄ«ti tikai 70% lapas. Un 30% paliek rezerves. Kad bÅ«s nepiecieÅ”ams veikt atjauninājumu, ir ļoti liela varbÅ«tÄ«ba, ka tas notiks tajā paŔā lapā, un jaunā versija rindiņas tiks ievietota tajā paŔā lapā. Tiks veikta hot_update. Tādējādi tiek atvieglota ierakstīŔana tabulās.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

select c.relname,
current_setting('autovacuum_vacuum_threshold') as av_base_thresh,
current_setting('autovacuum_vacuum_scale_factor') as av_scale_factor,
(current_setting('autovacuum_vacuum_threshold')::int +
(current_setting('autovacuum_vacuum_scale_factor')::float * c.reltuples))
as av_thresh,
s.n_dead_tup
from pg_stat_user_tables s join pg_class c ON s.relname = c.relname
where s.n_dead_tup > (current_setting('autovacuum_vacuum_threshold')::int
+ (current_setting('autovacuum_vacuum_scale_factor')::float * c.reltuples));

Avotovakuuma rinda. Avotovakuums ir tāda apakÅ”sistēma, par kuru PostgreSQL statistikā ir ļoti maz informācijas. Mēs varam redzēt tabulās tikai pg_stat_activity, cik daudz avotovakuuma paÅ”laik notiek. Tomēr saprast, cik daudz tabulu ir rinda, ir ļoti grÅ«ti.

PiezÄ«me: _Sākot ar PostgreSQL versiju 10, situācija avotovakuuma uzraudzÄ«bā ir ievērojami uzlabojusies — ir parādÄ«jusies pg_stat_progressvacuum, kas bÅ«tiski atvieglo avotovakuuma uzraudzÄ«bu.

Mēs varam izmantot Ŕādu vienkārÅ”otu vaicājumu. Un mēs varam paskatÄ«ties, kad vajadzētu veikt vakuumu. Bet kā un kad vajadzētu darboties vakuumam? Tie ir novecojuÅ”i rindiņu varianti, par kuriem es runāju iepriekÅ”. Tika veiktas atjauninājums, jauna rindiņas versija tika ievietota. ParādÄ«jās novecojusi rindiņas versija. Tabulā pg_stat_user_tables ir tāds parametrs n_dead_tup. Tas parāda "miruÅ”o" rindiņu skaitu. Un tiklÄ«dz miruÅ”o rindiņu skaits kļūst lielāks par noteiktu slieksni, avotovakuums ieradÄ«sies pie tabulas.

Un kā tiek aprēķināts Å”is slieksnis? Tas ir konkrēts procentuālais attiecÄ«ba no kopējā rindiņu skaita tabulā. Ir parametrs autovacuum_vacuum_scale_factor. Tas nosaka procentuālo attiecÄ«bu. Pieņemsim, 10% + tur klāt ir 50 rindiņu pamata slieksnis. Un kas notiek? Kad mums miruÅ”o rindiņu skaits ir lielāks par "10% + 50" no visām rindiņām tabulā, mēs iestatām tabulu uz avotovakuumu.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

select c.relname,
current_setting('autovacuum_vacuum_threshold') as av_base_thresh,
current_setting('autovacuum_vacuum_scale_factor') as av_scale_factor,
(current_setting('autovacuum_vacuum_threshold')::int +
(current_setting('autovacuum_vacuum_scale_factor')::float * c.reltuples))
as av_thresh,
s.n_dead_tup
from pg_stat_user_tables s join pg_class c ON s.relname = c.relname
where s.n_dead_tup > (current_setting('autovacuum_vacuum_threshold')::int
+ (current_setting('autovacuum_vacuum_scale_factor')::float * c.reltuples));

Tomēr te ir viens moments. Pamata slieksņi parametriem av_base_thresh un av_scale_factor var varēji noteikt individuāli. Un attiecīgi slieksnis nebūs globāls, bet individuāls tabulai. Tāpēc, lai aprēķinātu, tur jāizmanto viltības un triki. Un, ja jūs interesē, varat apskatīt mūsu kolēģu pieredzi no Avito (saite slaidā ir nederīga un atjaunināta tekstā).

Viņi uzrakstÄ«ja priekÅ” munin spraudņa, kas ņem vērā Å”os faktorus. Tur ir divlapu garÅ” saraksts. Bet tas aprēķina pareizi un diezgan efektÄ«vi ļauj novērtēt, kur mums nepiecieÅ”ams daudz vakuuma tabulām, kur maz.

Ko mēs ar to varam darÄ«t? Ja mums ir liela rinda un automātiskais vakuums netiek galā, mēs varam palielināt vakuuma darbinieku skaitu vai vienkārÅ”i padarÄ«t vakuumu agresÄ«vāku, lai tas tiktu aktivizēts ātrāk, apstrādājot tabulu mazākos gabalos. Tādējādi rinda samazināsies. — Galvenais ir uzraudzÄ«t slodzi uz diskdzinēm, jo vakuums ir dārgs, lai gan ar SSD/NVMe ierīču parādīŔanos Ŕī problēma kļuva mazāk pamanāma.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

Pg_stat_all_indexes – tas ir statistikas rādÄ«tājs par indeksiem. Tas ir neliels. Un mēs varam to izmantot, lai saņemtu informāciju par indeksu izmantoÅ”anu. Un piemēram, varam noteikt, kuri indeksi mums ir lieki.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

Kā jau teicu, update – tas ne tikai atjauno tabulas, tas arÄ« atjauno indeksus. AtbilstoÅ”i, ja mÅ«su tabulai ir daudz indeksu, tad, atjaunojot rindas tabulā, ir jātiek atjaunotiem arÄ« indeksētajiem laukiem, un ja mums ir neizmantoti indeksi, par kuriem nav indeksu skenēŔanas, tad tie ir pārāk smagi. Un no tiem ir jāatbrÄ«vojas. Tāpēc mums nepiecieÅ”ams lauks idx_scan. Mēs vienkārÅ”i skatāmies indeksu skenēŔanas skaitu. Ja indekss tam ir nulles skenēŔana relatÄ«vi garā statiskās informācijas uzglabāŔanas periodā (ne mazāk kā 2-3 nedēļas), visticamāk, tie ir sliktie indeksi, no kuriem mums jāatbrÄ«vojas.

PiezÄ«me: Meklējot neizmantotus indeksus klasteru plÅ«stoŔās replikācijas gadÄ«jumā, ir jāpārbauda visi klastera mezgli, jo statistika nav globāla, un, ja indekss netiek izmantots uz galvenā, tas var tikt izmantots uz replikām (ja tur ir slodze).

Divas saites:

https://github.com/dataegret/pg-utils/blob/master/sql/low_used_indexes.sql

http://www.databasesoup.com/2014/05/new-finding-unused-indexes-query.html

Tās ir progresīvākas pieprasījumu piemēri, kā meklēt neizmantotus indeksus.

Otrā saite ir diezgan interesants pieprasījums. Tur ir ļoti netipiska loģika. Ieteicu to iepazīt.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

Kas vēl jāpiezīmē par indeksem?

  • Neizmantotie indeksi ir slikti.

  • Viņi aizņem vietu.

  • Viņi palēnina atjaunināŔanas operācijas.

  • Liekas lieka darba vakumam.

Ja mēs likvidēsim neizmantotos indeksus, mēs tikai uzlabosim datu bāzi.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

Nākamais attēlojums ir pg_stat_activity. Tas ir lÄ«dzÄ«gs rÄ«kam ps, tikai PostgreSQL. Ja ps'os jÅ«s skatāties procesus operētājsistēmā, tad pg_stat_activity tas parādÄ«s aktivitāti iekÅ” PostgreSQL.

Ko mēs varam noderīgu iegūt no turienes?

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

select
count(*)*100/(select current_setting('max_connections')::int)
from pg_stat_activity;

Mēs varam aplūkot kopējo aktivitāti, kas notiek datu bāzē. Mēs varam veikt jaunu izvietojumu. Mums tur viss ir sabojāts, jauni savienojumi netiek pieņemti, kļūdas krīt aplikācijā.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

select
client_addr, usename, datname, count(*)
from pg_stat_activity group by 1,2,3 order by 4 desc;

Mēs varam izpildÄ«t Ŕādu pieprasÄ«jumu un apskatÄ«t kopējo savienojumu procentu attiecÄ«bā pret maksimālo savienojumu limitu un redzēt, kurÅ” no mums ir aizņēmis visvairāk savienojumu. Un Å”ajā gadÄ«jumā mēs redzam, ka lietotājs cron_role atvēra 508 savienojumus. Un kaut kas ar viņu tur notika. Jārisina, jāpārbauda. Un diezgan iespējams, ka tas ir kāds anomāls savienojumu skaits.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

Ja mums ir OLTP slodze, pieprasījumiem jāizpildās ātri, ļoti ātri, un nedrīkst būt garu pieprasījumu. Tomēr, ja rodas gari pieprasījumi, tad īstermiņā nekas traks nav, bet ilgtermiņā gari pieprasījumi kaitē datu bāzei, tie palielina tabulu bloat efektu, kad notiek tabulu fragmentācija. No bloat un garu pieprasījumu jāatbrīvojas.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

select
client_addr, usename, datname,
clock_timestamp() - xact_start as xact_age,
clock_timestamp() - query_start as query_age,
query
from pg_stat_activity order by xact_start, query_start;

Pievērsiet uzmanÄ«bu: ar Ŕādu pieprasÄ«jumu mēs varam noteikt garos pieprasÄ«jumus un darÄ«jumus. Mēs izmantojam funkciju clock_timestamp() lai noteiktu izpildes laiku. Garos pieprasÄ«jumus, kurus mēs atradām, mēs varam atcerēties, izpildÄ«t explain, apskatÄ«t plānus un kaut kā optimizēt. PaÅ”reizējos garos pieprasÄ«jumus mēs iznÄ«cinām un turpinām dzÄ«vot.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

select * from pg_stat_activity where state in
('idle in transaction', 'idle in transaction (aborted)';

Slikti darījumi ir darījumi stāvoklī idle in transaction un idle in transaction (aborted).

Ko tas nozÄ«mē? Tranzakcijām ir vairākas stāvokļa situācijas. Un viens no Å”iem stāvokļiem var mainÄ«ties jebkurā brÄ«dÄ«. Lai noteiktu stāvokļus, ir lauks state Å”ajā skatÄ«jumā. Un mēs to izmantojam, lai noteiktu stāvokli.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

select * from pg_stat_activity where state in
('idle in transaction', 'idle in transaction (aborted)';

Un, kā jau iepriekÅ” minēju, Å”ie divi stāvokļi idle in transaction un idle in transaction (aborted) – tas ir slikti. Kas tas ir? Tas ir tad, kad pielietojums ir atvēris tranzakciju, veicis kādas darbÄ«bas un devies savās lietās. Tranzakcija ir palikusi atvērta. Tā karājas, tajā nekas nenotiek, tā aizņem savienojumu, bloķē modificētās rindas un potenciāli vēl palielina bloat citu tabulu dēļ, pateicoties Postgres tranzakciju dzinēja arhitektÅ«rai. Un Ŕādas tranzakcijas arÄ« ir jānovērÅ”, jo tās ir kaitÄ«gas visās jomās.

Ja jūs redzat, ka jūsu datu bāzē ir vairāk par 5-10-20, tad jāsāk uztraukties un kaut kas ir jādara.

Å eit mēs arÄ« laika aprēķinam izmantojam clock_timestamp(). Tranzakcijas novērÅ”am, pielietojumu optimizējam.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

Kā jau iepriekÅ” minēju, bloķēŔana – tas ir tad, kad divas vai vairāk tranzakcijas cÄ«nās par vienu vai grupu resursu. Tāpēc mums ir lauks waiting ar loÄ£isko vērtÄ«bu true vai false.

True – tas nozÄ«mē, ka process ir gaidīŔanas režīmā, jāveic kaut kas. Kad process ir gaidīŔanas režīmā, tas nozÄ«mē, ka klients, kurÅ” iniciējis Å”o procesu, arÄ« gaida. Klients pārlÅ«kprogrammā arÄ« sēž un gaida.

Uzmanību: _Sākot no Postgres 9.6 versijas, lauks waiting ir dzēsts un tā vietā ir pievienoti divi informatīvāki lauki wait_event_type un wait_event._

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

Ko darÄ«t? Ja jÅ«s redzat true ilgu laiku, tas nozÄ«mē, ka no Ŕādiem pieprasÄ«jumiem jāatbrÄ«vojas. Mēs vienkārÅ”i novērÅ”am Ŕādas tranzakcijas. ProgrammatÅ«ras izstrādātājiem informējam, ka kaut kā jāoptimizē, lai nebÅ«tu resursu konkurences. Un turpinājumā izstrādātāji optimizē lietotni, lai Ŕādas situācijas neradÄ«tos.

Un pēdējais, bet potenciāli ne fatāls gadÄ«jums – tas ir deadlocks raÅ”anās. Divas tranzakcijas atjaunināja divus resursus, pēc tam atkal piekļūst tiem, jau pretējiem resursiem. PostgreSQL Å”ajā gadÄ«jumā paņems un pats novērsÄ«s tranzakciju, lai cita varētu turpināt darbu. Tā ir slēgta situācija, un tā pati nesakārtosies. Tāpēc PostgreSQL ir spiests pieņemt galējus pasākumus.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

https://github.com/lesovsky/uber-scripts/blob/master/postgresql/sql/c4_06_show_locked_queries.sql

https://github.com/lesovsky/uber-scripts/blob/master/postgresql/sql/show_locked_queries_95.sql

https://github.com/lesovsky/uber-scripts/blob/master/postgresql/sql/show_locked_queries_96.sql

http://big-elephants.com/2013-09/exploring-query-locks-in-postgres/

Un Å”eit ir divi pieprasÄ«jumi, kas ļauj izsekot bloķēŔanām. Mēs izmantojam skatu pg_locks, kas ļauj izsekot smagas bloķēŔanas.

Un pirmais saite – tas ir pats jautājuma teksts. Tas ir diezgan garÅ”.

Un otra saite – tas ir raksts par bloķēŔanām. To ir lietderÄ«gi izlasÄ«t, tas ir ļoti interesants.

Tātad, ko mēs redzam? Mēs redzam divus pieprasÄ«jumus. Transakcija ar ALTER TABLE – tas ir bloķējoÅ”s transakcija. Tā ir uzsākta, bet nav pabeigta, un lietojumprogramma, kas uzsāka Å”o transakciju, kaut kur nodarbojas ar citām lietām. Un otrais pieprasÄ«jums – update. Tas gaida, kad pabeigsies alter table, lai varētu turpināt savu darbu.

Tālāk mēs varam noskaidrot, kurÅ” kādu ir aizķēris, tur un varam ar to strādāt tālāk.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

Nākamais modulis – tas ir pg_stat_statements. Kā jau teicu, tas ir modulis. Lai to izmantotu, ir jāielādē tā bibliotēka konfigurācijā, jāpārstartē PostgreSQL, jāinstalē modulis (vienā komandā) un tad mums parādÄ«sies jauns skatÄ«jums.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

Vidējais pieprasījuma laiks milisekundēs
$ select (sum(total_time) / sum(calls))::numeric(6,3)
from pg_stat_statements;

Visaktīvākie rakstīŔanas pieprasījumi (shared_buffers)
$ select query, shared_blks_dirtied
from pg_stat_statements
where shared_blks_dirtied > 0 order by 2 desc;

Ko mēs varam no turienes ņemt? Ja runājam par vienkārŔām lietām, mēs varam ņemt vidējo pieprasÄ«juma izpildes laiku. Ja laiks pieaug, tas nozÄ«mē, ka PostgreSQL atbild lēni, un mums jāveic kādi pasākumi.

Mēs varam aplÅ«kot visaktÄ«vākās rakstīŔanas transakcijas datu bāzē, kas maina datus shared buffers. AplÅ«kot, kas mums tur atjaunina vai dzēŔ datus.

Un mēs varam vienkārÅ”i aplÅ«kot dažādu statistiku par Å”iem pieprasÄ«jumiem.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

https://github.com/dataegret/pg-utils/blob/master/sql/global_reports/query_stat_total.sql

Mēs pg_stat_statements izmantojam ziņojumu veidoÅ”anai. Reizi dienā atiestatām statistiku. Uzkrājam to. Pirms nākamās statistikas atiestatīŔanas veidojam ziņojumu. Å eit ir saite uz ziņojumu. JÅ«s to varat apskatÄ«t.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

Ko mēs darām? Mēs saskaitām kopējo statistiku par visiem pieprasÄ«jumiem. Pēc tam katram pieprasÄ«jumam mēs aprēķinām tā individuālo ieguldÄ«jumu Å”ajā kopējā statistikā.

Un ko mēs varam aplÅ«kot? Mēs varam aplÅ«kot kopējo visu konkrēta veida pieprasÄ«jumu izpildes laiku pret visiem pārējiem pieprasÄ«jumiem. Mēs varam aplÅ«kot procesora un ievades-izejas resursu izmantoÅ”anu attiecÄ«bā pret kopējo ainu. Un pēc tam optimizēt Å”os pieprasÄ«jumus. Mēs veidojam TOP pieprasÄ«jumus pēc Ŕī ziņojuma un jau saņemam ierosinājumu tam, kas jāoptimizē.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

Ko mums ir atliek no kadra? Ir palikuÅ”as vēl dažas prezentācijas, kuras es neapskatÄ«ju, jo laiks ir ierobežots.

Ir pgstattuple – tas ir arÄ« papildu modulis no standarta pakas contribs. Tas ļauj novērtēt bloat tabulas, t.s. tabulu fragmentāciju. Un, ja fragmentācija ir liela, to nepiecieÅ”ams novērst, izmantojot dažādus rÄ«kus. Un funkcija pgstattuple strādā ilgstoÅ”i. Un, jo vairāk ir tabulu, jo ilgāk tā strādās.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

Nākamais contrib – tas ir pg_buffercache. Tas ļauj veikt pārbaudi shared buffers: cik intensÄ«vi un uz kurām tabulām tiek izmantotas buferu lapas. Un vienkārÅ”i ļauj ieskatÄ«ties shared buffers un novērtēt, kas tur notiek.

Nākamais modulis – tas ir pgfincore. Tas ļauj veikt zema lÄ«meņa operācijas ar tabulām, izmantojot sistēmas izsaukumu mincore(), t.i., tas ļauj ielādēt tabulu shared buffers, vai to izsist. Un, starp citu, ļauj veikt operāciju sistēmas lapu keÅ”atmiņas pārbaudi, t.i., kādā apjomā mÅ«su tabula aizņem page cache, shared buffers un vienkārÅ”i ļauj novērtēt tabulas noslogojumu.

Nākamais modulis – pg_stat_kcache. Tas arÄ« izmanto sistēmas izsaukumu getrusage(). Un veic to pirms un pēc vaicājuma izpildes. Un iegÅ«tajā statistikā ļauj novērtēt, cik daudz mÅ«su vaicājums ir tērējis uz diska I/O veikÅ”anu, t.i., operācijām ar failu sistēmu, un skatās, kā tiek izmantots procesors. Tomēr modulis ir jauns (khem-khem) un tā darbÄ«bai nepiecieÅ”ams PostgreSQL 9.4 un pg_stat_statements, par ko es runāju iepriekÅ”.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

  • Spēja izmantot statistiku – ir noderÄ«ga. Jums nav nepiecieÅ”amas treÅ”o puÅ”u programmas. JÅ«s varat pats ieskatÄ«ties, apskatÄ«t, kaut ko izdarÄ«t, veikt.

  • Izmantot statistiku nav grÅ«ti, tas ir parasts SQL. JÅ«s esat savākuÅ”i vaicājumu, sastādÄ«juÅ”i, nosÅ«tÄ«juÅ”i, apskatÄ«juÅ”i.

  • Statistika palÄ«dz atbildēt uz jautājumiem. Ja jums rodas jautājumi, jÅ«s vērÅ”aties pie statistikas – skatāties, izdarāt secinājumus, analizējat rezultātus.

  • Un eksperimentējiet. Ir daudz vaicājumu, daudz datu. Vienmēr var optimizēt kādu jau esoÅ”u vaicājumu. Var izveidot savu versiju vaicājuma, kas jums ir piemērotāka nekā oriÄ£ināls, un izmantot to.

Dziļa izpēte PostgreSQL iekŔējās statistikas. Aleksejs Lesovskis

Saites

DroÅ”as saites, kas tika minētas rakstā, kurā bija materiāli, kas tika izmantoti ziņojumā.

Autors raksta vēl
https://dataegret.com/news-blog (eng)

Statistikas kolektors
https://www.postgresql.org/docs/current/monitoring-stats.html

Sistēmas administrēŔanas funkcijas
https://www.postgresql.org/docs/current/functions-admin.html

Contrib moduļi
https://www.postgresql.org/docs/current/pgstatstatements.html
https://www.postgresql.org/docs/current/pgstattuple.html
https://www.postgresql.org/docs/current/pgbuffercache.html
https://github.com/klando/pgfincore
https://github.com/dalibo/pg_stat_kcache

SQL rīki un SQL koda piemēri
https://github.com/dataegret/pg-utils

Paldies visiem par uzmanību!

Avots: habr.com

Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem šŸ”„ Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem | ProHoster