Linux tuning for at forbedre PostgreSQL-ydeevne. Ilya Kosmodemyansky

OversĂŠttelse af Ilya Kosmodemyanskys foredrag fra 2015 "Linux tuning for at forbedre PostgreSQL-ydeevne"

Disclaimer: Jeg bemĂŠrker, at dette foredrag er dateret til november 2015 – der er gĂ„et mere end 4 Ă„r, og der er sket meget siden. Den version, der omtales i foredraget, 9.4, er ikke lĂŠngere understĂžttet. I de forlĂžbne 4 Ă„r er der blevet udgivet 5 nye versioner af PostgreSQL og 15 nye versioner af Linux-kernen. Hvis vi omskriver disse afsnit, vil resultatet blive et helt andet foredrag. Men her gennemgĂ„s den fundamentale tuning af Linux for PostgreSQL, som stadig er relevant i dag.

Linux tuning for at forbedre PostgreSQL-ydeevne. Ilya Kosmodemyansky


Afspil video

Mit navn er Ilya Kosmodemyanski. Jeg arbejder for PostgreSQL-Consulting, og nu vil jeg fortĂŠlle en smule om, hvad man skal gĂžre med Linux i forhold til databaser generelt og PostgreSQL specifikt, da principperne er ret ens.

Hvad vil jeg tale om? Hvis du arbejder med PostgreSQL, skal du til en vis grad vĂŠre UNIX-administrator. Hvad betyder det? Hvis vi sammenligner Oracle og PostgreSQL, skal man i Oracle vĂŠre 80 % DBA databaseadministrator og 20 % Linux-administrator.

Med PostgreSQL er det lidt mere kompliceret. Med PostgreSQL skal man have en meget bedre forstÄelse af, hvordan Linux fungerer. Og samtidig skal man fÞlge med i udviklingen, fordi der i den seneste tid er kommet ret mange opdateringer. Nye kerner bliver udgivet, nye funktioner tilfÞjes, ydeevnen forbedres osv.

Hvorfor taler vi om Linux? Det er ikke blot fordi vi er til Linux-konferencen i St. Petersborg, men fordi det i moderne forhold er en af de mest hensigtsmĂŠssige operativsystemer til drift af databaser generelt og PostgreSQL specifikt – det er Linux. DesvĂŠrre udvikler FreeBSD sig i en ret underlig retning, hvilket vil medfĂžre problemer hvad angĂ„r ydeevne og mange andre ting. Ydeevnen af PostgreSQL pĂ„ Windows er helt klart et sĂŠrskilt, alvorligt emne, fordi Windows ikke har den delte hukommelse, som UNIX har, og hele PostgreSQL er afhĂŠngig af det, da det er et multiprocessystem.

Og eksotiske systemer som Solaris tror jeg i mindre grad interesserer folk, sÄ lad os komme videre.

Linux tuning for at forbedre PostgreSQL-ydeevne. Ilya Kosmodemyansky

Moderne Linux-distributioner har mere end 1.000 syctl-parametre, afhÊngigt af hvordan kernen er bygget. Hvis vi ogsÄ ser pÄ forskellige konfigurationer, kan man justere mange aspekter. Der er parametre for filsystemer og hvordan man monterer dem. Hvis der er spÞrgsmÄl om, hvordan man starter: hvad man skal aktivere i BIOS, hvordan man konfigurerer hardware osv.

Det er et meget stort emne, som man kan tale om i flere dage, og ikke bare i en kort prÊsentation, men jeg vil nu fokusere pÄ vigtige punkter, som hvordan man undgÄr de faldgruber, der med sikkerhed vil forhindre en god brug af databasen pÄ Linux, hvis man ikke retter dem. Og en vigtig detalje er, at mange parametre som standard ikke er indstillet til de indstillinger, der er korrekte for databasen. Det vil sige, at den som standard vil fungere dÄrligt eller slet ikke fungere.

Linux tuning for at forbedre PostgreSQL-ydeevne. Ilya Kosmodemyansky

Hvilke traditionelle tuning mÄl findes der i Linux? Jeg tÊnker, at eftersom I alle har med administration af Linux at gÞre, sÄ behÞver jeg nÊppe forklare, hvad mÄl er.

Man kan tune:

  • CPU.
  • Hukommelse.
  • Lager.
  • Andet. Dette vil vi tale om til sidst som en afslutning. Selv for eksempel sĂ„danne parametre som energisparepolitikken kan pĂ„ en meget uforudsigelig og ikke sĂŠrlig behagelig mĂ„de pĂ„virke prĂŠstationen.

Linux tuning for at forbedre PostgreSQL-ydeevne. Ilya Kosmodemyansky

Hvad er specifikationen for PostgreSQL og databaser generelt? Problemet er, at man ikke kan tune en enkelt lille skrue og se, at prĂŠstationen er blevet markant bedre.

Ja, der findes sÄdanne skruer, men databasen er kompleks. Den interagerer med alle ressourcerne, som serveren har, og foretrÊkker at interagere fuldt ud. Hvis man ser pÄ de moderne anbefalinger fra Oracle til, hvordan man bruger vÊrts-OS, sÄ er det som i anekdoten om den mongolske astronaut - fodre hunden og rÞre ved ingenting. Giv databasen alle ressourcerne, sÄ klarer databasen selv resten.

