Alekseja Ä»esovska 2015. gada ziÅojuma "Deep dive into PostgreSQL iekÅ”ÄjÄ statistika" atÅ”ifrÄjums
ZiÅojuma autora atruna: Es atzÄ«mÄju, ka Å”is ziÅojums ir datÄts ar 2015. gada novembri - ir pagÄjuÅ”i vairÄk nekÄ 4 gadi un pagÄjis daudz laika. PÄrskatÄ aplÅ«kotÄ versija 9.4 vairs netiek atbalstÄ«ta. PÄdÄjo 4 gadu laikÄ ir izdoti 5 jauni izdevumi, kuros ir daudz jauninÄjumu, uzlabojumu un izmaiÅu attiecÄ«bÄ uz statistiku, un daļa no materiÄliem ir novecojuÅ”i un nav aktuÄli. PÄrskatot, es centos atzÄ«mÄt Ŕīs vietas, lai nemaldinÄtu lasÄ«tÄju. Es nepÄrrakstÄ«ju Å”os fragmentus, to ir daudz un rezultÄts bÅ«s pavisam cits ziÅojums.
PostgreSQL DBVS ir milzÄ«gs mehÄnisms, un Å”is mehÄnisms sastÄv no daudzÄm apakÅ”sistÄmÄm, kuru koordinÄta darbÄ«ba tieÅ”i ietekmÄ DBVS veiktspÄju. DarbÄ«bas laikÄ tiek apkopota statistika un informÄcija par komponentu darbÄ«bu, kas ļauj novÄrtÄt PostgreSQL efektivitÄti un veikt pasÄkumus veiktspÄjas uzlaboÅ”anai. TomÄr Ŕīs informÄcijas ir daudz, un tÄ ir sniegta diezgan vienkÄrÅ”otÄ veidÄ. Å Ä«s informÄcijas apstrÄde un interpretÄcija dažreiz ir pilnÄ«gi nenozÄ«mÄ«gs uzdevums, un rÄ«ku un utilÄ«tu āzoodÄrzsā var viegli sajaukt pat progresÄ«vu DBA.
Labdien Mani sauc Aleksejs. KÄ teica Iļja, es runÄÅ”u par PostgreSQL statistiku.
PostgreSQL aktivitÄÅ”u statistika. PostgreSQL ir divi statistikas dati. DarbÄ«bas statistika, kas tiks apspriesta. Un plÄnotÄja statistika par datu sadali. Es runÄÅ”u konkrÄti par PostgreSQL aktivitÄÅ”u statistiku, kas ļauj spriest par veiktspÄju un kaut kÄ to uzlabot.
Es jums pastÄstÄ«Å”u, kÄ efektÄ«vi izmantot statistiku, lai atrisinÄtu dažÄdas problÄmas, kas jums ir vai varÄtu bÅ«t.
Kas nebÅ«s atskaitÄ? PÄrskatÄ es neskarÅ”u plÄnotÄja statistiku, jo... Å Ä« ir atseviŔķa tÄma atseviŔķam ziÅojumam par to, kÄ dati tiek glabÄti datu bÄzÄ un kÄ vaicÄjumu plÄnotÄjs gÅ«st priekÅ”statu par Å”o datu kvalitatÄ«vajÄm un kvantitatÄ«vajÄm Ä«paŔībÄm.
Un nebÅ«s instrumentu apskatu, nesalÄ«dzinÄÅ”u vienu produktu ar citu. ReklÄmas nebÅ«s. Liksim to malÄ.
Es vÄlos jums parÄdÄ«t, ka statistikas izmantoÅ”ana ir noderÄ«ga. Tas ir nepiecieÅ”ams. Tas ir droÅ”i lietojams. Viss, kas mums nepiecieÅ”ams, ir regulÄra SQL un pamatzinÄÅ”anas par SQL.
Un parunÄsim par to, kÄdu statistiku izvÄlÄties problÄmu risinÄÅ”anai.
Ja mÄs skatÄmies uz PostgreSQL un palaižam komandu operÄtÄjsistÄmÄ, lai skatÄ«tu procesus, mÄs redzÄsim "melno kasti". MÄs redzÄsim dažus procesus, kas kaut ko dara, un pÄc nosaukuma mÄs aptuveni varam iedomÄties, ko viÅi tur dara, ko viÅi dara. Bet bÅ«tÄ«bÄ tÄ ir melnÄ kaste, mÄs nevaram ieskatÄ«ties iekÅ”Ä.
MÄs varam redzÄt CPU slodzi top
, mÄs varam aplÅ«kot dažu sistÄmas utilÄ«tu atmiÅas izmantoÅ”anu, taÄu mÄs nevarÄsim ieskatÄ«ties PostgreSQL. Å im nolÅ«kam mums ir nepiecieÅ”ami citi rÄ«ki.
Un, turpinot tÄlÄk, pastÄstÄ«Å”u, kur tiek pavadÄ«ts laiks. Ja iedomÄjamies PostgreSQL Å”Ädas diagrammas veidÄ, tad varam atbildÄt, kur tiek pavadÄ«ts laiks. TÄs ir divas lietas: tÄ apstrÄdÄ klientu pieprasÄ«jumus no lietojumprogrammÄm un fona uzdevumi, ko PostgreSQL veic, lai turpinÄtu darboties.
Ja mÄs sÄkam skatÄ«ties augÅ”ÄjÄ kreisajÄ stÅ«rÄ«, mÄs varam redzÄt, kÄ tiek apstrÄdÄti klientu pieprasÄ«jumi. PieprasÄ«jums nÄk no lietojumprogrammas, un tiek atvÄrta klienta sesija turpmÄkam darbam. PieprasÄ«jums tiek nosÅ«tÄ«ts plÄnotÄjam. PlÄnotÄjs izveido vaicÄjumu plÄnu. NosÅ«ta to tÄlÄk izpildei. Ir sava veida bloku datu ievade/izvade, kas saistÄ«ta ar tabulÄm un indeksiem. NepiecieÅ”amie dati tiek nolasÄ«ti no diskiem atmiÅÄ Ä«paÅ”Ä apgabalÄ "koplietojamos buferos". PieprasÄ«juma rezultÄti, ja tie ir atjauninÄjumi, dzÄsumi, tiek ierakstÄ«ti darÄ«jumu žurnÄlÄ WAL. Daļa statistikas informÄcijas nonÄk žurnÄlÄ vai statistikas apkopotÄjÄ. Un pieprasÄ«juma rezultÄts tiek nosÅ«tÄ«ts atpakaļ klientam. PÄc tam klients var atkÄrtot visu vÄlreiz ar jaunu pieprasÄ«jumu.
KÄ ar fona uzdevumiem un fona procesiem? Mums ir vairÄki procesi, kas nodroÅ”ina datu bÄzes darbÄ«bu normÄlÄ darbÄ«bas režīmÄ. Å ie procesi tiks skarti arÄ« pÄrskatÄ: autovakuums, kontrolpunkts, ar replikÄciju saistÄ«ti procesi, fona rakstÄ«tÄjs. Es pieskarÅ”os katram no tiem, ziÅojot.
KÄdas problÄmas ir ar statistiku?
- InformÄcijas ir ļoti daudz. PostgreSQL 9.4 nodroÅ”ina 109 metriku statistikas datu skatÄ«Å”anai. TaÄu, ja datu bÄzÄ glabÄjas daudzas tabulas, shÄmas, datu bÄzes, tad visi Å”ie rÄdÄ«tÄji bÅ«s jÄreizina ar atbilstoÅ”o tabulu, datu bÄzu skaitu. Tas ir, ir vÄl vairÄk informÄcijas. Un tajÄ ir ļoti viegli noslÄ«kt.
- NÄkamÄ problÄma ir tÄ, ka statistiku attÄlo skaitÄ«tÄji. Ja mÄs skatÄmies uz Å”o statistiku, mÄs redzÄsim pastÄvÄ«gi pieaugoÅ”us skaitÄ«tÄjus. Un, ja kopÅ” statistikas atiestatÄ«Å”anas ir pagÄjis daudz laika, mÄs redzÄsim vÄrtÄ«bas miljardos. Un viÅi mums neko nestÄsta.
- Nav stÄsta. Ja jums bija kÄda neveiksme, kaut kas nokrita pirms 15ā30 minÅ«tÄm, jÅ«s nevarÄsit izmantot statistiku un redzÄt, kas notika pirms 15ā30 minÅ«tÄm. TÄ ir problÄma.
- PostgreSQL iebÅ«vÄta rÄ«ka trÅ«kums ir problÄma. Kodola izstrÄdÄtÄji nesniedz nekÄdu utilÄ«tu. ViÅiem nekÄ tÄda nav. ViÅi vienkÄrÅ”i sniedz statistiku datu bÄzÄ. Izmantojiet to, pieprasiet to, dariet visu, ko vÄlaties.
- TÄ kÄ PostgreSQL nav iebÅ«vÄts rÄ«ks, tas rada vÄl vienu problÄmu. Daudz treÅ”o puÅ”u rÄ«ku. Katrs uzÅÄmums, kuram ir vairÄk vai mazÄk tieÅ”as rokas, cenÅ”as uzrakstÄ«t savu programmu. TÄ rezultÄtÄ kopienai ir daudz rÄ«ku, ko var izmantot, lai strÄdÄtu ar statistiku. Un dažiem rÄ«kiem ir noteiktas iespÄjas, citiem rÄ«kiem nav citu iespÄju, vai arÄ« ir dažas jaunas iespÄjas. Un rodas situÄcija, ka jums ir jÄizmanto divi, trÄ«s vai Äetri rÄ«ki, kas pÄrklÄjas viens ar otru un kuriem ir dažÄdas funkcijas. Tas ir ļoti nepatÄ«kami.
Kas no tÄ izriet? Ir svarÄ«gi, lai bÅ«tu iespÄja tieÅ”i Åemt statistiku, lai nebÅ«tu atkarÄ«gs no programmÄm vai kaut kÄ pats uzlabotu Ŕīs programmas: pievienojiet dažas funkcijas, lai gÅ«tu labumu.
Un jums ir nepiecieÅ”amas pamatzinÄÅ”anas par SQL. Lai iegÅ«tu dažus datus no statistikas, jums ir jÄizveido SQL vaicÄjumi, t.i., jums jÄzina, kÄ tiek apkopoti atlase un pievienoÅ”anÄs.
Statistika mums stÄsta vairÄkas lietas. Tos var iedalÄ«t kategorijÄs.
- PirmÄ kategorija ir notikumi, kas notiek datu bÄzÄ. Tas ir tad, kad datu bÄzÄ notiek kÄds notikums: pieprasÄ«jums, piekļuve tabulai, autovakuums, apÅemÅ”anÄs, tad tie visi ir notikumi. SkaitÄ«tÄji, kas atbilst Å”iem notikumiem, tiek palielinÄti. Un mÄs varam izsekot Å”iem notikumiem.
- OtrÄ kategorija ir objektu, piemÄram, tabulu un datu bÄzu, Ä«paŔības. ViÅiem ir Ä«paŔības. Tas ir tabulu izmÄrs. MÄs varam izsekot tabulu pieaugumam un indeksu pieaugumam. MÄs varam redzÄt izmaiÅas dinamikÄ.
- Un treÅ”Ä kategorija ir pasÄkumÄ pavadÄ«tais laiks. PieprasÄ«jums ir notikums. Tam ir savs Ä«paÅ”ais ilguma mÄrs. SÄkÄs Å”eit, beidzÄs Å”eit. MÄs varam izsekot. Laiks, kas nepiecieÅ”ams bloka nolasÄ«Å”anai no diska vai rakstÄ«Å”anai. TÄdas lietas arÄ« tiek izsekotas.
Statistikas avoti ir parÄdÄ«ti Å”Ädi:
- KoplietojamÄ atmiÅÄ (koplietojamÄ buferÄ«) ir segments statisku datu glabÄÅ”anai, ir arÄ« tie skaitÄ«tÄji, kas pastÄvÄ«gi tiek palielinÄti, kad notiek noteikti notikumi vai rodas kÄdi momenti datu bÄzes darbÄ«bÄ.
- Visi Å”ie skaitÄ«tÄji nav pieejami lietotÄjam un pat nav pieejami administratoram. TÄs ir zema lÄ«meÅa lietas. Lai tiem piekļūtu, PostgreSQL nodroÅ”ina saskarni SQL funkciju veidÄ. MÄs varam veikt atlasÄ«tus metienus, izmantojot Ŕīs funkcijas, un iegÅ«t sava veida metriku (vai metrikas kopu).
- TomÄr Å”o funkciju izmantoÅ”ana ne vienmÄr ir Ärta, tÄpÄc funkcijas ir skatu (SKATÄ«jumu) pamatÄ. TÄs ir virtuÄlÄs tabulas, kas nodroÅ”ina statistiku par konkrÄtu apakÅ”sistÄmu vai noteiktu notikumu kopu datubÄzÄ.
- Å ie iegultie skati (SKATI) ir galvenÄ lietotÄja saskarne darbam ar statistiku. Tie ir pieejami pÄc noklusÄjuma bez papildu iestatÄ«jumiem, jÅ«s varat tos nekavÄjoties izmantot, apskatÄ«t un Åemt no tiem informÄciju. Un tad ir devumi. IeguldÄ«jumi ir oficiÄli. Var instalÄt postgresql-contrib pakotni (piemÄram, postgresql94-contrib), ielÄdÄt vajadzÄ«go moduli konfigurÄcijÄ, norÄdÄ«t tam parametrus, restartÄt PostgreSQL un var to izmantot. (PiezÄ«me. AtkarÄ«bÄ no izplatÄ«Å”anas jaunÄkajÄs versijÄs contrib pakotne ir daļa no galvenÄs pakotnes).
- Un ir arÄ« neoficiÄli ieguldÄ«jumi. Tie nav iekļauti standarta PostgreSQL izplatÄ«Å”anÄ. Tie ir jÄapkopo vai jÄinstalÄ kÄ bibliotÄka. IespÄjas var bÅ«t ļoti dažÄdas, atkarÄ«bÄ no tÄ, ko izdomÄjis Ŕī neoficiÄlÄ ieguldÄ«juma izstrÄdÄtÄjs.
Å ajÄ slaidÄ ir parÄdÄ«ti visi SKATI un dažas funkcijas, kas ir pieejamas programmÄ PostgreSQL 9.4. KÄ redzam, to ir ļoti daudz. Un ir diezgan viegli apjukt, ja ar to saskaraties pirmo reizi.
TomÄr, ja Åemam iepriekÅ”Äjo attÄlu ŠŠ°Šŗ ŃŃŠ°ŃŠøŃŃŃ Š²ŃŠµŠ¼Ń Š½Š° PostgreSQL
un saderÄ«gs ar Å”o sarakstu, mÄs iegÅ«stam Å”o attÄlu. MÄs varam izmantot katru skatu (SKATUS) vai katru funkciju vienam vai otram mÄrÄ·im, lai iegÅ«tu atbilstoÅ”o statistiku, kad darbojas PostgreSQL. Un mÄs jau varam iegÅ«t kÄdu informÄciju par apakÅ”sistÄmas darbÄ«bu.
PirmÄ lieta, ko mÄs apskatÄ«sim, ir pg_stat_database
. KÄ redzam, Ŕī ir izrÄde. TajÄ ir daudz informÄcijas. VisdažÄdÄkÄ informÄcija. Un tas sniedz ļoti noderÄ«gas zinÄÅ”anas par to, kas notiek mÅ«su datubÄzÄ.
KÄdas noderÄ«gas lietas mÄs varam paÅemt no turienes? SÄksim ar visvienkÄrÅ”ÄkajÄm lietÄm.
select
sum(blks_hit)*100/sum(blks_hit+blks_read) as hit_ratio
from pg_stat_database;
PirmÄ lieta, ko mÄs varam apskatÄ«t, ir keÅ”atmiÅas trÄpÄ«jumu procentuÄlais daudzums. KeÅ”atmiÅas trÄpÄ«jumu lÄ«menis ir noderÄ«gs rÄdÄ«tÄjs. Tas ļauj novÄrtÄt, cik daudz datu tiek Åemts no koplietoto buferu keÅ”atmiÅas un cik daudz tiek nolasÄ«ts no diska.
Tas ir skaidrs jo vairÄk keÅ”atmiÅas trÄpÄ«jumu mums ir, jo labÄk. MÄs mÄra Å”o metriku procentos. Un, piemÄram, ja mÅ«su Å”o keÅ”atmiÅas trÄpÄ«jumu procentuÄlÄ daļa ir lielÄka par 90%, tad tas ir labi. Ja tas nokrÄ«tas zem 90%, tas nozÄ«mÄ, ka mums nav pietiekami daudz atmiÅas, lai saglabÄtu atmiÅÄ karsto datu galvu. Un, lai izmantotu Å”os datus, PostgreSQL ir spiests piekļūt diskam, un tas notiek lÄnÄk nekÄ tad, ja dati tiktu nolasÄ«ti no atmiÅas. Un jums ir jÄdomÄ par atmiÅas palielinÄÅ”anu: vai nu palielinÄt koplietojamo buferu skaitu, vai palielinÄt aparatÅ«ras atmiÅu (RAM).
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 var paÅemt no Ŕīs izrÄdes? JÅ«s varat redzÄt datubÄzÄ raduÅ”Äs anomÄlijas. Kas Å”eit ir parÄdÄ«ts? PastÄv apÅemÅ”anÄs, atcelÅ”ana, pagaidu failu izveide, to lielums, strupceļi un konflikti.
MÄs varam izmantot Å”o pieprasÄ«jumu. Å Ä« SQL ir diezgan vienkÄrÅ”a. Un mÄs varam apskatÄ«t Å”os datus Å”eit.
Un Å”eit ir sliekÅ”Åa vÄrtÄ«bas. MÄs aplÅ«kojam saistÄ«bu un atcelÅ”anas attiecÄ«bu. SaistÄ«bas ir veiksmÄ«gs darÄ«juma apstiprinÄjums. AtcelÅ”ana ir atcelÅ”ana, t.i., darÄ«jums veica kÄdu darbu, noslogoja datu bÄzi, kaut ko aprÄÄ·inÄja, un tad notika kļūme un darÄ«juma rezultÄti tiek atmesti. Tas ir atcelÅ”anu skaits pastÄvÄ«gi pieaug, ir slikti. Un jums vajadzÄtu kaut kÄ izvairÄ«ties no tiem un rediÄ£Ät kodu, lai tas nenotiktu.
Konflikti ir saistÄ«ti ar replikÄciju. Un arÄ« no tiem vajadzÄtu izvairÄ«ties. Ja jums ir daži vaicÄjumi, kas tiek izpildÄ«ti replikÄ un rodas konflikti, jums ir jÄatrisina Å”ie konflikti un jÄredz, kas notiek. SÄ«kÄka informÄcija atrodama žurnÄlos. Un novÄrsiet konfliktsituÄcijas, lai lietojumprogrammu pieprasÄ«jumi darbotos bez kļūdÄm.
ArÄ« strupceļi ir slikta situÄcija. Kad pieprasÄ«jumi cÄ«nÄs par resursiem, viens pieprasÄ«jums piekļuva vienam resursam un paÅÄma bloÄ·ÄÅ”anu, otrs pieprasÄ«jums piekļuva otrajam resursam un arÄ« bloÄ·Äja, un pÄc tam abi pieprasÄ«jumi piekļuva viens otra resursiem un tika bloÄ·Äti, gaidot, kamÄr kaimiÅÅ” atbrÄ«vos slÄdzeni. ArÄ« Ŕī ir problemÄtiska situÄcija. Tie ir jÄrisina lietojumprogrammu pÄrrakstÄ«Å”anas un piekļuves resursiem seriÄlizÄcijas lÄ«menÄ«. Un, ja redzat, ka jÅ«su strupceļi nepÄrtraukti palielinÄs, jums ir jÄaplÅ«ko žurnÄlos esoÅ”Äs detaļas, jÄanalizÄ raduÅ”Äs situÄcijas un jÄnoskaidro, kÄda ir problÄma.
ArÄ« pagaidu faili (temp_files) ir slikti. Ja lietotÄja pieprasÄ«jumam nav pietiekami daudz atmiÅas, lai ievietotu operatÄ«vos, pagaidu datus, tas diskÄ izveido failu. Un visas darbÄ«bas, ko tas varÄtu veikt pagaidu buferÄ« atmiÅÄ, sÄk veikt diskÄ. Tas ir lÄns. Tas palielina vaicÄjuma izpildes laiku. Un klients, kurÅ” nosÅ«tÄ«ja pieprasÄ«jumu PostgreSQL, saÅems atbildi nedaudz vÄlÄk. Ja visas Ŕīs darbÄ«bas tiek veiktas atmiÅÄ, Postgres reaÄ£Äs daudz ÄtrÄk un klients gaidÄ«s mazÄk.
Pg_stat_bgwriter ā Å”is skats apraksta divu PostgreSQL fona apakÅ”sistÄmu darbÄ«bu: Å”is checkpointer
Šø background writer
.
Vispirms apskatÄ«sim kontrolpunktus, tÄ sauktos. checkpoints
. Kas ir kontroles punkti? Kontrolpunkts ir pozÄ«cija darÄ«jumu žurnÄlÄ, kas norÄda, ka visas žurnÄlÄ ierakstÄ«tÄs datu izmaiÅas ir veiksmÄ«gi sinhronizÄtas ar diskÄ esoÅ”ajiem datiem. Process, atkarÄ«bÄ no darba slodzes un iestatÄ«jumiem, var bÅ«t ilgstoÅ”s un galvenokÄrt sastÄv no netÄ«ro lapu sinhronizÄÅ”anas koplietotajos buferos ar datu failiem diskÄ. Kam tas paredzÄts? Ja PostgreSQL nepÄrtraukti piekļūtu diskam un ienestu no turienes datus un rakstÄ«tu datus par katru piekļuvi, tas bÅ«tu lÄns. TÄpÄc PostgreSQL ir atmiÅas segments, kura lielums ir atkarÄ«gs no konfigurÄcijas iestatÄ«jumiem. Postgres saglabÄ reÄllaika datus Å”ajÄ atmiÅÄ vÄlÄkai apstrÄdei vai vaicÄjumam. Datu maiÅas pieprasÄ«jumu gadÄ«jumÄ tie tiek mainÄ«ti. Un mÄs iegÅ«stam divas datu versijas. Viens ir mÅ«su atmiÅÄ, otrs ir diskÄ. Un periodiski jums Å”ie dati ir jÄsinhronizÄ. Tas, kas ir mainÄ«ts atmiÅÄ, ir jÄsinhronizÄ ar disku. Å im nolÅ«kam ir nepiecieÅ”ami kontrolpunkti.
Kontrolpunkts iet cauri koplietotajiem buferiem, atzÄ«mÄ netÄ«rÄs lapas, ka tÄs ir vajadzÄ«gas kontrolpunktam. PÄc tam tas palaiž otru pÄreju caur koplietotajiem buferiem. Un lapas, kas ir atzÄ«mÄtas kontrolpunktam, tÄs jau sinhronizÄ. TÄdÄ veidÄ dati tiek sinhronizÄti ar disku.
Ir divu veidu kontrolpunkti. Viens kontrolpunkts tiek izpildÄ«ts ar taimautu. Å is kontrolpunkts ir noderÄ«gs un labs ā checkpoint_timed
. Un pÄc pieprasÄ«juma ir kontrolpunkti - checkpoint required
. Å is kontrolpunkts rodas, ja mums ir ļoti liels datu ieraksts. MÄs ierakstÄ«jÄm daudz darÄ«jumu žurnÄlu. Un PostgreSQL uzskata, ka tas viss ir jÄsinhronizÄ pÄc iespÄjas ÄtrÄk, jÄveic kontrolpunkts un jÄturpina.
Un ja paskatītos statistiku pg_stat_bgwriter
un ieraudzÄ«ju, kas tev ir checkpoint_req ir daudz lielÄks par checkpoint_timed, tad tas ir slikti. KÄpÄc slikti? Tas nozÄ«mÄ, ka PostgreSQL ir pakļauts pastÄvÄ«gam stresam, kad tai ir nepiecieÅ”ams ierakstÄ«t datus diskÄ. Taimauta kontrolpunkts rada mazÄku stresu un tiek veikts saskaÅÄ ar iekÅ”Äjo grafiku un it kÄ tiek sadalÄ«ts laika gaitÄ. PostgreSQL ir iespÄja apturÄt darbu un nenoslogot diska apakÅ”sistÄmu. Tas ir noderÄ«gi PostgreSQL. Un vaicÄjumi, kas tiek izpildÄ«ti kontrolpunkta laikÄ, neradÄ«s stresu, jo diska apakÅ”sistÄma ir aizÅemta.
Un, lai pielÄgotu kontrolpunktu, ir trÄ«s parametri:
-
Ńheckpoint_segments
. -
Ńheckpoint_timeout
. -
Ńheckpoint_competion_target
.
Tie ļauj regulÄt kontroles punktu darbÄ«bu. Bet es pie tiem nekavÄÅ”os. To ietekme ir atseviŔķa tÄma.
BrÄ«dinÄjums: ZiÅojumÄ aplÅ«kotÄ versija 9.4 vairs nav aktuÄla. MÅ«sdienu PostgreSQL versijÄs parametrs checkpoint_segments
aizstÄts ar parametriem min_wal_size
Šø max_wal_size
.
NÄkamÄ apakÅ”sistÄma ir fona rakstÄ«tÄjs ā background writer
. Ko viÅÅ” dara? Tas pastÄvÄ«gi darbojas bezgalÄ«gÄ cilpÄ. SkenÄ lapas koplietotajos buferos un netÄ«rÄs lapas, kuras tiek atrastas, izmet diskÄ. TÄdÄjÄdi tas palÄ«dz kontrolpunktam veikt mazÄk darba kontrolpunkta izpildes laikÄ.
PriekÅ” kam vÄl tas vajadzÄ«gs? Tas nodroÅ”ina vajadzÄ«bu pÄc tukÅ”Äm lapÄm koplietotajos buferos, ja tÄs pÄkÅ”Åi ir nepiecieÅ”amas (lielos daudzumos un nekavÄjoties), lai ievietotu datus. PieÅemsim, ka radÄs situÄcija, kad pieprasÄ«juma pabeigÅ”anai bija vajadzÄ«gas tukÅ”as lapas un tÄs jau atradÄs koplietotajos buferos. PostgresÄ«vs backend
viÅÅ” tos vienkÄrÅ”i paÅem un lieto, paÅ”am nekas nav jÄtÄ«ra. Bet, ja pÄkÅ”Åi Å”Ädu lapu nav, aizmugursistÄma aptur darbu un sÄk meklÄt lapas, lai tÄs izmestu diskÄ un Åemtu tÄs savÄm vajadzÄ«bÄm, kas negatÄ«vi ietekmÄ paÅ”laik izpildÄmÄ pieprasÄ«juma laiku. Ja redzat, ka jums ir parametrs maxwritten_clean
liels, tas nozÄ«mÄ, ka fona rakstÄ«tÄjs nedara savu darbu un jums ir jÄpalielina parametri bgwriter_lru_maxpages
, lai viÅÅ” vienÄ ciklÄ varÄtu paveikt vairÄk darbu, notÄ«rÄ«t vairÄk lapu.
Un vÄl viens ļoti noderÄ«gs rÄdÄ«tÄjs ir buffers_backend_fsync
. AizmugursistÄmas neveic fsync, jo tas ir lÄns. ViÅi iztur fsync augÅ”up IO steka kontrolpunktÄ. Kontrolpunktam ir sava rinda, tas periodiski apstrÄdÄ fsync un sinhronizÄ atmiÅas lapas ar failiem diskÄ. Ja rinda pie kontrolpunkta ir liela un pilna, tad aizmugursistÄma ir spiesta pati veikt fsync un tas palÄnina aizmugursistÄmas darbu, t.i., klients saÅems atbildi vÄlÄk, nekÄ varÄtu. Ja redzat, ka jÅ«su vÄrtÄ«ba ir lielÄka par nulli, tad tÄ jau ir problÄma un jums jÄpievÄrÅ” uzmanÄ«ba fona rakstÄ«Å”anas iestatÄ«jumiem un arÄ« jÄnovÄrtÄ diska apakÅ”sistÄmas veiktspÄja.
BrÄ«dinÄjums: _Å ajÄ tekstÄ ir aprakstÄ«ti ar replikÄciju saistÄ«tie statistikas skati. LielÄkÄ daļa skatu un funkciju nosaukumu tika pÄrdÄvÄti programmÄ Postgres 10. PÄrdÄvÄÅ”anas bÅ«tÄ«ba bija aizstÄt xlog
par wal
Šø location
par lsn
funkciju/skatu nosaukumos utt. KonkrÄts piemÄrs, funkcija pg_xlog_location_diff()
tika pÄrdÄvÄta par pg_wal_lsn_diff()
._
Mums arÄ« Å”eit ir daudz lietu. Bet mums ir vajadzÄ«gas tikai preces, kas saistÄ«tas ar atraÅ”anÄs vietu.
Ja mÄs redzam, ka visas vÄrtÄ«bas ir vienÄdas, tad tas ir ideÄls variants, un kopija neatpaliek no meistara.
Å Ä« heksadecimÄlÄ pozÄ«cija Å”eit ir pozÄ«cija darÄ«jumu žurnÄlÄ. Tas pastÄvÄ«gi palielinÄs, ja datu bÄzÄ ir kÄdas darbÄ«bas: ievieto, dzÄÅ” utt.
ŃŠŗŠ¾Š»ŃŠŗŠ¾ Š·Š°ŠæŠøŃŠ°Š½Š¾ xlog Š² Š±Š°Š¹ŃŠ°Ń
$ select
pg_xlog_location_diff(pg_current_xlog_location(),'0/00000000');
Š»Š°Š³ ŃŠµŠæŠ»ŠøŠŗŠ°ŃŠøŠø Š² Š±Š°Š¹ŃŠ°Ń
$ select
client_addr,
pg_xlog_location_diff(pg_current_xlog_location(), replay_location)
from pg_stat_replication;
Š»Š°Š³ ŃŠµŠæŠ»ŠøŠŗŠ°ŃŠøŠø Š² ŃŠµŠŗŃŠ½Š“Š°Ń
$ select
extract(epoch from now() - pg_last_xact_replay_timestamp());
Ja Ŕīs lietas atŔķiras, tad ir kaut kÄda nobÄ«de. Lag ir nobÄ«de starp repliku un galveno, t.i., dati atŔķiras starp serveriem.
Ir trÄ«s kavÄÅ”anÄs iemesli:
- Å Ä« diska apakÅ”sistÄma nevar tikt galÄ ar ieraksta failu sinhronizÄciju.
- TÄs ir iespÄjamas tÄ«kla kļūdas vai tÄ«kla pÄrslodze, kad datiem nav laika sasniegt repliku un tÄ nevar to reproducÄt.
- Un procesors. Procesors ir ļoti rets gadÄ«jums. Un es to redzÄju divas vai trÄ«s reizes, bet tas var arÄ« notikt.
Un Å”eit ir trÄ«s vaicÄjumi, kas ļauj mums izmantot statistiku. MÄs varam novÄrtÄt, cik daudz esam ierakstÄ«juÅ”i darÄ«jumu žurnÄlÄ. Ir tÄda funkcija pg_xlog_location_diff
un mÄs varam novÄrtÄt replikÄcijas nobÄ«di baitos un sekundÄs. Å im nolÅ«kam mÄs izmantojam arÄ« vÄrtÄ«bu no Ŕī skata (SKATÄŖJUMI).
PiezÄ«me: _Pg_xlog_location vietÄFunkcija diff() var izmantot atÅemÅ”anas operatoru un atÅemt vienu vietu no citas. Ärti.
Ir viens punkts ar nobÄ«di, kas ir sekundÄs. Ja galvenajÄ datorÄ nav aktivitÄÅ”u, darÄ«jums notika apmÄram pirms 15 minÅ«tÄm un darbÄ«bas nav, un, ja mÄs skatÄmies uz Å”o replikas aizkavi, mÄs redzÄsim 15 minÅ«Å”u aizkavi. To ir vÄrts atcerÄties. Un tas var bÅ«t mulsinoÅ”i, kad skatÄties Å”o nobÄ«di.
Pg_stat_all_tables ir vÄl viens noderÄ«gs skats. Tas parÄda statistiku tabulÄs. Kad mums datu bÄzÄ ir tabulas, ar to notiek kÄda darbÄ«ba, kÄdas darbÄ«bas, mÄs varam iegÅ«t Å”o informÄciju no Ŕī skata.
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;
PirmÄ lieta, ko mÄs varam apskatÄ«t, ir secÄ«gi skenÄjumi visÄ tabulÄ. Pats skaitlis pÄc Ŕīm piespÄlÄm ne vienmÄr ir slikts un nav rÄdÄ«tÄjs, ka mums kaut kas jÄdara.
TomÄr ir otrs rÄdÄ«tÄjs - seq_tup_read. Å is ir no secÄ«gÄs skenÄÅ”anas atgriezto rindu skaits. Ja vidÄjais skaitlis pÄrsniedz 1, 000 10, 000 50, 000 100, tad tas jau ir rÄdÄ«tÄjs, ka varbÅ«t kaut kur jÄveido indekss, lai vaicÄjumi bÅ«tu balstÄ«ti uz indeksu, vai arÄ« ir iespÄjams optimizÄt vaicÄjumus, kas izmanto Å”Ädu secÄ«gu skenÄÅ”anu, lai ka tas nenotiek, bija.
VienkÄrÅ”s piemÄrs ā teiksim pieprasÄ«jums ar lielu OFFSET un LIMIT izmaksÄm. PiemÄram, tiek skenÄtas 100 000 tabulas rindas un pÄc tam tiek Åemtas 50 000 vajadzÄ«gÄs rindas, un iepriekÅ”ÄjÄs skenÄtÄs rindas tiek izmestas. ArÄ« Å”is ir slikts gadÄ«jums. Un Å”Ädi vaicÄjumi ir jÄoptimizÄ. Un Å”eit ir vienkÄrÅ”s SQL vaicÄjums, kurÄ varat to apskatÄ«t un novÄrtÄt iegÅ«tos skaitļus.
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;
Izmantojot Å”o tabulu un izmantojot papildu funkcijas, var iegÅ«t arÄ« tabulu izmÄrus pg_total_relation_size()
, pg_relation_size()
.
KopumÄ ir metakomandas dt
Šø di
, ko var izmantot PSQL, kÄ arÄ« skatÄ«t tabulu un indeksu izmÄrus.
TomÄr funkciju izmantoÅ”ana palÄ«dz mums apskatÄ«t tabulu izmÄrus, pat Åemot vÄrÄ indeksus vai neÅemot vÄrÄ indeksus, un jau veikt dažus aprÄÄ·inus, pamatojoties uz datu bÄzes pieaugumu, t.i., kÄ tÄ aug, ar kÄdu intensitÄti un izdarÄ«t dažus secinÄjumus par izmÄru optimizÄciju.
DarbÄ«bas ierakstÄ«Å”ana. Kas ir ieraksts? ApskatÄ«sim operÄciju UPDATE
ā tabulas rindu atjauninÄÅ”anas darbÄ«ba. Faktiski atjauninÄÅ”ana ir divas darbÄ«bas (vai pat vairÄk). Tas nozÄ«mÄ jaunas rindas versijas ievietoÅ”anu un rindas vecÄs versijas atzÄ«mÄÅ”anu kÄ novecojuÅ”u. PÄc tam autovakuums ieradÄ«sies un iztÄ«rÄ«s Ŕīs novecojuÅ”Äs lÄ«niju versijas, atzÄ«mÄjot Å”o vietu kÄ pieejamu atkÄrtotai izmantoÅ”anai.
TurklÄt atjauninÄÅ”ana nav tikai tabulas atjauninÄÅ”ana. Å is ir arÄ« indeksa atjauninÄjums. Ja tabulÄ ir daudz indeksu, tad atjauninÄÅ”anas laikÄ bÅ«s jÄatjaunina arÄ« visi indeksi, kas ietver vaicÄjumÄ atjauninÄtos laukus. Å iem indeksiem bÅ«s arÄ« novecojuÅ”as rindu versijas, kuras bÅ«s jÄiztÄ«ra.
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 tÄ jaunÄ dizaina dÄļ UPDATE ir smagsvara operÄcija. Bet tos var padarÄ«t vienkÄrÅ”Äkus. Äst hot updates
. Tie parÄdÄ«jÄs PostgreSQL versijÄ 8.3. Un kas tas ir? Å is ir viegls atjauninÄjums, kas neizraisa indeksu pÄrbÅ«vi. Tas ir, mÄs atjauninÄjÄm ierakstu, bet tika atjauninÄts tikai ieraksts lapÄ (kas pieder tabulai), un indeksi joprojÄm norÄda uz to paÅ”u ierakstu lapÄ. Ir mazliet interesanta darbÄ«bas loÄ£ika: kad rodas vakuums, tas rada Ŕīs Ä·Ädes hot
pÄrbÅ«vÄ un viss turpina darboties bez indeksu atjauninÄÅ”anas, un viss notiek ar mazÄku resursu izŔķÄrdÄÅ”anu.
Un kad tu n_tup_hot_upd
liels, tad tas ir ļoti labi. Tas nozÄ«mÄ, ka dominÄ vieglie atjauninÄjumi, un tas mums ir lÄtÄks resursu ziÅÄ, un viss ir kÄrtÄ«bÄ.
ALTER TABLE table_name SET (fillfactor = 70);
KÄ palielinÄt skaļumu hot update
ov? Varam izmantot fillfactor
. Tas nosaka rezervÄtÄs brÄ«vÄs vietas lielumu, aizpildot lapu tabulÄ, izmantojot INSERT. Kad tabulai pievieno ieliktÅus, tie pilnÄ«bÄ aizpilda lapu un neatstÄj tukÅ”u vietu. PÄc tam tiek iezÄ«mÄta jauna lapa. Dati tiek aizpildÄ«ti vÄlreiz. Un Ŕī ir noklusÄjuma darbÄ«ba, aizpildÄ«Å”anas koeficients = 100%.
MÄs varam padarÄ«t aizpildÄ«Å”anas koeficientu 70%. Tas ir, ievietoÅ”anas laikÄ tika izcelta jauna lapa, bet tikai 70% lapas tika aizpildÄ«tas. Un mums ir palikuÅ”i 30% rezervÄ. Kad jums ir nepiecieÅ”ams veikt atjauninÄjumu, tas, visticamÄk, notiks tajÄ paÅ”Ä lapÄ, un jaunÄ lÄ«nijas versija ietilps tajÄ paÅ”Ä lapÄ. Un hot_update tiks darÄ«ts. Tas atvieglo rakstÄ«Å”anu uz tabulÄm.
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));
Autovakuuma rinda. Autovacuum ir apakÅ”sistÄma, par kuru PostgreSQL ir ļoti maz statistikas datu. Tikai pg_stat_activity tabulÄs varam redzÄt, cik vakuumu mums Å”obrÄ«d ir. TaÄu ir ļoti grÅ«ti saprast, cik tabulu uzreiz ir rindÄ.
PiezÄ«me: _SÄkot ar Postgres 10, situÄcija ar Vatovac izsekoÅ”anu ir ievÄrojami uzlabojusies - ir parÄdÄ«jies pg_stat_progress skatsvakuums, kas ievÄrojami vienkÄrÅ”o jautÄjumu par automaŔīnas vakuuma uzraudzÄ«bu.
MÄs varam izmantot Å”o vienkÄrÅ”oto vaicÄjumu. Un mÄs varam redzÄt, kad vakuums bÅ«s jÄveido. Bet kÄ un kad jÄsÄk vakuums? Å Ä«s ir to lÄ«niju mantotÄs versijas, par kurÄm es runÄju iepriekÅ”. Notika atjauninÄjums, tika ievietota jauna lÄ«nijas versija. Ir parÄdÄ«jusies novecojusi virknes versija. TabulÄ pg_stat_user_tables
ir tÄds parametrs n_dead_tup
. Tas parÄda "miruÅ”o" lÄ«niju skaitu. Un, tiklÄ«dz miruÅ”o rindu skaits kļūst lielÄks par noteiktu slieksni, pie galda nonÄks autovakuums.
Un kÄ Å”is slieksnis tiek aprÄÄ·inÄts? TÄ ir ļoti konkrÄta procentuÄlÄ daļa no kopÄjÄ tabulas rindu skaita. Ir parametrs autovacuum_vacuum_scale_factor
. Tas nosaka procentuÄlo daudzumu. Teiksim, 10% + ir papildu pamata slieksnis 50 rindiÅas. Un kas notiek? Kad mums ir vairÄk nedzÄ«vu rindu nekÄ ā10% + 50ā no visÄm tabulas rindÄm, tad tabulu liekam uz autovakuumu.
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 ir viens punkts. Parametru pamata sliekÅ”Åi av_base_thresh
Šø av_scale_factor
var pieŔķirt individuÄli. Un attiecÄ«gi tabulai slieksnis nebÅ«s globÄls, bet gan individuÄls. TÄpÄc, lai aprÄÄ·inÄtu, jums ir jÄizmanto triki un triki. Un, ja jÅ«s interesÄ, tad varat apskatÄ«t mÅ«su kolÄÄ£u pieredzi no Avito (slaidÄ esoÅ”Ä saite nav derÄ«ga un tekstÄ ir atjauninÄta).
ViÅi rakstÄ«ja priekÅ”
Ko mÄs varam darÄ«t lietas labÄ? Ja mums ir liela rinda un autovakuums netiek galÄ, mÄs varam palielinÄt vakuuma darbinieku skaitu vai vienkÄrÅ”i padarÄ«t vakuumu agresÄ«vÄku, lai tas iedarbinÄtu agrÄk, apstrÄdÄ tabulu mazos gabaliÅos. Un lÄ«dz ar to rinda samazinÄsies. ā Å eit galvenais ir uzraudzÄ«t disku slodzi, jo... vakuums nav bezmaksas lieta, lai gan lÄ«dz ar SSD/NVMe ierÄ«Äu parÄdÄ«Å”anos problÄma ir kļuvusi mazÄk pamanÄma.
Pg_stat_all_indexes ir indeksu statistika. ViÅa nav liela. Un mÄs to varam izmantot, lai iegÅ«tu informÄciju par indeksu izmantoÅ”anu. Un, piemÄram, mÄs varam noteikt, kuri indeksi mums ir papildus.
KÄ jau teicu, atjauninÄjums ir ne tikai tabulu, bet arÄ« indeksu atjauninÄjums. AttiecÄ«gi, ja tabulÄ ir daudz indeksu, tad, atjauninot tabulas rindas, ir jÄatjaunina arÄ« indeksÄto lauku indeksi, un ja mums ir neizmantoti indeksi, kuriem nav indeksu skenÄÅ”anas, tad tie karÄjas kÄ balasts. Un mums ir jÄatbrÄ«vojas no tiem. Å im nolÅ«kam mums ir nepiecieÅ”ams lauks idx_scan
. MÄs vienkÄrÅ”i skatÄmies uz indeksu skenÄÅ”anas skaitu. Ja indeksiem ir nulle skenÄÅ”ana salÄ«dzinoÅ”i ilgÄ statistikas glabÄÅ”anas periodÄ (vismaz 2-3 nedÄļas), tad visticamÄk tie ir slikti indeksi, mums no tiem jÄatbrÄ«vojas.
PiezÄ«me: MeklÄjot neizmantotos indeksus straumÄÅ”anas replikÄcijas klasteru gadÄ«jumÄ, ir jÄpÄrbauda visi klasteru mezgli, jo statistika nav globÄla, un, ja indekss netiek izmantots uz galvenÄ, tad to var izmantot replikÄs (ja tur ir slodze).
Divas saites:
Å ie ir sarežģītÄki vaicÄjumu piemÄri, kÄ meklÄt neizmantotos indeksus.
OtrÄ saite ir diezgan interesants pieprasÄ«jums. Tur ir ļoti netriviÄla loÄ£ika. Es iesaku to atsaucei.
Ko vÄl ir vÄrts summÄt, izmantojot indeksus?
-
Neizmantotie indeksi ir slikti.
-
Tie aizÅem vietu.
-
PalÄninÄt atjauninÄÅ”anas darbÄ«bas.
-
Papildus darbs vakuumam.
Ja mÄs noÅemsim neizmantotos indeksus, mÄs tikai uzlabosim datubÄzi.
NÄkamÄ prezentÄcija ir pg_stat_activity
. Šis ir lietderības analogs ps
, tikai PostgreSQL. Ja ps
PÄc tam apskatiet procesus operÄtÄjsistÄmÄ pg_stat_activity
Tas parÄdÄ«s darbÄ«bu PostgreSQL.
KÄdas noderÄ«gas lietas mÄs varam paÅemt no turienes?
select
count(*)*100/(select current_setting('max_connections')::int)
from pg_stat_activity;
MÄs varam redzÄt kopÄjo aktivitÄti, notiekoÅ”o datubÄzÄ. MÄs varam veikt jaunu izvietoÅ”anu. Å eit viss ir uzsprÄdzis, jaunus savienojumus nepieÅem, aplikÄcijÄ birst kļūdas.
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 vaicÄjumu un redzÄt savienojumu kopÄjo procentuÄlo daudzumu attiecÄ«bÄ pret maksimÄlo savienojuma ierobežojumu un redzÄt, kam ir visvairÄk savienojumu. Un Å”ajÄ gadÄ«jumÄ mÄs redzam Å”o lietotÄju cron_role
atvÄrti 508 savienojumi. Un tur ar viÅu kaut kas notika. Mums ar to jÄtiek galÄ un jÄskatÄs. Un tas ir pilnÄ«gi iespÄjams, ka tas ir kaut kÄds anomÄls savienojumu skaits.
Ja mums ir OLTP darba slodze, vaicÄjumiem jÄbÅ«t Ätriem, ļoti Ätriem un nevajadzÄtu bÅ«t gariem vaicÄjumiem. TaÄu, ja rodas gari vaicÄjumi, tad Ä«stermiÅÄ nav par ko uztraukties, bet IlgtermiÅÄ gari vaicÄjumi kaitÄ datu bÄzei; tie palielina tabulu uzpÅ«Å”anos, kad notiek tabulas sadrumstalotÄ«ba. JÄatbrÄ«vojas gan no uzpÅ«Å”anÄs, gan gariem vaicÄjumiem.
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;
LÅ«dzu, Åemiet vÄrÄ: ar Å”o pieprasÄ«jumu mÄs varam identificÄt garus vaicÄjumus un darÄ«jumus. MÄs izmantojam funkciju clock_timestamp()
lai noteiktu darbÄ«bas laiku. Garus vaicÄjumus, kurus atradÄm, varam atcerÄties, izpildÄ«t explain
, paskaties plÄnus un kaut kÄ optimizÄ. MÄs atvairojam paÅ”reizÄjos garos pieprasÄ«jumus un turpinÄm savu dzÄ«vi.
select * from pg_stat_activity where state in
('idle in transaction', 'idle in transaction (aborted)';
Slikti darÄ«jumi ir darÄ«jumi, kas atrodas dÄ«kstÄvÄ transakcijas laikÄ un dÄ«kstÄvÄ darÄ«juma (pÄrtrauktÄ) stÄvoklÄ«.
Ko tas nozÄ«mÄ? DarÄ«jumiem ir vairÄki stÄvokļi. Un kÄdu no Å”iem stÄvokļiem var pieÅemt jebkurÄ laikÄ. Ir lauks stÄvokļu definÄÅ”anai state
Å”ajÄ prezentÄcijÄ. Un mÄs to izmantojam, lai noteiktu stÄvokli.
select * from pg_stat_activity where state in
('idle in transaction', 'idle in transaction (aborted)';
Un, kÄ jau teicu iepriekÅ”, Å”ie divi stÄvokļi dÄ«kstÄve darÄ«jumÄ un dÄ«kstÄve darÄ«jumÄ (pÄrtraukts) ir slikti. Kas tas ir? Å ajÄ laikÄ lietojumprogramma atvÄra darÄ«jumu, veica dažas darbÄ«bas un sÄka darboties. DarÄ«jums paliek atvÄrts. Tas uzkaras, tajÄ nekas nenotiek, tas aizÅem savienojumu, bloÄ·Äjas uz mainÄ«tajÄm rindÄm un, iespÄjams, palielina citu tabulu uzpÅ«Å”anos Postrges transakciju dzinÄja arhitektÅ«ras dÄļ. Un tÄdus darÄ«jumus arÄ« vajadzÄtu noÅ”aut, jo tie vispÄr ir kaitÄ«gi, jebkurÄ gadÄ«jumÄ.
Ja redzat, ka jÅ«su datubÄzÄ ir vairÄk nekÄ 5-10-20 no tiem, tad jums ir jÄuztraucas un jÄsÄk ar tiem kaut ko darÄ«t.
Å eit mÄs izmantojam arÄ« laika aprÄÄ·inÄÅ”anai clock_timestamp()
. MÄs uzÅemam darÄ«jumus un optimizÄjam lietojumprogrammu.
KÄ jau teicu iepriekÅ”, bloÄ·ÄÅ”ana ir tad, kad divi vai vairÄki darÄ«jumi cÄ«nÄs par vienu vai resursu grupu. Å im nolÅ«kam mums ir lauks waiting
ar BÅ«la vÄrtÄ«bu true
vai false
.
Tiesa ā tas nozÄ«mÄ, ka process gaida, kaut kas ir jÄdara. Kad process gaida, tas nozÄ«mÄ, ka gaida arÄ« klients, kurÅ” uzsÄka Å”o procesu. Klients sÄž pÄrlÅ«kprogrammÄ un arÄ« gaida.
BrÄ«dinÄjums: _SÄkot no Postgres versijas 9.6 lauka waiting
noÅemts un tÄ vietÄ pievienoti vÄl divi informatÄ«vie lauki wait_event_type
Šø wait_event
._
Ko darÄ«t? Ja jÅ«s ilgu laiku redzat patiesÄ«bu, tas nozÄ«mÄ, ka jums ir jÄatbrÄ«vojas no Å”Ädiem pieprasÄ«jumiem. TÄdus darÄ«jumus mÄs vienkÄrÅ”i noÅ”aujam. MÄs rakstÄm izstrÄdÄtÄjiem, ka viÅiem kaut kÄ jÄoptimizÄ, lai nebÅ«tu sacensÄ«bu par resursiem. Un tad izstrÄdÄtÄji optimizÄ lietojumprogrammu, lai tas nenotiktu.
Un galÄjais, bet potenciÄli neletÄls gadÄ«jums ir strupceļu raÅ”anÄs. Divas transakcijas atjauninÄja divus resursus, pÄc tam tiem atkal piekļuva, Å”oreiz pretÄjiem resursiem. Å ajÄ gadÄ«jumÄ PostgreSQL nogalina paÅ”u darÄ«jumu, lai cits varÄtu turpinÄt darbu. Å Ä« ir strupceļa situÄcija, un viÅa pati to nevar izdomÄt. TÄpÄc PostgreSQL ir spiests veikt ÄrkÄrtÄjus pasÄkumus.
Un Å”eit ir divi vaicÄjumi, kas ļauj izsekot bloÄ·ÄÅ”anai. MÄs izmantojam skatu pg_locks
, kas ļauj izsekot smagÄm slÄdzenÄm.
Un pirmÄ saite ir pats pieprasÄ«juma teksts. Tas ir diezgan garÅ”.
Un otrÄ saite ir raksts par slÄdzenÄm. Ir noderÄ«gi lasÄ«t, tas ir ļoti interesanti.
TÄtad, ko mÄs redzam? MÄs redzam divus pieprasÄ«jumus. DarÄ«jums ar ALTER TABLE
ir bloÄ·ÄjoÅ”s darÄ«jums. Tas sÄkÄs, bet nepabeidza, un lietojumprogramma, kas ierakstÄ«ja Å”o darÄ«jumu, kaut kur veic citas darbÄ«bas. Un otrais pieprasÄ«jums ir atjauninÄt. ViÅÅ” gaida, lÄ«dz beigsies alter table, pirms viÅÅ” var turpinÄt darbu.
TÄdÄ veidÄ mÄs varam noskaidrot, kurÅ” kuru aizslÄdza, kuru tur, un varam tikt galÄ ar to tÄlÄk.
NÄkamais modulis ir pg_stat_statements
. KÄ jau teicu, Å”is ir modulis. Lai to izmantotu, jÄielÄdÄ tÄ bibliotÄka konfigurÄcijÄ, jÄrestartÄ PostgreSQL, jÄinstalÄ modulis (ar vienu komandu) un tad mums bÅ«s jauns skats.
CŃŠµŠ“Š½ŠµŠµ Š²ŃŠµŠ¼Ń Š·Š°ŠæŃŠ¾ŃŠ° Š² Š¼ŠøŠ»ŠøŃŠµŠŗŃŠ½Š“Š°Ń
$ select (sum(total_time) / sum(calls))::numeric(6,3)
from pg_stat_statements;
Š”Š°Š¼ŃŠµ Š°ŠŗŃŠøŠ²Š½Š¾ ŠæŠøŃŃŃŠøŠµ (Š² shared_buffers) Š·Š°ŠæŃŠ¾ŃŃ
$ select query, shared_blks_dirtied
from pg_stat_statements
where shared_blks_dirtied > 0 order by 2 desc;
Ko mÄs no turienes varam paÅemt? Ja mÄs runÄjam par vienkÄrÅ”Äm lietÄm, mÄs varam Åemt vidÄjo vaicÄjuma izpildes laiku. Laiks aug, kas nozÄ«mÄ, ka PostgreSQL reaÄ£Ä lÄni, un mums ir kaut kas jÄdara.
MÄs varam apskatÄ«t aktÄ«vÄkos ierakstÄ«Å”anas darÄ«jumus datu bÄzÄ, kas maina datus koplietotajos buferos. Skatiet, kas tur atjaunina vai dzÄÅ” datus.
Un mÄs varam vienkÄrÅ”i apskatÄ«t dažÄdu statistiku Å”iem pieprasÄ«jumiem.
MÄs pg_stat_statements
MÄs to izmantojam, lai izveidotu pÄrskatus. MÄs atiestatÄm statistiku reizi dienÄ. UzkrÄsim to. Pirms statistikas atiestatÄ«Å”anas nÄkamreiz, izveidosim pÄrskatu. Å eit ir saite uz ziÅojumu. JÅ«s varat to noskatÄ«ties.
Ko mÄs darÄm? MÄs aprÄÄ·inÄm vispÄrÄ«gu statistiku visiem pieprasÄ«jumiem. PÄc tam katram pieprasÄ«jumam mÄs uzskaitÄm tÄ individuÄlo ieguldÄ«jumu Å”ajÄ kopÄjÄ statistikÄ.
Un ko mÄs varam skatÄ«ties? MÄs varam aplÅ«kot visu noteikta veida pieprasÄ«jumu kopÄjo izpildes laiku, Åemot vÄrÄ visus citus pieprasÄ«jumus. MÄs varam aplÅ«kot CPU un I/O resursu izmantoÅ”anu attiecÄ«bÄ pret kopÄjo attÄlu. Un jau optimizÄjiet Å”os vaicÄjumus. MÄs veidojam populÄrÄkos vaicÄjumus, pamatojoties uz Å”o pÄrskatu, un jau tagad ir viela pÄrdomÄm par to, ko optimizÄt.
Ko mÄs esam atstÄjuÅ”i aizkulisÄs? VÄl ir palikuÅ”i daži iesniegumi, kurus neizskatÄ«ju, jo laiks ir ierobežots.
Ir pgstattuple
ir arÄ« papildu modulis no standarta ieguldÄ«jumu paketes. Tas ļauj novÄrtÄt bloat
galdi, ts tabulas sadrumstalotÄ«ba. Un, ja ir daudz sadrumstalotÄ«bas, jums tas ir jÄnoÅem un jÄizmanto dažÄdi rÄ«ki. Un funkcija pgstattuple
darbojas ilgu laiku. Un jo vairÄk tabulu bÅ«s, jo ilgÄk tas darbosies.
NÄkamais ieguldÄ«jums ir pg_buffercache
. Tas ļauj pÄrbaudÄ«t koplietotos buferus: cik intensÄ«vi un kÄdÄm tabulÄm tiek izmantotas bufera lapas. Un tas vienkÄrÅ”i ļauj ieskatÄ«ties koplietotajos buferos un novÄrtÄt tur notiekoÅ”o.
NÄkamais modulis ir pgfincore
. Tas ļauj veikt zema lÄ«meÅa tabulas darbÄ«bas, izmantojot sistÄmas zvanu mincore()
, t.i., tas ļauj ielÄdÄt tabulu koplietotajos buferos vai izlÄdÄt to. Un tas cita starpÄ Ä¼auj pÄrbaudÄ«t operÄtÄjsistÄmas lapas keÅ”atmiÅu, t.i., cik daudz vietas tabula aizÅem lapas keÅ”atmiÅÄ, koplietotajos buferos, un vienkÄrÅ”i ļauj novÄrtÄt tabulas darba slodzi.
NÄkamais modulis - pg_stat_kcache
. Tas izmanto arÄ« sistÄmas zvanu getrusage()
. Un tas to izpilda pirms un pÄc pieprasÄ«juma izpildes. Un iegÅ«tajÄ statistikÄ tas ļauj mums novÄrtÄt, cik daudz mÅ«su pieprasÄ«jums iztÄrÄja diska I/O, t.i., operÄcijÄm ar failu sistÄmu, un aplÅ«ko procesora lietojumu. TomÄr modulis ir jauns (klepus klepus) un tÄ darbÄ«bai ir nepiecieÅ”ama PostgreSQL 9.4 un pg_stat_statements, par kuriem es minÄju iepriekÅ”.
-
ZinÄt, kÄ izmantot statistiku, ir noderÄ«gi. Jums nav nepiecieÅ”amas treÅ”o puÅ”u programmas. JÅ«s varat ienÄkt, redzÄt, kaut ko darÄ«t, kaut ko paveikt.
-
Statistikas izmantoÅ”ana nav grÅ«ta, tÄ ir tikai parasta SQL. JÅ«s savÄcÄt pieprasÄ«jumu, apkopojÄt to, nosÅ«tÄ«jÄt, apskatÄ«jÄt.
-
Statistika palÄ«dz atbildÄt uz jautÄjumiem. Ja jums ir jautÄjumi, pievÄrsieties statistikai - skatieties, izdariet secinÄjumus, analizÄjiet rezultÄtus.
-
Un eksperimentÄt. Ir daudz pieprasÄ«jumu, daudz datu. JÅ«s vienmÄr varat optimizÄt esoÅ”u vaicÄjumu. Varat izveidot savu pieprasÄ«juma versiju, kas jums ir vairÄk piemÄrota nekÄ oriÄ£inÄls, un izmantot to.
atsauces
PiemÄrotas saites, kas tika atrastas rakstÄ, pamatojoties uz materiÄliem, bija ziÅojumÄ.
Autors raksti vairÄk
Statistikas apkopotÄjs
SistÄmas administrÄÅ”anas funkcijas
Ieguldījumu moduļi
SQL utilÄ«ti un sql kodu piemÄri
Paldies visiem par uzmanību!
Avots: www.habr.com