Hvilke målinger for din PostgreSQL-implementering skal du overvåge? Denne serie af blogindlæg har til formål at give et minimalt startsæt af væsentlige overvågningshandlinger, som du bør implementere for at sikre sundheden og stabiliteten af dine Postgres-servere.
Dette er den tredje og sidste del af en blogserie og dækker tabel-, indeks- og systemniveau-metrics. De første et-dækket metrics på klyngeniveau og den anden onecovered-metrics på databaseniveau.
Tabelniveau
Typisk følger data i en database 80-20-reglen. 20 % af tabellerne indeholder det meste af data og er tilgået eller muteret mest. Opsætning af ekstra overvågning kun for disse tabeller kan give indsigt, der er vigtig, men alligevel lav volumen.
Her er nogle metrics på tabelniveau, der er værd at se på:
1. Tabelstørrelse
Den faktiske diskstørrelse, der bruges af tabellen, skal overvåges. I de fleste tilfælde bliver tabellen ved med at vokse, så det er vækstraten, der er mere interessant.
Det er ofte tilfældet, at vækstraten ændrer sig efter udrulningen af en ny version af applikationen, eller en grundlæggende ændring i trafik/belastning/input-mønstre for selve applikationen. Sådanne ændringer skal undersøges, i det mindste for at bekræfte, at den nye hastighed er holdbar af den leverede hardware.
Handling:Overvåg stigningen i tabellens størrelse over hver uge/måned, undersøg pludselige ændringer.
Sådan:
-- returnerer størrelsen for hver tabelSELECT skemanavn || '.' || relname, pg_size_pretty(pg_table_size(skemanavn || '.' || relname)) FRA pg_stat_user_tables;
2. Bordbloat
På grund af Postgres' MVCC-arkitektur ligger ældre versioner af rækker rundt i de fysiske datafiler for hver tabel og kaldes bloat . Operationen for at fjerne forældede rækkeversioner kaldes vakuum . Postgres kører en baggrundsproces kaldet autovacuum , som opfanger kandidattabeller (baseret på konfigurerbare parametre) og støvsuger dem for dig.
Bloat sænker borddriften og spilder diskplads og kan løbe væk selv med autovakuum. Overvågning af oppustethed, som et absolut antal bytes såvel som en procentdel (af døde data i forhold til samlede data), er påkrævet.
Denne metrik kan overvåges enten på individuelt tabelniveau eller som aggregeret på tværs af udvalgte tabeller eller på databaseniveau.
Handling:Overvåg kontinuert tabelbloat som bytes og procent, advars, hvis værdier overstiger en fastsat tærskel, VAKUUM efter behov.
Sådan:
Brug check_postgres orpgmetrics for at få bloat estimater. Se wikien for mere information.
3. Sekventielle scanninger
Når der udføres forespørgsler, som ikke optimalt bruger de tilgængelige indekser, eller hvis de statistiske oplysninger, der er knyttet til en tabel, er for forældede, kan Postgres ende med at skulle gennemgå hver række i tabellen. Dette kaldes en sekventiel scanning , og er ikke særlig ønskværdig i det generelle tilfælde. Det, der ville være bedre at have, er en indeksscanning , hvor rækkerne i en tabel tilgås indirekte via indeksopslag.
PostgreSQL kan fortælle dig, hvor mange gange en tabel blev scannet sekventielt, og hvor mange gange et indeks blev brugt. Du kan bruge dette til at overvåge enten antallet af sekventielle scanninger (hvis du vil undgå dem helt) eller som en procentdel af de samlede scanninger.
Handling:Overvåg løbende den efterfølgende. scanninger tæller eller procent, giver besked hvis værdien overstiger en fastsat tærskel.
Sådan:
-- returnerer nr. af seq. scanninger og procentdelen af seq. scanner for hver tabelSELECT skemanavn || '.' || relname, seq_scan, round(seq_scan::numeric*100/(seq_scan+idx_scan), 1) FROM pg_stat_user_tablesWHERE seq_scan+idx_scan> 0;
Indeksniveau
1. Indeksstørrelse
Indekser kan optage betydelig diskplads. Hvert indeks i en tabel kan potentielt selv have lige så meget diskaftryk som selve tabellen. Det er nyttigt at holde øje med den samlede størrelse af indekser i en database eller indekser af vigtige tabeller, især i implementeringer, hvor indekser kan oprettes gennem automatiske processer.
Urimeligt store indekser kan være på grund af oppustethed eller bare et dårligt designet indeks. I begge tilfælde kan løsning af årsagen (enten ved at genopbygge indekset eller ved at refaktorisere forespørgslen/indekset) give hurtigere forespørgselstider, så det er værd at undersøge store indekser.
Handling:Overvåg den samlede størrelse af interessante indekser over hver uge/måned, undersøg, når de er urimelige.
Sådan:
-- returnerer størrelsen for hvert indexSELECT skemanavn || '.' || indexrelname, pg_size_pretty(pg_total_relation_size(indexrelid)) FRA pg_stat_user_indexes;
2. Indeksbloat
Indekser kan også blive oppustede. Der er alt for mange faktorer, herunder tableworkload, indekstype, Postgres-version og mere, der afgør, hvor oppustet anindex bliver. Oppustede indekser kan bremse indsatser og reducere udseendets ydeevne. Overvåg antallet af indekser som både en absolut værdi (antal bytes) og som en procentdel. Indekser skal genopbygges, når de bliver for oppustede.
Handling:Overvåg løbende indeksbloat som bytes og procent, advare, hvis værdier overstiger en fastsat tærskel.
Sådan:
Brug check_postgres orpgmetrics for at få bloat estimater. Se wikien for mere information.
3. Cache-hitforhold
PostgreSQL cacher hyppigt tilgåede områder af indekser (og også tabeller) i hukommelsen. Hvis du har indstillet dine forespørgsler til ikke at røre tabellerne undtagen for at hente rækker, er næste trin at sikre maksimal cache-residency for de vigtige indekser, der virkelig fremskynder dine forespørgsler.
Cache-udnyttelsen af et indeks kan måles ved cache-hitforholdet, som er procentdelen af blokke af indekset, der blev læst fra cachen til det samlede antal læste blokke.
Handling:Overvåg kontinuerligt cache-hitforholdsprocenten, advare, hvis værdien falder under en fastsat tærskel. Undersøg lave værdier for vigtige indekser.
Sådan:
-- returnerer cache hit-forholdet som en procentdel, for hvert indeks SELECT skemanavn || '.' || indexrelname AS index_name, round(pg_stat_get_blocks_hit(indexrelid)::numeric*100 / pg_stat_get_blocks_fetched(indexrelid), 1) AS cache_hit_ratio FRA pg_stat_user_indexes WHERE pg_stat_get_blocks_relider_BY index_0
Systemniveau
Bortset fra PostgreSQL-metrics er det vigtigt at holde styr på nogle få metrics for den maskine eller VM, du kører din Postgres på. Du kan bruge en hvilken som helst populær overvågningsløsning til dette, eller endda gribe og spore dem selv.
1. Brugt hukommelse
Moderne Linux-systemer har kompleks hukommelsesregnskab. Vi anbefaler at overvåge den "brugte hukommelse", som er den hukommelse, der er tilbage efter at have taget højde for hukommelse markeret somfri , som buffere , som cachelagret , og som plade . Buffere og cache vil give væk under pres, og det samme vil de fleste (typisk over 95%) af pladen.
Den brugte hukommelse skal dog måles over en passende lang periode. Hvis du har batchjobs, rapporter, ETL osv., der kører i weekenden, så vil perioden være en uge. Den reelle metrik, du skal overvåge, er den maksimalt brugte hukommelse i denne periode.
Når din databasestørrelse vokser, har denne værdi typisk en tendens til at krybe op. Du skal sikre, at det maksimale hukommelsesforbrug er inden for en behagelig grænse for tilgængelig hukommelse, f.eks. 60-80 %. Forsømmelse af dette vil medføre, at youranalytics/OLAP-arbejdsbelastninger mislykkes på grund af mangel på hukommelse.
Handling:Overvåg den maksimalt brugte hukommelse over en uge/for nat, advars, hvis den overstiger en fastsat tærskel, genprovision.
Sådan :
Den brugte hukommelse er givet af MemUsed =MemTotal - MemFree - MemBuffers - MemCached - MemSlab
,hvor Mem*
felter er fra /proc/meminfo
. For mere information, se denne RedHat-artikel.
2. Belastningsgennemsnit
Den simple belastningsgennemsnitsværdi er stadig den nemmeste og hurtigste måde at anslå belastningen på en server. Dette gælder især for Postgres-servere, da hver backend er en separat OS-proces, og at have flere af dem i en kørebar tilstand vil øge den gennemsnitlige belastningsværdi.
For en given Postgres-server bør belastningsgennemsnittet forblive inden for et rimeligt interval over en forretningscyklus (som en uge, inklusive batch-job-kørsler).
Handling:Overvåg det maksimale belastningsgennemsnit for hver dag/uge, undersøg stigende tendenser.
Sådan :
1 minut, 5 minutter og 15 minutters belastningsgennemsnit er de første 3 felter på den første linje i filen /proc/loadavg
.
3. Ledig diskplads
Det sidste punkt på vores liste er det mest oplagte at overvåge:mængden af ledig diskplads i hvert filsystem, der bruges af din PostgreSQL-server, inklusive tablespaces, WAL-filmapper, backup-mapper og serverlogfiler. I tilfælde, hvor for mange (100-vis af millioner) filer bliver oprettet i et enkelt filsystem, skal du sikre dig, at det gratis inodetal også overvåges. Mangel på inoder er også rapporteret som lav diskplads.
Handling:Overvåg kontinuerligt ledig diskplads og inodebrug på alle relevante filsystemer, advare, hvis værdier falder under en fastsat tærskel.
Sådan :
Ledig diskplads i et filsystem kan ikke hentes direkte ved at læse nogen fil i /proc
. Du kan bruge stat -f /path/to/mount
eller endda df
for at finde den brugte, ledige og reserverede diskplads til et specifikt, monteret filsystem.
Hurtig reference
Her er en komplet liste over alle de metrics, vi har diskuteret indtil nu i denne serie. Husk, at disse kun er det minimale, mest essentielle sæt af metrics, som du skal overvåge for at opdage, når tingene er ved at gå galt med din PostgreSQL-implementering.
Klyngeniveau
- Transaktions-id-interval
- Antal backends
- Inaktive replikeringspladser
- Backends venter på låse
- Backends i tomgang i transaktionen
- Replikeringsforsinkelse for aktive forbindelser
- Replikeringsforsinkelse for replikeringspladser
- WAL-filantal
- Antal WAL-filer, der er klar til arkivering
Databaseniveau
- Tilsluttede klienter
- Størrelse
- Tabelbloat på tværs af alle borde
- Indeksbloat på tværs af alle indekser
- Langvarende transaktioner
- Deadlocks
- Ældste støvsuger
- Ældste analyse
Tabelniveau
- Tabelstørrelse
- Bordbloat
- Sekventielle scanninger
Indeksniveau
- Indeksstørrelse
- Indeks-bloat
- Cache-hitforhold
Systemniveau
- Brugt hukommelse
- Belastningsgennemsnit
- Fri diskplads
Indsamling af disse metrics
Sektionerne ovenfor giver SQL-sætninger til at udtrække de nødvendige metrics fra en kørende Postgres-server. Hvis du hellere ikke vil skrive scripts selv, så tjek open source-værktøjet pgmetrics. Den kan indsamle metrics ovenfor og mere og rapportere dem i tekst- og JSON-formater.
Du kan sende pgmetrics-rapporterne direkte til vores kommercielle tilbud, pgDash, som gemmer og behandler disse rapporter for at vise grafer og udføre advarsler.