I princippet er situationen med PostgreSQL lige sÄ kompleks. Forskellen er, at databasen ikke selv kan hente alle ressourcer, sÄ nogle steder skal det hÄndteres pÄ Linux-niveau.

Hovedideen er ikke at vÊlge et enkelt mÄl og begynde at tune det, for eksempel hukommelse, CPU eller noget i den stil, men at analysere arbejdsbelastningen og forsÞge at forbedre gennemlÞbsomrÄdet maksimalt, sÄ den arbejdsbyrde, som de dygtige programmÞrer har skabt for os, inklusive vores brugere, kan passere gennem databasen sÄ effektivt som muligt.

Linux tuning for at forbedre PostgreSQL-ydeevne. Ilya Kosmodemyansky

Her er et billede til forklaring af, hvad det er. Der er en Linux OS-buffer og der er delt hukommelse samt delte buffere i PostgreSQL. I modsÊtning til Oracle arbejder PostgreSQL kun direkte gennem kernens buffer, dvs. for at en side fra disken kan komme ind i dens delte hukommelse, skal den passere gennem kernel-bufferen, og ligesÄdan tilbage.

Under dette system lever diskene. Jeg har tegnet det som diske. I virkeligheden kan der vĂŠre en RAID-controller osv.

Og denne input-output sker pÄ den ene eller den anden mÄde gennem dette.

PostgreSQL er en klassisk database. Indeni findes der sider. Og al input-output sker ved hjĂŠlp af sider. Vi lĂžfter blokke op i hukommelsen ved hjĂŠlp af sider. Hvis der ikke er sket noget, og vi blot har lĂŠst dem, vil de gradvist fra denne cache, fra de delte buffere, synke tilbage til disken.

Hvis vi har Êndret noget et sted, vil hele siden blive markeret som snavset. Jeg har markeret dem med blÄt her. Og det betyder, at denne side skal synkroniseres med det blokerede lager. Dvs. nÄr vi har gjort den snavset, har vi lavet en post i WAL. Og pÄ et eller andet tidspunkt opstÄr et fÊnomen kaldet checkpoint. Og i denne log blev der skrevet information om, at det skete. Det betyder, at alle snavsede sider, der var her pÄ dette tidspunkt i de delte buffere, blev synkroniseret med disken i lageret ved hjÊlp af fsync gennem kernel-buffer.

Hvad er formÄlet med det? Hvis der opstÄr et strÞmsvigt, vil vi ikke have en situation, hvor alle data gÄr tabt. Den persistente hukommelse, som vi har fÄet at vide om, er stadig teoretisk i databaser - det er en lysende fremtid, som vi selvfÞlgelig strÊber efter, og som vi godt kan lide, men indtil videre lever de stadig 20 Är bagud. Og vi skal selvfÞlgelig holde Þje med det.

Og opgaven med at maksimere bÄndbredden er at justere pÄ alle disse stadier, sÄ det hele fungerer hurtigt. Den delte hukommelse er primÊrt sidecachen. I PostgreSQL sender vi en select-anmodning om noget, han henter disse data fra disken. De kommer ind i de delte buffere. Derfor, for at det skal fungere bedre, skal der vÊre meget hukommelse.

For everything to work well and quickly, you need to correctly configure the operating system at all stages. Additionally, you must choose balanced hardware, because if there is an imbalance somewhere, you could have a lot of memory, but it will not operate at adequate speed.

Let's take a look at each of these points.

Linux tuning for at forbedre PostgreSQL-ydeevne. Ilya Kosmodemyansky

To ensure these pages move back and forth faster, we need to achieve the following:

  • Firstly, we need to work more efficiently with memory.
  • Secondly, the transition when pages move from memory to disk should be more efficient.
  • And thirdly, the disks must be good.

If you have 512 GB of RAM in serveren and all of this ultimately connects to a SATA hard drive without any cache, the entire database server will turn not just into a pumpkin, but into a pumpkin with a SATA interface. You will hit this directly. And nothing will save you.

Linux tuning for at forbedre PostgreSQL-ydeevne. Ilya Kosmodemyansky

Regarding the first point with memory, there are three things that can greatly complicate life.

The first of these is NUMA. NUMA is designed to improve performance. Depending on the workload, different things can be optimized. In its new current form, it is not very good for applications like databases that extensively use page cache shared buffers.

Linux tuning for at forbedre PostgreSQL-ydeevne. Ilya Kosmodemyansky

In short, how do you know something is wrong with NUMA? You have some unpleasant glitches, suddenly some CPU is overloaded. Meanwhile, you analyze queries in PostgreSQL and see that there is nothing similar there. These queries should not consume CPU so intensively. It can take a long time to catch this. It’s easier to use the right recommendation from the start on how to configure NUMA for PostgreSQL.

Linux tuning for at forbedre PostgreSQL-ydeevne. Ilya Kosmodemyansky

What is actually happening? NUMA stands for Non-Uniform Memory Access. What is its essence? You have a CPU, and next to it is its local memory. And this memory interconnect can access memory from other CPUs.

If you run numactl --hardware, you will get a long output. Among other things, there will be a field for distances. There will be numbers - 10-20, something like that. These numbers represent the number of hops to access and use that remote memory locally. In principle, it’s a good idea. It significantly improves performance under certain loads.

Forestil dig, at du har en CPU, der fĂžrst forsĂžger at bruge sit lokale hukommelse, og derefter forsĂžger at hente anden hukommelse via interconnect til noget. Og pĂ„ denne CPU kommer hele din page cache fra PostgreSQL – hvor mange gigabyte det nu er. Du fĂ„r altid den vĂŠrste situation, fordi der normalt er lidt hukommelse direkte i denne hukommelsesmodul. Al hukommelse, der betjenes, gĂ„r gennem disse interconnects. Det bliver langsomt og trist. Og du har en processor, der betjener denne node, der konstant er overbelastet. Og adgangstiden til denne hukommelse er dĂ„rlig og langsom. Det er den situation, du ikke Ăžnsker, hvis du bruger det til en database.

Derfor er en mere korrekt lÞsning for databasen, at operativsystemet Linux overhovedet ikke ved, hvad der foregÄr. SÄ det vil tilgÄ hukommelsen som det skal.

Hvorfor er det sĂ„dan? Tilsyneladende burde det vĂŠre omvendt. Det sker af den enkle grund, at vi har brug for meget hukommelse til page cache – flere titusinder, hundreder af gigabyte.

Og hvis vi har allokeret det hele og cached vores data der, vil gevinsten ved at bruge cachen vÊre vÊsentligt stÞrre end gevinsten ved sÄdan en snedig tilgang til hukommelsen. Og pÄ den mÄde vil vi vinde uforholdsmÊssigt i forhold til, at vi mere effektivt vil tilgÄ hukommelsen ved at bruge NUMA.

Derfor er der i Ăžjeblikket to tilgange, indtil den lysere fremtid kommer, og databasen selv kan finde ud af, hvilke CPU'er den arbejder med, og hvor den skal hente hvad.

Linux tuning for at forbedre PostgreSQL-ydeevne. Ilya Kosmodemyansky

Derfor er den rigtige tilgang helt at deaktivere NUMA, for eksempel ved genstart. I de fleste tilfÊlde er gevinsterne sÄ store, at spÞrgsmÄlet om, hvad der er bedre, slet ikke opstÄr.

Der er en anden mulighed. Vi bruger den oftere end den fÞrste, fordi nÄr en kunde henvender sig til os for support, er det en stor sag for dem at genstarte serveren. Der er forretning, der kÞrer der. Og de oplever problemer pÄ grund af NUMA. Derfor prÞver vi at deaktivere det pÄ mindre invasive mÄder end genstart, men vÊr her omhyggelig med at kontrollere, at det virkelig er blevet deaktiveret. For som erfaringen viser, fungerer det fint at deaktivere NUMA for PostgreSQL's overordnede proces, men det er ikke nÞdvendigvis sikkert, at det vil virke. Vi skal kontrollere og sikre, at det virkelig er blevet deaktiveret.

Der er et godt indlÊg af Robert Haas. Han er en af udviklerne til PostgreSQL. En af de centrale udviklere bag alle de lavniveau komponenter. Hvis man fÞlger linksene i dette indlÊg, beskriver de flere farverige historier om, hvordan NUMA har gjort livet svÊrt for folk. Tag et kig, gennemgÄ tjeklisten for systemadministratorer over, hvad der skal konfigureres pÄ serveren, sÄ vores database fungerer godt. Disse indstillinger skal noteres og kontrolleres, fordi ellers vil det ikke gÄ sÄ godt.

BemÊrk, at dette gÊlder for alle de indstillinger, jeg vil tale om. Men normalt samles databaser i master-slave mode for redundans. Glem ikke at foretage disse indstillinger pÄ slave-serveren, for pÄ et tidspunkt vil der opstÄ en fejl, og du vil skifte til slave, som sÄ bliver master.

I tilfÊlde af nÞdssituation, nÄr alt ser skidt ud, ringer telefonen konstant, og chefen kommer styrtende med en stor stok, vil du ikke have tid til at tÊnke pÄ at kontrollere. Og resultaterne kan vÊre meget triste.

Linux tuning for at forbedre PostgreSQL-ydeevne. Ilya Kosmodemyansky

NÊste punkt er huge pages. Huge pages er svÊre at teste isoleret, og der er egentlig ikke megen mening i det, selvom der findes benchmarks, der kan gÞre det. De kan let findes pÄ nettet.

Hvad er meningen? Du har en server, der ikke er sĂŠrlig dyr, og som har meget RAM, for eksempel mere end 30 GB. Du bruger ikke huge pages. Det betyder, at du unĂŠgteligt har overhead ved hukommelsesbrugen. Og det overhead er langtfra det mest behagelige.

Linux tuning for at forbedre PostgreSQL-ydeevne. Ilya Kosmodemyansky

Hvorfor er det sÄdan? Hvad sker der? Operativsystemet tildeler hukommelse i smÄ bidder. Det er praktisk, det er sÄdan, det historisk har vÊret. Og hvis man gÄr i dybden, skal OS konvertere virtuelle adresser til fysiske. Og det er ikke den nemmeste proces, sÄ OS cacher resultatet af denne operation i Translation Lookaside Buffer (TLB).

Da TLB er en cache, opstÄr der alle de problemer, der er forbundet med caching. For det fÞrste, hvis du har meget RAM, der er tildelt i smÄ bidder, sÄ bliver bufferen meget stor. Og hvis cachen er stor, tager det lÊngere tid at sÞge i den. Overheadet er betydeligt, og det optager plads, dvs. noget unÞdvendigt bruger RAM.

Jo mere cachen vokser i en sÄdan situation, jo stÞrre er chancen for cache misses. Og effektiviteten af denne cache falder hurtigt med stÞrre stÞrrelse. Derfor har operativsystemer udviklet en simpel tilgang. I Linux har denne metode lÊnge vÊret anvendt. I FreeBSD er det for nylig blevet introduceret. Men vi taler om Linux. Det er huge pages.

Og her skal det bemÊrkes, at idéen om huge pages oprindeligt blev fremfÞrt af fÊllesskaber, der inkluderede Oracle og IBM, dvs. producenter af databaser tÊnkte grundigt over, at dette ville vÊre nyttigt, ogsÄ for databaser.

Linux tuning for at forbedre PostgreSQL-ydeevne. Ilya Kosmodemyansky

Og hvordan fÄr man det til at fungere med PostgreSQL? For det fÞrste skal huge pages vÊre aktiveret i Linux-kernen.

For det andet skal de angives eksplicit med sysctl parameteren - hvor mange der skal vÊre. Tallene her stammer fra en gammel server. Du kan beregne, hvor mange shared buffers du har, sÄ huge pages kan blive indpasset.

Og hvis hele serveren er dedikeret til PostgreSQL, sÄ er et godt udgangspunkt at afsÊtte enten 25 % af den samlede RAM til shared buffers eller 75 %, hvis du er sikker pÄ, at din database vil passe ind i de 75 %. Dette er dit fÞrste udgangspunkt. Hvis du har 256 GB RAM, sÄ vil 64 GB vÊre til shared buffers. Beregn med en smule margen - hvad denne vÊrdi skal sÊttes til.

FÞr version 9.2 (hvis jeg ikke tager fejl, fra version 8.2) kunne PostgreSQL integreres med huge pages ved hjÊlp af et tredjepartsbibliotek. Og dette skal altid gÞres. For det fÞrste skal kernen kunne allokere huge pages korrekt. Og for det andet skal applikationen, der arbejder med dem, kunne udnytte dem. Det kan ikke gÞres uden videre. Da PostgreSQL allokerede hukommelse i stil med system 5, kunne dette gÞres med libhugetlbfs - det fulde navn pÄ biblioteket.

I version 9.3 forbedrede vi PostgreSQL's ydeevne ved hÄndtering af hukommelse og opgav system 5 metoden til hukommelsestildeling. Alle var meget glade, fordi ellers nÄr man prÞver at kÞre to PostgreSQL-instans pÄ én maskine, sÄ siger den, at der ikke er nok delt hukommelse. Og den siger, at man skal justere sysctl. Og der er sÄdan en sysctl, at man skal genstarte osv. Generelt var alle glade. Men hukommelsestildelingen med mmap brÞd brugen af huge pages. De fleste af vores kunder bruger store delte buffere. Og vi anbefalede kraftigt ikke at opgradere til 9.3, fordi overheadet begyndte at tÊlle i gode procenter.

Men community'en lagde mĂŠrke til dette problem og i 9.4 arbejdede de virkelig godt med denne udfordring. I 9.4 blev der introduceret en parameter i postgresql.conf, hvor man kan aktivere try, on eller off.

Try er den mest sikre parameter. Ved opstart af PostgreSQL, nÄr den tildeler delt hukommelse, forsÞger den at fÄ denne hukommelse fra huge pages. Hvis det ikke er muligt, falder den tilbage til almindelig tildeling. Og hvis du bruger FreeBSD eller Solaris, kan du sÊtte try, det er altid sikkert.

Hvis on, starter den simpelthen ikke, hvis den ikke kunne tildele fra huge pages. Her er der – hvem der Ăžnsker hvad. Men hvis du har try, sĂ„ skal du tjekke, at du virkelig har fĂ„et tildelt det, du har brug for, fordi der er mange fejlmarginer. Nu fungerer denne funktion kun pĂ„ Linux.

Endnu et lille bemÊrkning, fÞr vi gÄr videre. Transparent huge pages handler ikke om PostgreSQL endnu. Den kan ikke drage fordel af dem ordentligt. Og med Transparent huge pages for en arbejdsbyrde, der krÊver en stor del delt hukommelse, kommer fordelene kun ved meget store mÊngder. Hvis du har terabyte hukommelse, kan det spille en rolle. Hvis vi taler om mere almindelige anvendelser, nÄr du har 32, 64, 128, 256 GB hukommelse pÄ maskinen, sÄ er almindelige huge pages Ok, og vi deaktiverer bare Transparent.

Linux tuning for at forbedre PostgreSQL-ydeevne. Ilya Kosmodemyansky

Og den sidste ting, der vedrÞrer hukommelse, er ikke direkte relateret til throughput, men den kan virkelig forringe livskvaliteten. Hele bÄndbredden vil lide stÊrkt af, at serveren konstant swappes.

Og det vil vÊre meget ubehageligt i en rÊkke situationer. Den primÊre ubehagelighed er, at adfÊrden i moderne kerner lidt adskiller sig fra de Êldre Linux-kerner. Og dette er noget, man helst vil undgÄ, fordi nÄr vi taler om at arbejde med swap, ender det ikke med en rettidig ankomst af OOM-killeren. Og en OOM-killer, der ikke kommer til tiden og afslutter PostgreSQL, er ubehageligt. Dette fÄr alle til at opdage det, dvs. op til den sidste bruger.

Linux tuning for at forbedre PostgreSQL-ydeevne. Ilya Kosmodemyansky

Hvad sker der? I har en stor mÊngde RAM, alt fungerer godt. Men af en eller anden grund hÊnger serveren i swap og bliver langsom pÄ grund af det. Det virker som om, der er masser af hukommelse, men sÄdan gÄr det.

Linux tuning for at forbedre PostgreSQL-ydeevne. Ilya Kosmodemyansky

Tidligere rÄdgav vi at sÊtte vm.swappiness til nul, dvs. deaktivere swap. Det sÄ ud som om, at 32 GB RAM og de tilsvarende delte buffere var en enorm mÊngde. HovedformÄlet med swap er, at der er et sted at smide en kerne, hvis vi falder fra. Men det blev ikke lÊngere udfÞrt. Og hvad skal man sÄ gÞre med denne kerne? Det er allerede et problem, hvor det ikke er helt klart, hvorfor swap er nÞdvendigt, isÊr i sÄ stort omfang.

Men i nyere, dvs. i de tredje versioner af kernen, er adfÊrden Êndret. Og hvis man sÊtter swap til nul, dvs. slukker det, vil OOM-killeren pÄ et tidspunkt komme, selv med en vis mÊngde RAM tilbage, for at drÊbe de mest intensive forbrugere. Fordi den vil vurdere, at med sÄdan en arbejdsbelastning har vi kun lidt tilbage, og vi vil gÄ ned, dvs. ikke drÊbe et systemprocess, men drÊbe noget mindre vigtigt. Dette mindre vigtige vil vÊre en intens forbruger af delt hukommelse, nemlig postmaster. Og derefter vil det vÊre godt, hvis databasen ikke skal genskabes.

Derfor er standardsÊtningen nu, sÄ vidt jeg husker, for de fleste distributioner omkring 6, dvs. hvornÄr man skal begynde at bruge swap afhÊngigt af hvor meget hukommelse der er tilbage. Vi rÄdgiver nu at sÊtte vm.swappiness = 1, fordi det nÊsten slukker for det, men ikke giver de samme effekter som en uventet ankommet OOM-killer, der afslutter det hele.

Linux tuning for at forbedre PostgreSQL-ydeevne. Ilya Kosmodemyansky

Hvad sker der nu? NÄr vi taler om databases ydeevne og gradvist kommer til diskene, begynder alle at gribe hovedet. For det er en sandhed, som vi har kendt siden barndommen: diske er langsomme, og hukommelse er hurtig. Og alle ved, at der vil vÊre problemer med diskydelsen i databasen.

Det primÊre problem med PostgreSQL's ydeevne, relateret til checkpoint spikes, opstÄr ikke fordi disken er langsom. Det skyldes snarere, at bÄndbredden mellem hukommelse og disk ikke er afbalanceret. Og de kan vÊre ubalancerede pÄ forskellige mÄder. PostgreSQL er ikke konfigureret korrekt, operativsystemet er ikke konfigureret, hardwaren er ikke korrekt, og hardwaren er forkert. Dette problem opstÄr kun, hvis alt fungerer som det skal, dvs. enten er der ingen belastning, eller indstillingerne og hardwaren er godt tilpasset.

Linux tuning for at forbedre PostgreSQL-ydeevne. Ilya Kosmodemyansky

Hvad er det, og hvordan ser det ud? Normalt har folk, der arbejder med PostgreSQL, vĂŠret igennem dette flere gange. Jeg vil forklare. Som jeg sagde, laver PostgreSQL periodisk checkpoints for at overfĂžre de “beskidte” sider fra den delte hukommelse til disken. Hvis vi har en stor mĂŠngde delt hukommelse, sĂ„ begynder checkpoint at pĂ„virke disken intensivt, fordi det overfĂžrer disse sider via fsync. Det kommer ind i kernel buffer og skrives til diskene med fsync. Og hvis omfanget af dette er stort, kan vi observere en ubehagelig effekt, nemlig en meget hĂžj diskudnyttelse.

Her har jeg to billeder. Jeg vil lige forklare, hvad det er. Det er to tidskorrelerede grafer. Den fÞrste graf viser diskudnyttelsen. Her nÄr den nÊsten op pÄ 90 % pÄ dette tidspunkt. Hvis din databaseserver har fysiske diske med en RAID-controller, og udnyttelsen nÊrmer sig 90 %, er det dÄrlige nyheder. Det betyder, at hvis det fortsÊtter, vil det nÄ 100, og ind- og uddata vil stoppe.

Hvis du har et diskarray, er historien lidt anderledes. Det afhĂŠnger af, hvordan det er konfigureret, hvad slags array det er osv.

Samtidig er her konfigureret en grafik fra den interne PostgreSQL-visning, der viser, hvordan checkpoint-processen forlÞber. Den grÞnne farve viser, hvor mange buffere, disse 'snuskede' sider, der i Þjeblikket kom til dette checkpoint for synkronisering. Og det vigtigste, man her skal vide. Vi kan se, at der er kommet mange sider ind, og pÄ et tidspunkt ramte vi grÊnsen, dvs. vi har skrevet og skrevet, og det er tydeligt, at diskdrevssystemet er meget optaget. Og vores checkpoint har en stor pÄvirkning pÄ disken. Ideelt set burde situationen se mere sÄdan ud, dvs. vi burde have haft mindre skrivning her. Og vi kan justere indstillingerne for at sikre, at det fortsÊtter sÄdan. Det vil sige, at udnyttelsen er lille, men der er stadig noget, vi skriver.

Hvad skal der til for at overvinde dette problem? Hvis IO er stoppet under databasen, betyder det, at alle brugere, som forsĂžger at udfĂžre deres forespĂžrgsler, vil skulle vente.

Linux tuning for at forbedre PostgreSQL-ydeevne. Ilya Kosmodemyansky

Set fra et Linux-perspektiv, hvis du har et godt hardware, har konfigureret det korrekt, og har sat PostgreSQL op, sÄ den sjÊldnere udfÞrer disse checkpoints og spredte dem over tid, sÄ falder du tilbage til de standardparametre, der findes i Debian. For de fleste Linux-distributioner ser situationen sÄdan her ud: vm.dirty_ratio=20, vm.dirty_background_ratio=10.

Hvad betyder det? Siden kerne 2.6 er der en demon, der hÄndterer flushing. Pdglush, afhÊngigt af hvilken der anvendes, der beskÊftiger sig med baggrunds-kasseren af snuskede sider fra kernel-bufferen og kasserer, nÄr det er nÞdvendigt at kassere snuskede sider, nÄr baggrunds-kasseringen ikke lÊngere hjÊlper.

HvornÄr opstÄr baggrunden? NÄr 10 % af al den tilgÊngelige RAM, der er pÄ serveren, er optaget af snuskede sider i kernel-bufferen, kaldes der en specifik funktion til at kassere i baggrunden. Hvorfor er den baggrunds? Den tager som parameter, hvor mange sider der skal kasseres. Og eksempelvis kasserer den N sider. Og i en periode gÄr denne enhed i dvale. Og sÄ kommer den tilbage og kasserer et bestemt antal sider igen.

Det er en ganske enkel sag. Her er opgaven som med en swimmingpool, hvor den ene rÞv fyldes, mens den anden tÞmmes. Vores checkpoint kom, og hvis den sendte fÄ snuskede sider til kassering, sÄ vil pgflush forsigtigt fordele det hele fra kernel-bufferen.

Hvis disse beskidte sider fortsÊtter med at opbygge sig, nÄr de nÄr op pÄ 20 %, vil operativsystemet prioritere at skrive dem til disk, fordi strÞmmen kan gÄ, og vi vil ende i problemer. Vi vil miste disse data, for eksempel.

Hvad er trikset? Trikset er, at disse parametre i den moderne verden, 20 og 10 % af den samlede RAM i maskinen, langt fra er tilstrĂŠkkelige i forhold til kapaciteten af ethvert disk system, du har.

Forestil dig, at du har 128 GB RAM. 12,8 GB kommer til dit disksystem. Uanset hvilken cache eller array du har, kan de ikke hÄndtere sÄ meget.

Linux tuning for at forbedre PostgreSQL-ydeevne. Ilya Kosmodemyansky

Derfor anbefaler vi, at disse tal straks tilpasses dit RAID-kontrols muligheder. Her er der straks givet en anbefaling til en controller, der har 512 MB cache.

Det regnes meget enkelt. Man kan sÊtte vm.dirty_background i bytes. Og disse indstillinger ophÊver de to foregÄende. Hvis der er en ratio som standard, eller hvis de, der er i bytes, er aktiveret, vil dem, der er i bytes, virke. Men da jeg er DBA-konsulent og arbejder med forskellige kunder, prÞver jeg at vÊre forsigtig, og derfor, hvis det er i bytes, sÄ er det i bytes. Ingen har givet nogen garanti for, at en god admin ikke tilfÞrer mere RAM til serveren, genstarter den, mens tallet forbliver det samme. Bare beregn disse tal for at sikre, at alt passer.

Hvad sker der, hvis du ikke passer ind? Jeg har skrevet, at al flushing stopper effektivt, men i virkeligheden er det en figurativ talemÄde. Operativsystemet har et stort problem - det har mange beskidte sider, sÄ den effektive I/O stopper, der genereres af dine klienter, dvs. en applikation er til stede for at sende en SQL-forespÞrgsel til databasen og venter. Enhver I/O til den - i laveste prioritet, fordi databasen er optaget af checkpoint. Og hvornÄr det vil vÊre fÊrdigt, er helt uforudsigeligt. Og nÄr du har nÄet ikke-baggrunds-flushing, betyder det, at al din I/O er optaget af det. Og indtil det er fÊrdigt, kan du ikke gÞre noget.

Der er ogsÄ to vigtige punkter, der gÄr ud over denne prÊsentation. Disse indstillinger skal matche indstillingerne i postgresql.conf, dvs. checkpoint-indstillinger. Og dit disksystem skal vÊre korrekt konfigureret. Hvis du har cache pÄ RAID, skal der vÊre et batteri pÄ det. Folk kÞber RAID med god cache uden batteri. Hvis du har SSD i RAID, skal de vÊre serverklasse, der skal vÊre kondensatorer pÄ. Her er en detaljeret tjekliste. PÄ dette link findes min prÊsentation om, hvordan man konfigurerer diskperformance i PostgreSQL. Der er alle disse tjeklister.

Linux tuning for at forbedre PostgreSQL-ydeevne. Ilya Kosmodemyansky

Hvad andet kan virkelig komplicere livet? Det er to parametre. De er relativt nye. De kan som standard vÊre aktiveret i forskellige applikationer. Og de kan gÞre livet mindst lige sÄ besvÊrligt, hvis de er forkert aktiveret.

Linux tuning for at forbedre PostgreSQL-ydeevne. Ilya Kosmodemyansky

Der er to relativt nye funktioner. De er allerede dukket op i tredje kerner. Det er sched_migration_cost i nanosekunder og sched_autogroup_enabled, som som standard er en.

Og hvordan ÞdelÊgger de livet? Hvad er sched_migration_cost? Linux scheduler kan migrere en proces fra en CPU til en anden. Og for PostgreSQL, som udfÞrer forespÞrgsler, er migration til en anden CPU helt uforstÄeligt. Set fra operativsystemets perspektiv, nÄr du skifter vinduer mellem openoffice og terminalen, kan det vÊre godt, men for databasen er det meget dÄrligt. Derfor er en fornuftig politik at sÊtte migration_cost til en stor vÊrdi, mindst et par tusind nanosekunder.

Hvad vil det betyde for scheduler? Det vil tro, at i denne periode er denne proces stadig 'hot'. Det vil sige, hvis du har en lang transaktion, som beskÊftiger sig med noget, vil scheduler forstÄ dette. Han vil tro, at sÄ lÊnge timeout ikke er passeret, er der ikke behov for at migrere denne proces. Hvis processen udfÞrer noget, vil den ikke blive migreret, den vil roligt fortsÊtte pÄ den CPU, der er tildelt. Og resultatet bliver fremragende.

Det andet punkt er autogroup. Der er en god idĂ© til specifikke arbejdsbelastninger, der ikke har noget at gĂžre med moderne databaser – at gruppere processer efter den virtuelle terminal, de er startet fra. Det er praktisk til visse opgaver. I praksis er PostgreSQL et multiprocessing-system med prefork, der starter fra Ă©t terminalvindue. Du har lock writer, checkpoint, og alle dine klientforespĂžrgsler vil blive grupperet pĂ„ Ă©n scheduler, pĂ„ Ă©n CPU. Og de vil alle vente sammen pĂ„, at den bliver ledig, hvilket gĂžr, at de forstyrrer hinanden og optager ressourcen lĂŠngere. Denne situation er slet ikke nĂždvendig ved sĂ„dan en belastning, og derfor skal det slukkes.

Linux tuning for at forbedre PostgreSQL-ydeevne. Ilya Kosmodemyansky

Min kollega Aleksej Lesovskij har lavet tests med et enkelt pgbench, hvor han forÞgede migration_cost med en orden og slukkede autogroup. Forskellen pÄ dÄrlig hardware var nÊsten 10 %. Der er en diskussion i PostgreSQL-listen, hvor folk prÊsenterer resultater om, hvordan sÄdanne Êndringer pÄ forespÞrgsels hastigheden pÄvirkede 50 %. Der er mange sÄdanne historier.

Linux tuning for at forbedre PostgreSQL-ydeevne. Ilya Kosmodemyansky

Og til sidst om strÞmbesparende politik. Det er godt, at Linux nu kan bruges pÄ en bÊrbar computer. Og den skulle angiveligt have et godt batteriforbrug. Men pludselig viser det sig, at det samme ogsÄ kan vÊre tilfÊldet pÄ servere.

Desuden, hvis du lejer servere fra en eller anden host, sÄ sÞrger de "venlige" hoster ikke for, at du har en bedre ydeevne. Deres mÄl er at maksimere udnyttelsen af deres hardware. Derfor kan de som standard have aktiveret bÊrbar energisparetilstand pÄ operativsystemet.

Hvis du bruger dette pĂ„ en server med en database under intensiv belastning, er dit valg – acpi_cpufreq + performance. Selv med ondemand vil der allerede vĂŠre problemer.

Intel_pstate er allerede en lidt anden driver. Og nu gives der prĂŠference til denne, da den er nyere og fungerer bedre.

Derfor bþr governor vére performance. Ondemand, powersave og alt det andet – det er ikke for dig.

Resultaterne fra explain analyze i PostgreSQL kan variere med flere ordrer, hvis du aktiverer powersave, fordi CPU'en under databasen vil blive planlagt pÄ en helt uforudsigelig mÄde.

Disse indstillinger kan vĂŠre aktiveret som standard. Tjek om de er aktiveret som standard. Det kan vĂŠre en virkelig stor udfordring.

Linux tuning for at forbedre PostgreSQL-ydeevne. Ilya Kosmodemyansky

Og til sidst vil jeg gerne sige tak til gutterne fra vores DBA-team PosgreSQL-Consulting, sÊrligt Maks Boguk og Alexey Lesovsky, som hver dag arbejder hÄrdt pÄ dette omrÄde. Vi forsÞger at gÞre det sÄ godt som muligt for vores kunder, sÄ deres systemer fungerer optimalt. Det er lidt ligesom med instrukser for luftfartssikkerhed. Her stÄr alt skrevet med blod. Hver eneste skrue er blevet opdaget under forskellige problemer. Jeg deler dem gladeligt med jer.

SpÞrgsmÄl:

Tak! Hvis en virksomhed for eksempel Þnsker at spare penge og placere databasen og logs for applikationen pÄ én server, eller hvis virksomheden fÞlger den moderne tendens med mikrotjenestearkitekturer, hvor PostgreSQL kÞrer i en container. Hvad er tricket? Sysctl pÄvirker globalt hele kernen. Jeg har ikke hÞrt, at sysctl bliver virtualiseret, sÄ de fungerer separat i containeren. Der er kun cgroup, og der er kun kontrol pÄ dele. Hvordan kan man leve med det? Eller hvis du Þnsker ydeevne, sÄ kÞr PostgreSQL pÄ en dedikeret server og optimér den?

Vi har svaret pÄ dit spÞrgsmÄl pÄ cirka tre mÄder. Hvis det ikke handler om en dedikeret server, der kan optimeres osv., sÄ slap af, det vil fungere fint uden de indstillinger. Hvis du oplever en belastning, der krÊver disse indstillinger, sÄ vil du komme til den dedikerede server, fÞr du behÞver disse indstillinger.

Hvad er problemet? Hvis det er en virtuel maskine, vil du sandsynligvis have mange problemer, f.eks. med, at latency pÄ de fleste virtuelle maskiner er ret inkonsistent. Selv hvis diskens bÄndbredde er god, kan en enkelt mislykket I/O-transaktion, der ikke pÄvirker den gennemsnitlige bÄndbredde nÊvnevÊrdigt, ske under et checkpoint eller under skrivning til WAL, hvilket kan medfÞre store problemer for databasen. Og du vil lÊgge mÊrke til det, fÞr du stÞder ind i disse problemer.

Hvis du har NGINX pÄ den samme server, vil du ogsÄ have det samme problem. Den vil kÊmpe om delt hukommelse. Og du vil ikke nÄ de problemer, der er beskrevet her.

Men pĂ„ den anden side vil nogle af disse parametre stadig vĂŠre relevante for dig. For eksempel at sĂŠtte dirty_ratio med sysctl, sĂ„ det ikke bliver sĂ„ ekstremt – det vil hjĂŠlpe uanset hvad. PĂ„ en eller anden mĂ„de vil du have interaktion med disken. Og det vil ske efter en forkert skema. Det er generelt standard de parametre, jeg viste. Og i hvert fald er det bedre at ĂŠndre dem.

Der kan vére problemer med NUMA. VmWare fungerer for eksempel godt med NUMA med helt modsatte indstillinger. Og her skal man vélge – er det en fysisk server eller ikke.

Jeg har et spÞrgsmÄl relateret til Amazon AWS. De har forudkonfigurerede billeder. Et af dem hedder Amazon RDS. Er der nogle tilpassede indstillinger for deres operativsystem?

Der findes indstillinger, men det er andre indstillinger. Her konfigurerer vi operativsystemet fra perspektivet af, hvordan databasen vil bruge dette. Og der er parametre, der bestemmer, hvor vi skal gÄ nu, sÄdan en shaping. AltsÄ, vi har brug for sÄ mange ressourcer, og vi vil forbruge dem nu. Efter dette tilslutter Amazon RDS disse ressourcer, og derefter falder ydeevnen. Der er sÊrskilte historier om, hvordan folk begynder at eksperimentere med dette. Nogle gange med ret stor succes. Men det har ikke noget at gÞre med OS-indstillingerne. Det er som en slags hacking af skyen. Det er en anden historie.

Hvorfor giver Transparent huge pages ikke effekt sammenlignet med Huge TLB?

De giver ikke. Dette kan forklares pĂ„ mange mĂ„der. Men i virkeligheden giver de slet ikke effekten. Hvad er historien om PostgreSQL? Det allokerer en stor del delt hukommelse ved opstart. Om de er transparente eller ikke – det er fuldstĂŠndig irrelevant. Det faktum, at de allokeres ved opstart, forklarer alt. Og hvis der er meget hukommelse og det er nĂždvendigt at omkonfigurere shared_memory segmentet, sĂ„ vil Transparent huge pages vĂŠre relevant. Hos PostgreSQL er det simpelthen afsat en enorm del ved opstart, og der sker ikke noget sĂŠrlig derefter. Man kan selvfĂžlgelig bruge dem, men der er en risiko for at fĂ„ beskadiget shared_memory, nĂ„r den skal genallokeres. PostgreSQL ved jo ikke noget om det.

Kilde: habr.com

KĂžb pĂ„lidelig webhosting med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KĂžb pĂ„lidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster