
Filosofisk introduktion
Som bekant finns det endast tvÄ metoder för att lösa problem:
- Analysmetoden eller deduktiv metod, eller frÄn det allmÀnna till det specifika.
- Syntesmetoden eller induktiv metod, eller frÄn det speciella till det allmÀnna.
För att lösa problemet "förbÀttra databasens prestanda" kan det se ut sÄ hÀr.
Analys â vi analyserar problemet i olika delar och försöker förbĂ€ttra databasens prestanda som helhet.
I praktiken ser analysen ut ungefÀr sÄ hÀr:
- Ett problem uppstÄr (prestandahÀndelse)
- Vi samlar in statistisk information om databasens status
- Vi letar efter flaskhalsar
- Vi löser problemen med flaskhalsarna
Flaskhalsar i databasen â infrastruktur (CPU, minne, diskar, nĂ€tverk, OS), instĂ€llningar (postgresql.conf), frĂ„gor:
Infrastruktur: möjligheterna till pÄverkan och förÀndring för ingenjören Àr nÀstan noll.
DatabasinstÀllningar: möjligheterna till förÀndringar Àr nÄgot större Àn i föregÄende fall, men som regel fortfarande ganska besvÀrliga, sÀrskilt i molnet.
FörfrÄgningar till databasen: den enda möjligheten för manövrerande.
Syntes â vi förbĂ€ttrar prestandan hos enskilda delar, i förvĂ€ntan att databasens prestanda som helhet förbĂ€ttras.
Lyrisk introduktion eller varför allt detta Àr nödvÀndigt
Hur processen för att lösa prestandahÀndelser gÄr till, om databasens prestanda inte övervakas:
Kunden - "vi har det dÄligt, lÄngsamt, gör oss bra"
Ingenjören - "vad Àr dÄligt?"
Kunden - "sÄ hÀr Àr det nu (för en timme sedan, igÄr, förra gÄngen), lÄngsamt"
Ingenjören - "och nÀr var det bra?"
Kunden - "för en vecka (tvÄ veckor) sedan var det inte illa." (Det var tur)
Kunden - "och jag minns inte nÀr det var bra, men nu Àr det dÄligt" (Vanligt svar)
Resultatet blir en klassisk bild:

Vem Àr skyldig och vad ska göras?
Det Ă€r lĂ€ttast att svara pĂ„ den första delen av frĂ„gan â DBA-ingenjören Ă€r alltid skyldig.
Det Ă€r inte heller alltför svĂ„rt att svara pĂ„ den andra delen â en övervakningssystem för databasens prestanda mĂ„ste implementeras.
Det uppstĂ„r en första frĂ„ga â vad ska övervakas?
VÀg 1. Vi ska övervaka ALLT

CPU-belastning, antal diskoperationer (lÀs/skriv), storleken pÄ det tilldelade minnet, och en mÀngd olika statistiska mÄtt som vilket mer eller mindre fungerande övervakningssystem kan tillhandahÄlla.
Resultatet blir en massa grafer, sammanstĂ€llningar och kontinuerliga notifikationer via e-post, vilket gör att ingenjören alltid Ă€r upptagen med att hantera en mĂ€ngd likadana Ă€renden, ofta med en standardformulering â "Temporary issue. No action need". Ă tminstone Ă€r alla upptagna, och det finns alltid nĂ„got att visa för kunden â arbetet pĂ„gĂ„r.
VĂ€g 2. Ăvervaka endast det som Ă€r nödvĂ€ndigt, och det som inte behövs, ska inte övervakas
Det gĂ„r att övervaka, lite annorlunda â bara enheter och hĂ€ndelser:
- Som ingenjör DBA kan pÄverka
- För vilka det finns en handlingsplan vid uppkomsten av en hÀndelse eller Àndring av en enhet.
UtifrÄn den hÀr förutsÀttningen och med tanke pÄ "Filosofisk introduktion" för att undvika regelbundet Äterkommande "Lyrisk introduktion eller varför allt detta Àr nödvÀndigt" kan det vara fördelaktigt att övervaka prestanda för specifika frÄgor, för att optimera och analysera, vilket i slutÀndan bör leda till en förbÀttring av hela databasens prestanda.
Men för att förbÀttra en tung frÄga som pÄverkar databasens totala prestanda, mÄste man först hitta den.
SÄ, tvÄ relaterade frÄgor uppstÄr:
- vilken frÄga betraktas som tung
- hur man söker efter tunga frÄgor.
Uppenbarligen Àr en tung frÄga en frÄga som anvÀnder mycket av systemresurserna för att fÄ ett resultat.
Vi gĂ„r vidare till den andra frĂ„gan â hur man söker och sedan övervakar tunga frĂ„gor?
Vilka möjligheter för övervakning av frÄgor finns det i PostgreSQL?
JÀmfört med Oracle finns det inte mÄnga möjligheter, men det gÄr fortfarande att göra en del.

PG_STAT_STATEMENTS
För att hitta och övervaka tunga frÄgor i PostgreSQL Àr det standardutvidgningen pg_stat_statements avsedd.
Efter installationen av utvidgningen, dyker det upp en visning med samma namn i den mÄl-databasen, som behövs för övervakning.
MÄlcellerna pg_stat_statements för att bygga ett övervakningssystem:
- queryid Inre hash-kod berÀknad utifrÄn operatorns syntaxtrÀd
- max_time Maximal tid som spenderas pÄ operatorn, i millisekunder
Genom att samla in och anvÀnda statistik frÄn dessa tvÄ kolumner kan ett övervakningssystem byggas.
Hur pg_stat_statements anvÀnds för att övervaka PostgreSQL:s prestanda

För att övervaka prestandan av frÄgor anvÀnds:
PĂ„ sidan av mĂ„ldatabasen â vy pg_stat_statements
FrĂ„n sidan servern och övervakningsdatabasen â en uppsĂ€ttning bash-skript och servicetabeller.
Steg 1 â insamling av statistiska data
PÄ övervakningsservern körs regelbundet ett skript via cron som kopierar innehÄllet i vyerna pg_stat_statements frÄn mÄldatabasen till tabellen pg_stat_history i övervakningsdatabasen.
PÄ sÄ sÀtt skapas en historik över utförandet av enskilda frÄgor, vilken kan anvÀndas för att skapa prestandarapporter och justera mÀtvÀrden.
Steg 2 â instĂ€llning av prestandamĂ€tningar
Baserat pÄ de insamlade uppgifterna vÀljer vi ut de frÄgor vars utförande Àr mest kritiska/viktiga för kunden (applikationen). I samförstÄnd med bestÀllaren faststÀller vi vÀrdena för prestandamÀtningarna med hjÀlp av fÀlten queryid och max_time.
Resultatet â start av prestandaövervakning
- Ăvervakningsskriptet kontrollerar de konfigurerade prestandamĂ€tningarna vid start, genom att jĂ€mföra vĂ€rdet max_time för mĂ€tningen med vĂ€rdet frĂ„n vyerna pg_stat_statements i mĂ„ldatabasen.
- Om vĂ€rdet i mĂ„ldatabasen överstiger mĂ€tvĂ€rdet â genereras en varning (incident i Ă€rendehanteringssystemet)
Ytterligare möjlighet 1
Historik över exekveringsplaner för frÄgor
För att lösa prestandaincidenter Àr det mycket anvÀndbart att ha en historik över förÀndringar i exekveringsplanerna för frÄgor.
För att lagra historiken anvÀnds en service-tabell log_query. Tabellens fylls vid analysen av den laddade loggfilen frÄn PostgreSQL. Eftersom loggfilen, till skillnad frÄn vyerna pg_stat_statements, innehÄller den fullstÀndiga texten med vÀrdena för körningsparametrarna, istÀllet för normaliserad text, finns det möjlighet att registrera inte bara tid och varaktighet för frÄgor, utan ocksÄ spara exekveringsplaner vid den aktuella tidpunkten.
Ytterligare möjlighet 2
Kontinuerlig process för prestandaförbÀttring
Ăvervakning av enskilda frĂ„gor Ă€r i allmĂ€nhet inte avsedd för att lösa problemet med stĂ€ndig förbĂ€ttring av databasens prestanda som helhet, eftersom den kontrollerar och löser prestandaĂ€renden endast för enskilda frĂ„gor. Men metoden kan utvidgas och övervakningen kan anpassas för alla databaser.
För detta behöver vi införa ytterligare prestandamÀtningar:
- Under de senaste dagarna
- För grundperioden
Skriptet vÀljer frÄgor frÄn visningen pg_stat_statements i databasen och jÀmför vÀrdet av max_time med det genomsnittliga vÀrdet av max_time, i det första fallet under de senaste dagarna eller under en vald tidsperiod (baseline), i det andra fallet.
SÄledes kommer en varning automatiskt att genereras vid prestandaförsÀmring för vilken frÄga som helst, utan manuell analys av rapporter.
Vad har syntes med detta att göra?
I den beskrivna metoden, som antas av syntesmetoden - genom att förbÀttra individuella delar av systemet, förbÀttrar vi systemet som helhet.
- FrÄgan som databasen utför - tes
- Den Àndrade frÄgan - antites
- Ăndring av systemets tillstĂ„nd - syntes

Utveckling av systemet
- Uppbyggnad av insamlad statistik genom att lÀgga till historik för systemvisningen pg_stat_activity
- Utökning av insamlad statistik genom att lÀgga till historik för statistiken för specifika tabeller som deltar i frÄgorna
- Integration med övervakningssystemet i molnet AWS
- Och nÄgot mer kan vi komma pÄ...
KĂ€lla: habr.com
