En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

Avkodning av Aleksey Lesovskiys föredrag frÄn 2015 "En djupdykning i PostgreSQL:s interna statistik"

Ansvarsfriskrivning frĂ„n föredragets författare: Jag vill pĂ„peka att detta föredrag dateras till november 2015 — det har gĂ„tt mer Ă€n 4 Ă„r och mycket har förĂ€ndrats. Den version som behandlas i föredraget, 9.4, stöds inte lĂ€ngre. Under de senaste 4 Ă„ren har 5 nya versioner slĂ€ppts, som har introducerat mĂ„nga nyheter, förbĂ€ttringar och förĂ€ndringar avseende statistik, varav en del material har blivit förĂ„ldrat och inte lĂ€ngre aktuellt. Under granskningen försökte jag markera dessa stĂ€llen för att inte vilseleda dig, lĂ€sare. Jag valde dock att inte skriva om dessa stĂ€llen; det finns alldeles för mĂ„nga, vilket skulle resultera i ett helt annat föredrag.

PostgreSQL-databashanteraren Àr en enorm mekanism, bestÄende av mÄnga delsystem vars samordnade arbete direkt pÄverkar databashanterarens prestanda. Under anvÀndningen samlas statistik och information om komponenternas arbete, vilket gör det möjligt att utvÀrdera PostgreSQL:s effektivitet och vidta ÄtgÀrder för att förbÀttra prestanda. Men informationen Àr omfattande och presenteras pÄ ett ganska förenklat sÀtt. Att bearbeta denna information och tolka den Àr ibland en komplex uppgift, och "djurdjupet" av verktyg och verktyg kan lÀtt förvirra Àven en avancerad DBA.
En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy


Spela video

God dag! Jag heter Aleksey. Som Ilya sa, kommer jag att berÀtta om statistik för PostgreSQL.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

Statistik över PostgreSQL-aktivitet. PostgreSQL har tvÄ typer av statistik. Aktivitetstatistik, som kommer att diskuteras, och statistik frÄn schemalÀggaren om datadistribution. Jag kommer att fokusera pÄ PostgreSQL:s aktivitetstatistik, som gör att vi kan bedöma prestandan och hur vi kan förbÀttra den.

Jag kommer att berÀtta hur man effektivt anvÀnder statistik för att lösa olika problem som kan uppstÄ för er.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

Vad kommer inte att tas upp i föredraget? Jag kommer inte att beröra statistik frÄn schemalÀggaren, eftersom det Àr ett separat Àmne för ett annat föredrag om hur data lagras i databasen och hur schemalÀggaren fÄr en uppfattning om kvalitativa och kvantitativa egenskaper hos dessa data.

Och det kommer inte att finnas nÄgra verktygsöversikter; jag kommer inte att jÀmföra en produkt med en annan. Det kommer inte att finnas nÄgon reklam. LÄt oss bortse frÄn det.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

Jag vill visa er att anvÀnda statistik Àr viktigt. Det Àr nödvÀndigt. Att anvÀnda den Àr inte skrÀmmande. Vi behöver bara vanlig SQL och grundlÀggande kunskaper om SQL.

Och vi kommer att prata om vilken statistik man ska vÀlja för att lösa problem.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

Om vi tittar pÄ PostgreSQL och kör ett kommando i operativsystemet för att visa processer, ser vi en "svart lÄda". Vi ser nÄgra processer som gör nÄgot, och av namnet kan vi ungefÀr förstÄ vad de gör, vad de sysslar med. Men i grunden Àr det en svart lÄda, vi kan inte titta inuti.

Vi kan se belastningen pÄ processorn i top, vi kan se minnesanvÀndningen med nÄgot systemverktyg, men vi kan inte titta in i PostgreSQL. För det behöver vi andra verktyg.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

Och fortsÀtter vi sÄ berÀttar jag var tiden gÄr. Om vi förestÀller oss PostgreSQL som ett schema, kan vi svara pÄ var tiden gÄr. Det handlar om tvÄ saker: det Àr bearbetning av klientförfrÄgningar frÄn applikationer och bakgrundsuppgifter som PostgreSQL utför för att upprÀtthÄlla sin funktionalitet.

Om vi börjar i det övre vÀnstra hörnet kan vi följa hur klientförfrÄgningar behandlas. En förfrÄgan kommer frÄn applikationen och för vidare arbete öppnas en klientsession. FörfrÄgan skickas till schemalÀggaren. SchemalÀggaren bygger en förfrÄgningsplan. Den skickas vidare för utförande. NÄgon form av blockbaserad in- och utdata med data relaterade till tabeller och index sker. NödvÀndiga data lÀses frÄn diskar till minnet i ett speciellt omrÄde "shared buffers". Resultaten av förfrÄgan, om det handlar om uppdateringar eller raderingar, registreras i transaktionsjournalen i WAL. Viss statistikinformation hamnar i loggen eller i statistikinsamlingsverktyget. Och resultatet av förfrÄgan ges tillbaka till klienten. Efter det kan klienten upprepa allt med en ny förfrÄgan.

Vad har vi med bakgrundsuppgifter och bakgrundsprocesser? Vi har flera processer som sÀkerstÀller funktionaliteten och hÄller databasen i normalt arbetslÀge. Dessa processer kommer ocksÄ att beröras i presentationen: autovacuum, checkpointer, processer relaterade till replikering, background writer. Var och en av dem kommer jag att ta upp allt eftersom presentationen framskrider.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

Vilka problem finns det med statistiken?

  • Det finns mycket information. PostgreSQL 9.4 tillhandahĂ„ller 109 metrik för att se statistikdata. Men om det finns mĂ„nga tabeller, scheman eller databaser i databasen, dĂ„ mĂ„ste alla dessa metrik multipliceras med motsvarande antal tabeller eller databaser. Det betyder att informationen blir Ă€nnu mer omfattande. Det Ă€r mycket lĂ€tt att drunkna i den.
  • Det nĂ€sta problemet Ă€r att statistiken presenteras i form av rĂ€knare. Om vi ser pĂ„ denna statistik kommer vi att se stĂ€ndigt vĂ€xande rĂ€knare. Om det har gĂ„tt mycket lĂ„ng tid sedan vi nollstĂ€llde statistiken kommer vi att se miljardvĂ€rden. Och de sĂ€ger oss ingenting.
  • Det finns ingen historik. Om du har haft nĂ„gon form av fel, nĂ„got som föll för 15-30 minuter sedan, gĂ„r det inte att anvĂ€nda statistiken för att se vad som hĂ€nde dĂ„. Det Ă€r ett problem.
  • Avsaknaden av ett inbyggt verktyg i PostgreSQL Ă€r ett problem. KĂ€rnans utvecklare tillhandahĂ„ller ingen verktygslösning. De har inget sĂ„dant. De ger bara statistik i databasen. AnvĂ€nd det, gör en frĂ„ga, gör vad du vill.
  • Eftersom det inte finns nĂ„got inbyggt verktyg i PostgreSQL orsakar detta ett annat problem. MĂ„nga tredjepartsverktyg. Varje företag med mer eller mindre kompetens försöker skriva sina egna program. Och resultatet Ă€r att det finns mĂ„nga verktyg i communityn som kan anvĂ€ndas för att hantera statistik. Vissa verktyg har vissa funktioner, andra har inte dessa funktioner, eller sĂ„ finns det nya funktioner. Det uppstĂ„r en situation dĂ€r man behöver anvĂ€nda tvĂ„, tre eller fyra verktyg som överlappar varandra och har olika funktioner. Det Ă€r mycket frustrerande.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

Vad följer av detta? Det Àr viktigt att kunna hÀmta statistik direkt för att inte vara beroende av programvaror, eller pÄ nÄgot sÀtt förbÀttra dessa program: lÀgga till funktioner för att fÄ sin egen nytta.

Och grundlÀggande kunskaper i SQL Àr nödvÀndiga. För att fÄ data frÄn statistiken behöver man skriva SQL-frÄgor, det vill sÀga du mÄste veta hur man skriver select och join.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

Statistiken erbjuder oss flera saker. Dessa kan delas upp i kategorier.

  • Den första kategorin omfattar hĂ€ndelser som intrĂ€ffar i databasen. Det Ă€r nĂ€r en hĂ€ndelse intrĂ€ffar i databasen: en förfrĂ„gan, Ă„tkomst till en tabell, autovakuum, commits – allt detta Ă€r hĂ€ndelser. De motsvarande rĂ€knarna ökar. Vi kan spĂ„ra dessa hĂ€ndelser.
  • Den andra kategorin avser egenskaper hos objekt som tabeller och databaser. De har egenskaper. Det handlar om storleken pĂ„ tabellerna. Vi kan spĂ„ra tillvĂ€xten av tabeller och index. Vi kan se förĂ€ndringar över tid.
  • Den tredje kategorin avser den tid som spenderas pĂ„ en hĂ€ndelse. En förfrĂ„gan Ă€r en hĂ€ndelse. Den har en specifik tidsmĂ„tt. HĂ€r startade den, hĂ€r slutade den. Vi kan spĂ„ra detta. Antingen tiden för att lĂ€sa en block frĂ„n disken eller för att skriva. SĂ„dana saker spĂ„ras ocksĂ„.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

Statistikens kÀllor presenteras pÄ följande sÀtt:

  • I det delade minnet (shared buffers) finns det ett segment för att lagra statiska data, dĂ€r finns ocksĂ„ de rĂ€knare som stĂ€ndigt ökar nĂ€r olika hĂ€ndelser intrĂ€ffar, eller nĂ€r det uppstĂ„r specifika situationer i databasens arbete.
  • Alla dessa rĂ€knare Ă€r inte tillgĂ€ngliga för anvĂ€ndaren och inte ens för administratören. Det Ă€r lĂ„gnivĂ„funktioner. För att fĂ„ Ă„tkomst till dem tillhandahĂ„ller PostgreSQL ett grĂ€nssnitt i form av SQL-funktioner. Vi kan göra SELECT-frĂ„gor med hjĂ€lp av dessa funktioner och fĂ„ en viss mĂ€tning (eller en uppsĂ€ttning mĂ€tningar).
  • Men det Ă€r inte alltid bekvĂ€mt att anvĂ€nda dessa funktioner, sĂ„ funktionerna Ă€r grunden för vyer (VIEWs). Det Ă€r virtuella tabeller som tillhandahĂ„ller statistik för ett specifikt delsystem eller en uppsĂ€ttning hĂ€ndelser i databasen.
  • Dessa inbyggda vyer (VIEWs) Ă€r det primĂ€ra anvĂ€ndargrĂ€nssnittet för att arbeta med statistik. De Ă€r tillgĂ€ngliga som standard utan ytterligare konfiguration, du kan anvĂ€nda dem direkt, titta pĂ„ dem, hĂ€mta information dĂ€rifrĂ„n. Det finns ocksĂ„ contrib-paket. Contrib-paketen Ă€r officiella. Du kan installera paketet postgresql-contrib (till exempel postgresql94-contrib), ladda in den nödvĂ€ndiga modulen i konfigurationen, ange parametrar för den, starta om PostgreSQL och kan sedan anvĂ€nda det. (Obs. Beroende pĂ„ distributionen Ă€r contrib-paketet i de senaste versionerna en del av huvudpaketet.).
  • Det finns oofficiella contrib. De ingĂ„r inte i standardpaketet för PostgreSQL. De mĂ„ste antingen kompileras eller installeras som ett bibliotek. Alternativen kan vara mycket olika, beroende pĂ„ vad utvecklaren av den oofficiella contrib'en har hittat pĂ„.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

Denna bild visar alla de vyer (VIEWs) och en del av de funktioner som finns tillgÀngliga i PostgreSQL 9.4. Som vi ser finns det mÄnga. Det kan vara ganska lÀtt att bli förvirrad, om man stöter pÄ detta för första gÄngen.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

Men om vi tar bilden frÄn tidigare Hur tid spenderas pÄ PostgreSQL och jÀmför med denna lista, sÄ fÄr vi en sÄdan bild. Varje vy (VIEWs) eller varje funktion kan vi anvÀnda för olika ÀndamÄl för att fÄ relevant statistik nÀr PostgreSQL Àr igÄng. Och vi kan fÄ viss information om subsystemets arbete.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

Det första vi kommer att titta pÄ Àr pg_stat_database. Som vi ser Àr det en vy. Den innehÄller mycket information. Mycket varierad information. Och den ger oss mycket nyttig kunskap om vad som hÀnder i databasen.

Vad kan vi dra nytta av dÀrifrÄn? LÄt oss börja med de enklaste sakerna.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

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

Det första vi kan se pÄ Àr cache-hit-procenten. Cache-hit-procenten Àr en nyttig mÀtning. Den gör det möjligt att utvÀrdera hur mycket data som hÀmtas frÄn shared buffers och hur mycket som lÀses frÄn disk.

Det Àr uppenbart att ju fler trÀffar vi har i cachen, desto bÀttre. Vi bedömer denna mÀtning som en procent. Och till exempel, om vÄr procentsats för dessa trÀffar i cachen Àr över 90 %, sÄ Àr det bra. Om den sjunker under 90 %, betyder det att vi inte har tillrÀckligt med minne för att hÄlla den heta "huvudet" av data i minnet. Och för att anvÀnda dessa data mÄste PostgreSQL vÀnda sig till disken, vilket Àr lÄngsammare Àn om data lÀstes frÄn minnet. Och vi bör redan tÀnka pÄ att öka minnet: antingen öka shared buffers eller uppgradera RAM.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

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;

Vad mer kan vi fÄ frÄn denna vy? Vi kan titta pÄ anomalier som intrÀffar i databasen. Vad visas hÀr? HÀr finns commits, rollbacks, skapande av temporÀra filer, deras storlek, deadlocks och konflikter.

Vi kan anvÀnda denna databasfrÄga. Denna SQL Àr ganska enkel. Och vi kan titta pÄ dessa data sjÀlva.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

Och hĂ€r Ă€r tröskelvĂ€rdena direkt. Vi ser förhĂ„llandet mellan commits och rollbacks. Commits – det Ă€r en framgĂ„ngsrik bekrĂ€ftelse av en transaktion. Rollbacks – det Ă€r Ă„terstĂ€llning, dvs. transaktionen utförde nĂ„got arbete, belastade databasen, berĂ€knade nĂ„got, och sedan intrĂ€ffade ett fel och resultaten frĂ„n transaktionen kasseras. Det vill sĂ€ga... ett antal rollbacks, som konstant ökar, Ă€r dĂ„ligt. Och vi bör undvika dem pĂ„ nĂ„got sĂ€tt och justera koden för att förhindra att det intrĂ€ffar.

Konflikter (conflicts) Àr relaterade till replikering. Och de bör ocksÄ undvikas. Om du har nÄgra frÄgor som körs pÄ en replik och konflikter uppstÄr, dÄ behöver dessa konflikter hanteras, se vad som hÀnder. Detaljer finns i loggarna. Och ÄtgÀrda konfliktsituationer sÄ att applikationens förfrÄgningar fungerar utan fel.

Deadlocks – detta Ă€r ocksĂ„ en dĂ„lig situation. NĂ€r förfrĂ„gningar kĂ€mpar om resurser, en förfrĂ„gan tillgĂ„ngar till en resurs och lĂ„ser den, den andra förfrĂ„gan tillgĂ„ngar till en annan resurs och lĂ„ser den ocksĂ„, och sedan bĂ„da förfrĂ„gningarna tillgĂ„ngar till varandras resurser och lĂ„ser sig i vĂ€ntan pĂ„ att grannen slĂ€pper lĂ„set. Detta Ă€r ocksĂ„ en problematisk situation. De mĂ„ste lösas genom att omprogrammera applikationer och seriell tillgĂ„ng till resurser. Och om du ser att dina deadlocks ökar konstant, behöver du titta pĂ„ detaljerna i loggarna, analysera de uppkomna situationerna och se vad problemet Ă€r.

TillfĂ€lliga filer (temp_files) – detta Ă€r ocksĂ„ dĂ„ligt. NĂ€r en anvĂ€ndares förfrĂ„gan saknar minne för att lagra temporĂ€ra data, skapar den en fil pĂ„ disken. Och alla operationer som den skulle kunna utföra i det temporĂ€ra minnet, börjar den nu utföra pĂ„ disken. Detta Ă€r lĂ„ngsamt. Det ökar tiden för att utföra förfrĂ„gan. Och klienten som skickade förfrĂ„gan till PostgreSQL kommer fĂ„ ett svar nĂ„got senare. Om alla dessa operationer utfördes i minnet, skulle Postgres svara mycket snabbare och klienten skulle vĂ€nta mindre.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

Pg_stat_bgwriter – detta vy beskriver arbetet hos tvĂ„ bakgrundssubsystem i PostgreSQL: det Ă€r checkpointer och background writer.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

Först kommer vi att gÄ igenom kontrollpunkterna, sÄ kallade. checkpoints. Vad Àr checkpoints? En checkpoint Àr en position i transaktionsloggen som meddelar att alla dataÀndringar som registrerats i loggen har synkroniserats framgÄngsrikt med datan pÄ disken. Processen kan, beroende pÄ arbetsbelastning och instÀllningar, ta tid och innebÀr frÀmst synkronisering av smutsiga sidor i shared buffers med datarfilerna pÄ disken. Varför Àr detta nödvÀndigt? Om PostgreSQL hela tiden skulle gÄ till disken för att hÀmta data och skriva data vid varje tillfÀlle, skulle det vara lÄngsamt. DÀrför har PostgreSQL en minnessegment vars storlek beror pÄ konfigurationens parametrar. Postgres placerar i detta minne aktiva data för efterföljande bearbetning eller vid behov. Vid dataÀndringsbegÀrningar Àndras dessa data, och vi fÄr tvÄ versioner av data. En version finns i minnet, den andra pÄ disken. Och periodiskt behöver dessa data synkroniseras. Vi behöver synkronisera det som har Àndrats i minnet till disken. För detta krÀvs checkpoint.

Checkpoint gÄr igenom shared buffers, markerar smutsiga sidor som nödvÀndiga för checkpoint. Den startar sedan en andra genomgÄng av shared buffers. Och sidorna som Àr markerade för checkpoint synkroniseras redan. SÄ hÀr utförs datasykronisering med disken.

Det finns tvĂ„ typer av checkpoints. En checkpoint utförs vid tidsgrĂ€ns. Detta Ă€r en anvĂ€ndbar och bra checkpoint – checkpoint_timed. Och det finns checkpoints pĂ„ begĂ€ran – checkpoint required. En sĂ„dan checkpoint intrĂ€ffar nĂ€r vi har mycket stora dataskrivningar. Vi har skrivit vĂ€ldigt mĂ„nga transaktionsloggar. Och PostgreSQL anser att det Ă€r nödvĂ€ndigt att synkronisera allt sĂ„ snabbt som möjligt, göra en checkpoint och gĂ„ vidare.

Och om du har tittat pÄ statistiken pg_stat_bgwriter och sett att du har checkpoint_req mycket fler Àn checkpoint_timed, sÄ Àr det dÄligt. Varför Àr det dÄligt? Det betyder att PostgreSQL Àr i en stÀndig stressituation nÀr det behöver skriva data till disken. Checkpoint vid tidsgrÀns Àr mindre stressande och utförs enligt ett internt schema och sprids över tid. PostgreSQL har möjlighet att göra pauser i arbetet och inte belasta lagringssystemet. Detta Àr bra för PostgreSQL. Och begÀrningar som utförs under en checkpoint kommer inte att uppleva stress av att lagringssystemet Àr upptaget.

Och för att justera checkpoint finns det tre parametrar:

  • checkpoint_segments.

  • checkpoint_timeout.

  • checkpoint_completion_target.

De gör det möjligt att justera arbetet med kontrollpunkter. Men jag kommer inte att gÄ djupare in pÄ dem. Deras pÄverkan Àr ett eget Àmne.

Observera: Den version som diskuteras i rapporten, 9.4, Àr redan förÄldrad. I moderna versioner av PostgreSQL ersÀtts parameter checkpoint_segments med parametrarna min_wal_size och max_wal_size.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

Den nĂ€sta delsystemet Ă€r bakgrundsskrivaren — background writer. Vad gör den? Den arbetar kontinuerligt i en oĂ€ndlig slinga. Den skannar sidor i shared buffers och slĂ€pper de smutsiga sidor den hittar till disken. PĂ„ sĂ„ sĂ€tt hjĂ€lper den checkpointer:n att utföra mindre arbete under kontrollpunktsprocessen.

Vad behövs den för mer? Den tillhandahĂ„ller behovet av rena sidor i shared buffers ifall de skulle behövas (i stor mĂ€ngd och omedelbart) för att lagra data. Anta att en situation uppstĂ„r dĂ€r det krĂ€vs rena sidor för att utföra en förfrĂ„gan och de redan finns i shared buffers. Postgres backend tar bara dem och anvĂ€nder dem, den behöver inte stĂ€da nĂ„got sjĂ€lv. Men om sĂ„dana sidor plötsligt inte finns, stannar backend arbetet och börjar leta efter sidor som de kan slĂ€ppa till disken och ta för sina behov — vilket negativt pĂ„verkar tiden för den aktuella förfrĂ„gan. Om du ser att din parameter maxwritten_clean Ă€r stor, betyder det att bakgrundsskrivaren inte klarar av sitt arbete och att parametrarna bgwriter_lru_maxpages, behöver ökas sĂ„ att den kan göra mer arbete och stĂ€da fler sidor under ett cykel.

Och en annan mycket anvĂ€ndbar indikator – det Ă€r buffers_backend_fsync. Backend gör ingen fsync eftersom det Ă€r lĂ„ngsamt. De överför fsync högre upp i IO-stacken till checkpointer:n. Checkpointer:n har sin egen kö, han behandlar fsync periodiskt och synkroniserar sidor i minnet med filer pĂ„ disken. Om kön Ă€r stor för checkpointer:n och fylld, mĂ„ste backend göra fsync sjĂ€lv och det saktar ner backendens arbete, vilket innebĂ€r att klienten fĂ„r svar senare Ă€n den annars skulle ha gjort. Om du ser att detta vĂ€rde Ă€r större Ă€n noll, Ă€r det redan ett problem och du bör uppmĂ€rksamma instĂ€llningarna för bakgrundsskriver och Ă€ven utvĂ€rdera prestandan i diskdelssystemet.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

Observera: _Texten nedan beskriver statistiska representationer kopplade till replikering. Största delen av namnen för representationer och funktioner har döpts om i Postgres 10. KÀrnan i dessa omdöpningar handlar om att ersÀtta xlog till wal och plats till lsn i namnen pÄ funktioner/representationer m.m. Ett specifikt exempel Àr funktionen pg_xlog_location_diff() som har döpts om till pg_wal_lsn_diff()._

HÀr har vi ocksÄ mycket, men vi behöver bara punkterna kopplade till plats.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

Om vi ser att alla vÀrden Àr lika, Àr det en idealisk situation och replikationen ligger inte efter huvudservern.

Denna hexadecimala position Àr positionen i transaktionsloggen. Den ökar stÀndigt om det finns nÄgon aktivitet i databasen: insert, delete, etc.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

hur mycket xlog som skrivits i byte
$ select
pg_xlog_location_diff(pg_current_xlog_location(),'0/00000000');
replikationslagret i byte
$ select
client_addr,
pg_xlog_location_diff(pg_current_xlog_location(), replay_location)
from pg_stat_replication;
replikationslagret i sekunder
$ select
extract(epoch from now() - pg_last_xact_replay_timestamp());

Om dessa saker skiljer sig Ät, finns det en fördröjning. Fördröjningen Àr en avvikelse mellan replikaten och huvudservern, dvs. data skiljer sig mellan servrarna.

Det finns tre orsaker till avvikelsen:

  • Det Ă€r diskundersystemet som inte klarar av att skriva synkronisering av filer.
  • Det kan vara nĂ€tverksproblem, eller överbelastning av nĂ€tverket, dĂ„ data inte hinner fram till replikaten och den inte kan Ă„terge dem.
  • Och processorn. Processorn Ă€r en mycket sĂ€llsynt orsak. Jag har sett det tvĂ„ eller tre gĂ„nger, men det kan ocksĂ„ hĂ€nda.

Och hÀr Àr tre frÄgor som gör att vi kan anvÀnda statistiken. Vi kan uppskatta hur mycket som skrivits i transaktionsloggen. Det finns en funktion pg_xlog_location_diff och vi kan uppskatta replikationslagret i byte och sekunder. Det anvÀnder vi ocksÄ vÀrden frÄn denna vy (VIEWs).

AnmÀrkning: _IstÀllet för pg_xlog_locationdiff() funktionen kan vi anvÀnda subtraktionsoperatorn och subtrahera en plats frÄn en annan. Det Àr bekvÀmt.

Med fördröjningen i sekunder finns det en sak att notera. Om det inte sker nÄgon aktivitet pÄ huvudservern, och transaktionen var för typ 15 minuter sedan utan aktivitet, och om vi kollar pÄ denna fördröjning pÄ replikatet, sÄ ser vi en fördröjning pÄ 15 minuter. Detta Àr vÀrt att komma ihÄg. Det kan vara förvirrande nÀr du tittar pÄ denna fördröjning.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

Pg_stat_all_tables – Ă€nnu en anvĂ€ndbar vy. Den visar statistik över tabeller. NĂ€r vi har tabeller i databasen, med viss aktivitet eller Ă„tgĂ€rder, kan vi fĂ„ denna information frĂ„n denna vy.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

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;

Det första vi kan titta pÄ Àr sekventiella skanningar av tabellen. SjÀlva siffran efter dessa genomgÄngar Àr Ànnu inte nödvÀndigtvis dÄlig och inte en indikation pÄ att vi behöver göra nÄgot.

Men det finns en andra metrik – seq_tup_read. Detta Ă€r antalet rader som returneras som ett resultat av sekventiell skanning. Om det genomsnittliga antalet överstiger 1 000, 10 000, 50 000 eller 100 000, Ă€r det en indikation pĂ„ att du kanske behöver bygga ett index nĂ„gonstans för att Ă„tkomster ska gĂ„ via indexet, eller kanske optimera de frĂ„gor som anvĂ€nder sĂ„dana sekventiella skanningar för att undvika detta.

Ett enkelt exempel – lĂ„t oss sĂ€ga att en frĂ„ga med stort OFFSET och LIMIT stĂ„r. Till exempel skannar den 100 000 rader i tabellen och efter det hĂ€mtar 50 000 nödvĂ€ndiga rader, medan de tidigare skannade raderna förkastas. Detta Ă€r ocksĂ„ ett dĂ„ligt fall. Och sĂ„dana frĂ„gor behöver optimeras. HĂ€r Ă€r en sĂ„dan enkel SQL-frĂ„ga dĂ€r man kan titta pĂ„ detta och utvĂ€rdera de erhĂ„llna siffrorna.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

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;

Tabellstorlekar kan ocksÄ erhÄllas med hjÀlp av denna vy och med hjÀlp av ytterligare funktioner. pg_total_relation_size(), pg_relation_size().

Generellt finns det metakommandon dt och di, som kan anvÀndas i PSQL för att ocksÄ se storlekarna pÄ tabeller och index.

Men att anvÀnda funktioner hjÀlper oss att se tabellstorlekarna med eller utan beaktande av index och redan göra vissa uppskattningar baserat pÄ databastillvÀxt, det vill sÀga hur den vÀxer, med vilken intensitet och redan dra slutsatser om storleksoptimering.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

Skrivaktivitet. Vad Ă€r skrivning? LĂ„t oss titta pĂ„ operationen. UPPDATERA – operation update av rader i tabellen. I grund och botten Ă€r update tvĂ„ operationer (eller fler). Det handlar om att sĂ€tta in en ny version av raden och markera den gamla versionen av raden som förĂ„ldrad. Senare kommer autovacuum att rensa dessa förĂ„ldrade versioner av raderna och markera detta utrymme som tillgĂ€ngligt för Ă„teranvĂ€ndning.

Dessutom Àr update inte bara en uppdatering av tabellen. Det innebÀr ocksÄ en uppdatering av index. Om du har mÄnga index pÄ tabellen, mÄste alla index dÀr de uppdaterade fÀlten ingÄr ocksÄ uppdateras vid update. I dessa index kommer det Àven att finnas förÄldrade versioner av raderna som behöver rensas.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

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;

Och pĂ„ grund av sin design Ă€r UPDATE – tunga operationer. Men de kan göras lĂ€ttare. Det finns hot updates. De introducerades i PostgreSQL version 8.3. Och vad Ă€r det? Det Ă€r en lĂ€ttvikts update som inte orsakar ombyggnad av index. D.v.s. vi uppdaterade posten, men endast posten pĂ„ sidan (som tillhör tabellen) uppdaterades, medan index fortfarande pekar pĂ„ samma post pĂ„ sidan. Det finns en intressant logik hĂ€r, nĂ€r vacuum kommer, sĂ„ omorganiserar den dessa kedjor hot och allt fortsĂ€tter att fungera utan att indexen uppdateras, vilket sker med mindre resursanvĂ€ndning.

Och nÀr du har n_tup_hot_upd stort, dÄ Àr det vÀldigt bra. Det betyder att lÀtta uppdateringar dominerar och det blir billigare för oss i resurser och allt fungerar perfekt.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

ALTER TABLE table_name SET (fillfactor = 70);

Hur ökar vi volymen av hot updates? Vi kan anvĂ€nda fillfactor. Den definierar storleken pĂ„ det reserverade fria utrymmet nĂ€r sidan i tabellen fylls med INSERT-ar. NĂ€r data sĂ€tts in i tabellen, fyller de helt sidan utan att lĂ€mna nĂ„got ledigt utrymme. Sedan allokeras en ny sida. Återigen fylls data. Och detta beteende Ă€r standard, fillfactor = 100 %.

Vi kan stÀlla in fillfactor pÄ 70 %. Det vill sÀga nÀr det görs insert kommer en ny sida att allokeras, men endast 70 % av sidan kommer att fyllas. Och 30 % Àr kvar som reserv. NÀr vi behöver göra en uppdatering, sÄ kommer den med hög sannolikhet att ske pÄ samma sida, och den nya versionen av raden kommer att placeras pÄ samma sida. En hot_update kommer att göras. PÄ sÄ sÀtt underlÀttas skrivningen pÄ tabellerna.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

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

Kö för avhysning. Avhysning Àr ett system dÀr statistiken i PostgreSQL Àr mycket begrÀnsad. Vi kan endast se hur lÀnge vÄra avhysningar pÄgÄr just nu i tabellerna pg_stat_activity. Men att förstÄ hur mÄnga tabeller som Àr i kön Àr mycket svÄrt.

AnmĂ€rkning: _Sedan version 10 av Postgres har situationen med övervakning av avhysning förbĂ€ttrats avsevĂ€rt — en visning av pg_stat_progress har tillkommit.vacuum, vilket vĂ€sentligt förenklar frĂ„gan om övervakning av avhysning.

Vi kan anvÀnda en förenklad frÄga. Och vi kan se nÀr avhysning ska göras. Men hur och nÀr ska avhysningen starta? Det handlar om de utdaterade versionerna av raderna som jag nÀmnde tidigare. En uppdatering har skett, en ny version av raden har lagts till. En utdaterad version av raden har uppstÄtt. I tabellen pg_stat_user_tables finns det en parameter n_dead_tup. Den visar antalet "döda" rader. Och sÄ snart antalet döda rader överstiger en viss tröskel kommer avhysningen att sÀttas in.

Och hur berÀknas denna tröskel? Det Àr en helt specifik procentandel av det totala antalet rader i tabellen. Det finns en parameter autovacuum_vacuum_scale_factor. Den definierar procentandelen. Anta att det Àr 10 % + en extra grundtröskel pÄ 50 rader. Vad hÀnder dÄ? NÀr vi har fler döda rader Àn "10 % + 50" av alla rader i tabellen, sÄ sÀtts tabellen pÄ avhysning.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

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

Men hÀr finns en aspekt. Grundtröskeln för parametrarna av_base_thresh och av_scale_factor kan tillsÀttas individuellt. Och dÀrför kommer tröskeln inte att vara global, utan individuell för tabellen. DÀrför, för att berÀkna, behöver vi anvÀnda knep och trix. Och om du Àr intresserad kan du titta pÄ erfarenheterna frÄn vÄra kollegor pÄ Avito (lÀnken pÄ bilden Àr ogiltig och har uppdaterats i texten).

De skrev för munin plugin, som tar hÀnsyn till dessa saker. Det finns en lunta pÄ tvÄ sidor. Men den rÀknar korrekt och gör det ganska effektivt möjligt att bedöma var vi har mycket vakuum som behövs för tabeller, dÀr det Àr lite.

Vad kan vi göra med detta? Om vi har en stor kö och autovacuum inte rĂ€cker till, kan vi öka antalet vakuumarbetare, eller helt enkelt göra vakuumet mer aggressivt, sĂ„ att det triggas tidigare, och bearbetar tabellen i smĂ„ bitar. Och pĂ„ sĂ„ sĂ€tt kommer kön att minska. — Det huvudsakliga hĂ€r Ă€r att övervaka belastningen pĂ„ diskarna, eftersom vakuum Ă€r en kostsam Ă„tgĂ€rd, Ă€ven om problemet har blivit mindre mĂ€rkbar med introduktionen av SSD/NVMe-enheter.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

Pg_stat_all_indexes – detta Ă€r statistik över index. Den Ă€r liten. Och vi kan fĂ„ information om anvĂ€ndningen av index dĂ€rifrĂ„n. Och till exempel kan vi avgöra vilka index som Ă€r överflödiga.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

Som jag redan nĂ€mnt, uppdatera – det Ă€r inte bara en uppdatering av tabeller, utan det handlar ocksĂ„ om att uppdatera index. DĂ€rför, om vi har mĂ„nga index pĂ„ tabellen, mĂ„ste de indexerade fĂ€lten ocksĂ„ uppdateras nĂ€r vi uppdaterar rader i tabellen, och om vi har oanvĂ€nda index som inte har nĂ„gra indexskanningar, sĂ„ hĂ€nger de kvar som ballast. Och vi mĂ„ste bli av med dem. För detta behöver vi fĂ€ltet idx_scan. Vi kollar bara antalet indexskanningar. Om indexen har noll skanningar under en relativt lĂ„ng statistikperiod (minst 2-3 veckor), sĂ„ Ă€r det troligtvis dĂ„liga index och vi behöver bli av med dem.

AnmÀrkning: Vid sökning efter oanvÀnda index i fallet med kluster av strömreplikering behöver vi kolla alla noder i klustret, eftersom statistiken inte Àr global, och om ett index inte anvÀnds pÄ huvudservern, kan det anvÀndas pÄ repliker (om det finns belastning dÀr).

TvÄ lÀnkar:

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

Detta Àr mer avancerade exempel pÄ frÄgor för att söka efter oanvÀnda index.

Den andra lÀnken Àr en ganska intressant förfrÄgan. Det finns ganska otraditionell logik inbÀddad. Jag rekommenderar att du kollar pÄ den.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

Vad bör vi sammanfatta angÄende index?

  • OanvĂ€nda index Ă€r dĂ„liga.

  • De tar upp plats.

  • De saktar ner uppdateringsoperationer.

  • Det Ă€r onödig arbetsbelastning för vacuum.

Om vi tar bort oanvÀnda index gör vi bara databasen bÀttre.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

Den nÀsta visningen Àr pg_stat_activity. Det Àr en motsvarighet till verktyget ps, endast i PostgreSQL. Om psdu tittar pÄ processer i operativsystemet, sÄ pg_stat_activity visar det aktiviteten inom PostgreSQL.

Vad kan vi fÄ ut som Àr anvÀndbart dÀrifrÄn?

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

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

Vi kan se den totala aktiviteten, vad som hÀnder i databasen. Vi kan göra en ny distribution. Allt har sprÀngt, nya anslutningar tas inte emot, fel strömmar in i applikationen.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

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

Vi kan köra en sÄdan förfrÄgan och se den totala procentandelen av anslutningar i förhÄllande till den maximala anslutningsgrÀnsen och se vem som tar upp flest anslutningar. I det hÀr exemplet ser vi att anvÀndare cron_role har öppnat 508 anslutningar. Och nÄgot har hÀnt med denne. Vi behöver undersöka det och troligen Àr det en anomali med antalet anslutningar.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

Om vi har OLTP-belastning bör förfrÄgningarna köras snabbt, mycket snabbt, och det bör inte finnas nÄgra lÄnga förfrÄgningar. Men om det uppstÄr lÄnga förfrÄgningar, Àr det inte sÄ farligt pÄ kort sikt, men pÄ lÄng sikt skadar lÄnga förfrÄgningar databasen, de ökar bloat-effekten för tabeller nÀr tabeller fragmenteras. BÄde bloat och lÄnga förfrÄgningar bör vi bli av med.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

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;

Observera: med en sÄdan förfrÄgan kan vi identifiera lÄnga förfrÄgningar och transaktioner. Vi anvÀnder funktionen clock_timestamp() för att bestÀmma hur lÀnge de har varit aktiva. De lÄnga förfrÄgningarna vi hittar kan vi memorera, köra explain, se planerna och optimera pÄ nÄgot sÀtt. De aktuella lÄnga förfrÄgningarna avbryter vi och fortsÀtter sedan.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

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

DÄliga transaktioner Àr transaktioner i tillstÄndet idle in transaction och idle in transaction (aborted).

Vad betyder det? Transaktioner har flera tillstÄnd. Och ett av dessa tillstÄnd kan tas nÀr som helst. För att bestÀmma tillstÄnden finns det ett fÀlt state i denna vy. Och vi anvÀnder det för att bestÀmma tillstÄndet.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

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

Och, som jag nĂ€mnde ovan, dessa tvĂ„ tillstĂ„nd idle in transaction och idle in transaction (aborted) – detta Ă€r dĂ„ligt. Vad innebĂ€r det? Det Ă€r nĂ€r en applikation har öppnat en transaktion, gjort nĂ„gon Ă„tgĂ€rd och sedan gĂ„tt vidare med sina Ă€renden. Transaktionen förblir öppen. Den hĂ€nger, ingenting hĂ€nder i den, den tar upp en anslutning, lĂ„ser de Ă€ndrade raderna och potentiellt ökar Ă€ven bloat hos andra tabeller, pĂ„ grund av strukturen i transaktionsmotorn Postgres. Och sĂ„dana transaktioner bör ocksĂ„ avslutas, för de Ă€r skadliga under alla omstĂ€ndigheter.

Om du ser att de har blivit fler Àn 5-10-20 i din databas, Àr det dags att bli orolig och börja ta itu med dem.

HÀr anvÀnder vi ocksÄ för berÀkningstiden clock_timestamp(). Vi avslutar transaktioner, optimerar applikationen.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

Som jag nĂ€mnde tidigare, lĂ„sningar – det Ă€r nĂ€r tvĂ„ eller fler transaktioner slĂ„ss om en eller flera resurser. För detta har vi fĂ€ltet waiting med ett booleskt vĂ€rde true eller false.

True – det betyder att processen Ă€r i vĂ€ntelĂ€ge, nĂ„got mĂ„ste göras. NĂ€r processen Ă€r i vĂ€ntelĂ€ge, betyder det att klienten som initierade denna process ocksĂ„ vĂ€ntar. Klienten i webblĂ€saren sitter och vĂ€ntar.

Observera: _FrÄn och med version Postgres 9.6 har fÀltet waiting tagits bort och istÀllet har tvÄ mer informativa fÀlt lagts till wait_event_type och wait_event._

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

Vad göra? Om du ser true under lÄng tid, betyder det att sÄdana förfrÄgningar mÄste elimineras. Vi avslutar helt enkelt sÄdana transaktioner. Vi informerar utvecklarna om att nÄgot mÄste optimeras för att undvika resurskonflikter. Och vidare optimerar utvecklarna applikationen för att sÄdant inte ska intrÀffa.

Och det sista, men potentiellt inte fatala fallet – det Ă€r uppkomsten av deadlocks. TvĂ„ transaktioner har uppdaterat tvĂ„ resurser, sedan Ă„terkommer de till dessa resurser igen, nu till motsatta resurser. PostgreSQL tar i detta fall och avslutar sjĂ€lv transaktionen, sĂ„ att den andra kan fortsĂ€tta arbeta. Det Ă€r en dödlĂ€ge-situation och den löser sig inte sjĂ€lv. DĂ€rför tvingas PostgreSQL vidta extrema Ă„tgĂ€rder.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

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/

Och hÀr Àr tvÄ frÄgor som tillÄter oss att spÄra lÄsningar. Vi anvÀnder vyn pg_locks, som gör det möjligt att spÄra tunga lÄs.

Och den första lÀnken Àr sjÀlva förfrÄgnings texten. Den Àr ganska lÄng.

Och den andra lÀnken Àr en artikel om lÄs. Den Àr bra att lÀsa, den Àr mycket intressant.

SĂ„, vad ser vi? Vi ser tvĂ„ förfrĂ„gningar. En transaktion med ALTER TABLE – det Ă€r en blockerande transaktion. Den har startat men inte avslutats och applikationen som startade denna transaktion hĂ„ller pĂ„ med andra saker. Och den andra förfrĂ„gan Ă€r update. Den vĂ€ntar pĂ„ att alter table ska avslutas för att fortsĂ€tta sitt arbete.

PÄ det hÀr sÀttet kan vi ta reda pÄ vem som lÄser vem, hÄller och vi kan fortsÀtta hantera det.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

NÀsta modul Àr pg_stat_statements. Som jag redan har sagt, Àr det en modul. För att anvÀnda den mÄste vi ladda dess bibliotek i konfigurationerna, starta om PostgreSQL, installera modulen (med ett kommando) och dÀrefter fÄr vi en ny vy.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

Genomsnittlig förfrÄgnings tid i millisekunder
$ select (sum(total_time) \/ sum(calls))::numeric(6,3)
from pg_stat_statements;

De mest aktiva skrivförfrÄgningarna (i shared_buffers)
$ select query, shared_blks_dirtied
from pg_stat_statements
where shared_blks_dirtied > 0 order by 2 desc;

Vad kan vi fÄ dÀrifrÄn? Om vi pratar om enkla saker kan vi fÄ den genomsnittliga tiden för genomförande av en förfrÄgan. Tiden ökar, vilket betyder att vÄr PostgreSQL svarar lÄngsamt och vi mÄste vidta ÄtgÀrder.

Vi kan titta pÄ de mest aktiva skrivtransaktionerna i databasen som Àndrar data i shared buffers. Titta pÄ vem som uppdaterar eller tar bort data.

Och vi kan helt enkelt titta pÄ olika statistik frÄn dessa förfrÄgningar.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

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

Vi pg_stat_statements anvÀnder vi för att skapa rapporter. En gÄng om dagen nollstÀller vi statistiken. Vi samlar pÄ oss den. Innan vi nollstÀller statistiken nÀsta gÄng, skapar vi en rapport. HÀr Àr lÀnken till rapporten. Du kan titta pÄ den.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

Vad gör vi? Vi rÀknar den totala statistiken för alla förfrÄgningar. Sedan berÀknar vi varje förfrÄgnings individuella bidrag till denna totala statistik.

Och vad kan vi titta pÄ? Vi kan se den totala tiden för genomförande av alla förfrÄgningar av en viss typ jÀmfört med alla andra förfrÄgningar. Vi kan se resursanvÀndning av CPU och in/ut-övergripande bild. Och redan optimera dessa förfrÄgningar. Vi bygger topplistor baserade pÄ denna rapport och fÄr redan mat för eftertanke om vad som ska optimeras.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

Vad har vi kvar bakom kulisserna? Det finns fortfarande nÄgra presentationer kvar som jag inte har tagit upp eftersom tiden Àr begrÀnsad.

Det finns pgstattuple – det Ă€r ocksĂ„ en ytterligare modul frĂ„n standardpaketet contribs. Den gör det möjligt att bedöma bloat tabeller, sĂ„ kallad tabellfragmentering. Och om fragmenteringen Ă€r stor mĂ„ste vi ta bort den, anvĂ€nda olika verktyg. Och funktionen pgstattuple tar lĂ„ng tid. Ju fler tabeller, desto lĂ€ngre tid kommer den att ta.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

NÀsta contrib Àr pg_buffercache. Den gör det möjligt att inspektera delade buffrar: hur intensivt och under vilka tabeller sidor i buffern utnyttjas. Och den lÄter helt enkelt titta in i de delade buffrarna och bedöma vad som hÀnder dÀr.

NÀsta modul Àr pgfincore. Den utför lÄgnivÄoperationer med tabeller genom systemanropet mincore(), det vill sÀga den gör det möjligt att ladda en tabell i delade buffrar eller att avlÀgsna den. Den tillÄter Àven att inspektera sidcacheminnet i operativsystemet, det vill sÀga hur mycket utrymme vÄr tabell tar i page cache, i delade buffrar och lÄter oss helt enkelt bedöma belastningen pÄ tabellen.

NÀsta modul Àr pg_stat_kcache. Den anvÀnder ocksÄ systemanropet getrusage(). Och utför det före och efter att förfrÄgan har körts. Och i den resulterande statistiken gör det möjligt att bedöma hur mycket vÄr förfrÄgan kostade i disk I/O, det vill sÀga operationer med filsystemet, och ser pÄ processoranvÀndningen. Dock Àr modulen ung (eh-eh) och för sin funktion krÀver den PostgreSQL 9.4 och pg_stat_statements, som jag nÀmnde tidigare.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

  • Att kunna anvĂ€nda statistiken Ă€r nyttigt. Du behöver inga externa program. Du kan sjĂ€lv kika in, se nĂ„got, göra nĂ„got, utföra.

  • Det Ă€r inte svĂ„rt att anvĂ€nda statistiken, det Ă€r vanlig SQL. Du samlar en förfrĂ„gan, formar den, skickar den, tittar.

  • Statistik hjĂ€lper till att besvara frĂ„gor. Om du har frĂ„gor, vĂ€nder du dig till statistiken – kollar, drar slutsatser, analyserar resultaten.

  • Och experimentera. Det finns mĂ„nga förfrĂ„gningar, mycket data. Det gĂ„r alltid att optimera en redan existerande förfrĂ„gan. Du kan göra din egen version av en förfrĂ„gan som passar dig bĂ€ttre Ă€n originalet och anvĂ€nda den.

En djupdykning i PostgreSQL:s interna statistik. Aleksey Lesovskiy

LĂ€nkar

Bra lÀnkar som fanns i artikeln som lÄg till grund för föredraget.

Författaren skriver mer
https://dataegret.com/news-blog (eng)

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

Systemadministrationsfunktioner
https://www.postgresql.org/docs/current/functions-admin.html

Contrib-moduler
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-verktyg och sql kodexempel
https://github.com/dataegret/pg-utils

Tack för uppmÀrksamheten, alla!

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster