Tolkning av Ilja Kosmodemjanskijs förelÀsning frÄn 2015 "Linux-justering för att förbÀttra PostgreSQL-prestanda"
Ansvarsfriskrivning: Jag vill pĂ„peka att denna förelĂ€sning Ă€r daterad till november 2015 â över 4 Ă„r har passerat och mycket har förĂ€ndrats. Den version av PostgreSQL som diskuteras, 9.4, stöds inte lĂ€ngre. Under de senaste 4 Ă„ren har 5 nya versioner av PostgreSQL slĂ€ppts och 15 nya versioner av Linux-kĂ€rnan. Om vi skulle skriva om dessa delar skulle vi i slutĂ€ndan fĂ„ en annan förelĂ€sning. Men hĂ€r behandlas grundlĂ€ggande tuning av Linux för PostgreSQL som fortfarande Ă€r relevant idag.


Jag heter Ilja Kosmodemjanskij. Jag arbetar pÄ företaget PostgreSQL-Consulting. Nu kommer jag att berÀtta lite om vad man ska göra med Linux med avseende pÄ databaser i allmÀnhet och PostgreSQL i synnerhet, eftersom principerna Àr ganska lika.
Vad kommer vi att diskutera? Om du arbetar med PostgreSQL mÄste du till viss del vara en UNIX-administratör. Vad betyder det? Om vi jÀmför Oracle och PostgreSQL, sÄ mÄste du i Oracle vara 80 % DBA och 20 % Linux-administratör.
Med PostgreSQL Àr det lite mer komplicerat. Med PostgreSQL behöver du ha en mycket bÀttre förstÄelse för hur Linux fungerar. Dessutom mÄste man lite snabbt hÀnga med i utvecklingen, eftersom allt uppdateras ganska kraftigt nu. Nya kÀrnor slÀpps, nya funktioner introduceras, prestandan förbÀttras osv.
Varför pratar vi om Linux? Inte för att vi Ă€r pĂ„ Linux-konferensen i Sankt Petersburg, utan för att i moderna förhĂ„llanden Ă€r en av de mest lĂ€mpliga operativsystemen för anvĂ€ndning med databaser överhuvudtaget och med PostgreSQL i synnerhet â det Ă€r Linux. För tyvĂ€rr utvecklas FreeBSD i en mycket konstig riktning. Och det kommer att bli problem bĂ„de med prestanda och med mĂ„nga andra saker. PostgreSQL:s prestanda pĂ„ Windows Ă€r en helt egen tuff frĂ„ga, vilket beror pĂ„ att Windows inte har samma delade minne som UNIX, och PostgreSQL Ă€r helt beroende av detta eftersom det Ă€r ett flervalsystem.
Och exotiska system som Solaris, tror jag, intresserar en mindre grupp, sÄ lÄt oss köra.

En modern Linux-distribution har mer Àn 1 000 syctl-parametrar, beroende pÄ hur kÀrnan har byggts. Dessutom, om vi ser pÄ andra instÀllningar, finns det mÄnga sÀtt att justera ytterligare. Det finns parametrar för filsystem, hur man ska montera. Om det finns frÄgor om hur man startar: vad man ska aktivera i BIOS, hur man konfigurerar hÄrdvaran osv.
Detta Àr en mycket stor mÀngd information som kan diskuteras i flera dagar, snarare Àn under en kort presentation, men jag kommer nu att fokusera pÄ viktiga saker för att undvika de fallgropar som garanterat kommer att hindra er frÄn att effektivt anvÀnda databasen pÄ Linux om ni inte ÄtgÀrdar dem. Dessutom Àr det viktigt att mÄnga parametrar som standard inte Àr instÀllda pÄ sÄdana instÀllningar som Àr korrekta för databasen. Med andra ord kommer den att fungera dÄligt som standard eller kanske inte alls.

Vilka traditionella tuning-targets finns det i Linux? Jag tror att eftersom ni alla har att göra med Linux-administration, behöver jag inte förklara vad targets Àr.
Det gÄr att tunna:
- CPU.
- Minne.
- Lagring.
- Ăvrigt. Det kommer vi att diskutera i slutet som en dessert. Till och med sĂ„dana parametrar som energisparpolicy kan pĂ„verka prestandan pĂ„ ett mycket oförutsĂ€gbart och obehagligt sĂ€tt.

Vad Àr förhÄllandena för PostgreSQL och för databasen i allmÀnhet? Problemet Àr att man inte kan tunna nÄgon enskild instÀllning och se att prestandan förbÀttras avsevÀrt.
Ja, sĂ„dana instĂ€llningar finns, men databasen Ă€r en komplex enhet. Den interagerar med alla resurser som finns pĂ„ servern och föredrar att interagera maximalt. Om ni ser pĂ„ moderna rekommendationer frĂ„n Oracle om hur man anvĂ€nder vĂ€rd-operativsystemet, sĂ„ blir det som i skĂ€mtet om den mongoliska kosmonauten â ge hunden mat och rör inte vid nĂ„got. LĂ„t databasen ha alla resurser, databasen klarar av att hantera allt sjĂ€lv.
I princip Àr situationen med PostgreSQL exakt den samma, till viss del. Skillnaden Àr att databasen Ànnu inte kan ta alla resurser sjÀlv, det vill sÀga att ibland mÄste man hantera det hela pÄ Linux-nivÄ.
Huvudidén Àr inte att vÀlja en specifik target och börja optimera saker som minne, CPU eller nÄgot liknande, utan att analysera arbetsbelastningen och försöka förbÀttra genomströmningen maximalt sÄ att den belastning som vÄra duktiga programmerare har skapat, inklusive vÄra anvÀndare, effektivt kan passera genom vÄr databas.

HÀr Àr en bild för att förklara vad det handlar om. Det finns en buffert för OS Linux, det finns delat minne och delade buffertar för PostgreSQL. Till skillnad frÄn Oracle arbetar PostgreSQL direkt genom kÀrnbufferten, det vill sÀga, för att en sida frÄn disken ska komma in i dess delade minne mÄste den passera genom kernelbufferten, och exakt samma situation Àr aktuell.
Under detta system finns diskarna. Jag har ritat det som diskar. I verkligheten kan det finnas en RAID-kontroller och sÄ vidare.
Och den hÀr in- och utmatningen sker pÄ ett eller annat sÀtt genom detta.
PostgreSQL Àr en klassisk databas. DÀr inne finns sidor. All in- och utmatning sker via sidor. Vi lyfter blocken till minnet med sidor. Och om inget har hÀnt, om vi bara har lÀst dem, sÄ sjunker de gradvis frÄn denna cache, frÄn de delade buffertarna och hamnar tillbaka pÄ disken.
Om vi har bytt nÄgot, sÄ markeras hela sidan som smutsig. Jag har markerat dem med blÄtt hÀr. Och detta betyder att denna sida mÄste synkroniseras med blocklagringen. NÀr vi gjorde den smutsig gör vi en skrivning i WAL. Och vid nÄgot fantastiskt ögonblick intrÀffar ett fenomen som kallas checkpoint. Information om att den kommit in skrivs in i den loggen. Detta betyder att alla smutsiga sidor som fanns i dessa delade buffertar vid den tidpunkten synkroniserades med lagringsdisken via fsync genom kernelbufferten.
Varför görs detta? Om vi förlorar strömmen fĂ„r vi inte en situation dĂ€r all data försvinner. Den persistenta minnet som alla talar om Ă€r fortfarande i teorin för databaser â det Ă€r en ljus framtid som vi naturligtvis strĂ€var efter och som vi gillar, men hittills lever de fortfarande i minus 20 Ă„r. Och sjĂ€lvklart mĂ„ste man hĂ„lla ögonen pĂ„ allt detta.
Och uppgiften att maximera bandbredden Ă€r att justera i alla dessa steg sĂ„ att data skickas fram och tillbaka snabbt. Dela minnet â det Ă€r frĂ€mst en sidcache. I PostgreSQL skickade vi en select-frĂ„ga för nĂ„got, och den hĂ€mtade dessa data frĂ„n disken. De hamnade i de delade buffrarna. DĂ€rför, för att detta ska fungera bĂ€ttre, bör det finnas mycket minne.
För att allt detta ska fungera bra och snabbt mÄste operativsystemet stÀllas in korrekt i alla steg. Och vÀlja balanserad hÄrdvara, för om det finns obalans nÄgonstans kan ni ha mycket minne, men det kommer att servas med otillrÀcklig hastighet.
Och vi kommer att gÄ igenom varje punkt.

För att dessa sidor ska transporteras fram och tillbaka snabbare behöver vi nÄ följande:
- För det första mÄste vi arbeta mer effektivt med minnet.
- För det andra mÄste denna övergÄng, nÀr sidor frÄn minnet gÄr till disken, vara effektivare.
- Och för det tredje mÄste vi ha bra diskar.
Om ni har 512 GB RAM i servern och allt detta slutligen kommer till en SATA-hÄrddisk utan nÄgot cache, sÄ blir hela databasservern inte bara en pumpa, utan en pumpa med SATA-grÀnssnitt. Ni kommer att stöta pÄ detta direkt. Och inget kommer att rÀdda er.

Vad gÀller den första punkten om minnet sÄ finns det tre saker som kan göra livet mycket svÄrare.
Den första Àr NUMA. NUMA Àr nÄgot som skapades för att förbÀttra prestanda. Beroende pÄ arbetsbelastningen kan olika saker optimeras. I sin nuvarande form Àr den inte sÀrskilt bra för sÄdana applikationer som databaser, som intensivt anvÀnder sidcache och delade buffrar.

Kort sagt. Hur förstÄr man att nÄgot Àr fel med NUMA? Ni har nÄgot obehagligt knakande, plötsligt visar sig nÄgon CPU vara överbelastad. Under tiden analyserar ni frÄgorna i PostgreSQL och ser att det inte finns nÄgot som liknar det. Dessa frÄgor bör inte konsumera CPU sÄ intensivt. Det kan ta tid att fÄnga detta. Det Àr enklare att frÄn början anvÀnda rÀtt rekommendationer för hur man stÀller in NUMA för PostgreSQL.

Vad hÀnder egentligen? NUMA stÄr för Non-Uniform Memory Access. Vad handlar det om? Ni har en CPU, och bredvid den finns dess lokala minne. Och detta minnet kan interconnecta och dra minne frÄn andra CPU:er.
Om ni kör numactl --hardware, sĂ„ fĂ„r du ett stort dokument. Bland annat kommer det att finnas ett fĂ€lt för avstĂ„nd. Det kommer att finnas siffror â 10-20, nĂ„got i den stilen. Dessa siffror Ă€r inget annat Ă€n antalet hopp för att koppla pĂ„ detta avlĂ€gsna minne och anvĂ€nda det lokalt. I princip en bra idĂ©. Det förbĂ€ttrar prestandan vid viss belastning.
TĂ€nk dig nu att du har en CPU som först försöker anvĂ€nda sitt lokala minne, sedan försöker dra in annat minne via interconnecten för nĂ„got. Och hela din page cache för PostgreSQL hamnar pĂ„ den hĂ€r CPU:n â allt, flera gigabyte. Du fĂ„r alltid det vĂ€rsta fallet, eftersom det vanligtvis finns lite minne direkt tillgĂ€ngligt i denna minnesmodul. Och allt minne som anvĂ€nds passerar genom dessa interconnects. Det blir lĂ„ngsamt och sorgligt. Och din processor som hanterar denna nod Ă€r stĂ€ndigt överbelastad. Och Ă„tkomsttiden för detta minne Ă€r dĂ„lig, lĂ„ngsam. Det Ă€r den situationen du inte vill ha om du anvĂ€nder detta för en databas.
DÀrför Àr den mer korrekta lösningen för databasen att operativsystemet Linux överhuvudtaget inte ska veta vad som pÄgÄr dÀr. SÄ att det kan adressera minnet som det gör.
Varför Ă€r det sĂ„? Det verkar som att det borde vara tvĂ€rtom. Det beror pĂ„ en enkel anledning, att vi behöver mycket minne för page cache â tiotals, hundratals gigabyte.
Och om vi har allokart detta och cachat vÄra data dÀr, sÄ kommer vinsten av att anvÀnda cachen att vara avsevÀrt större Àn vinsten av denna snikna minneshantering. Och pÄ sÄ sÀtt kommer vi att tjÀna oproportionerligt mycket i jÀmförelse med att effektivare komma Ät minnet med hjÀlp av NUMA.
DÀrför finns det tvÄ tillvÀgagÄngssÀtt för tillfÀllet, tills en ljus framtid kommer och databasen kan förstÄ pÄ vilka CPU:er den arbetar och varifrÄn den behöver dra nÄgot.

DÀrför Àr rÀtt tillvÀgagÄngssÀtt att helt stÀnga av NUMA, till exempel vid omstart. I de flesta fall Àr vinsterna sÄ stora att frÄgan hur man ska göra det bÀttre överhuvudtaget inte uppstÄr.
Det finns ett annat alternativ. Vi anvÀnder det oftare Àn det första, eftersom nÀr en kund kommer till oss för support, sÄ Àr en serveromstart en stor sak för dem. De har sin verksamhet igÄng. Och de upplever problem med NUMA. DÀrför försöker vi stÀnga av det pÄ mindre pÄtrÀngande sÀtt Àn genom omstart, men hÀr mÄste ni vara försiktiga och kontrollera att det verkligen har stÀngts av. För som erfarenheten visar, det som vi stÀnger av i förÀlderprocessen PostgreSQL NUMA fungerar bra, men det Àr inte nödvÀndigtvis sÄ att det alltid funkar. Det Àr viktigt att kontrollera och se till att det verkligen har stÀngts av.
Det finns ett bra inlÀgg av Robert Haas. Han Àr en av committerna för PostgreSQL. En av huvudutvecklarna av all lÄg nivÄ teknik. Och om man följer lÀnkarna i detta inlÀgg, sÄ beskrivs det nÄgra fÀrgstarka historier om hur NUMA har komplicerat livet för folk. Ta en titt, gÄ igenom checklisten för systemadministratörer, vad som behöver konfigureras pÄ servern sÄ att vÄr databas fungerar bra. Dessa instÀllningar mÄste noteras och kontrolleras, för annars blir det inte sÄ bra.
Jag pÄpekar att detta gÀller alla instÀllningar som jag kommer att prata om. Men vanligtvis samlar databaser ihop i master-slave för redundans. Glöm inte att göra dessa instÀllningar pÄ slaven, för vid nÄgot tillfÀlle kommer ni att fÄ en krasch, och ni kommer att vÀxla till slaven, och den kommer att bli master.
I en nödsituation, nÀr allt Àr mycket illa, ringer telefonen stÀndigt och chefen springer in med en stor kÀpp, dÄ kommer ni inte att ha tid att tÀnka pÄ att kontrollera. Och resultaten kan bli sorgliga.

Den nÀsta punkten Àr huge pages. Huge pages Àr svÄra att testa separat, och det finns inte mycket mening med det, Àven om det finns benchmarker som kan göra det. De Àr lÀtta att googla.
Vad Àr meningen? Ni har en inte sÀrskilt dyr server med mycket RAM, exempelvis mer Àn 30 GB. Ni anvÀnder inte huge pages. Detta betyder att ni definitivt har overhead nÀr det gÀller minnesanvÀndning. Och den overheaden Àr lÄngt ifrÄn trevlig.

Varför Àr det sÄ? Och vad hÀnder? Operativsystemet delar upp minnet i smÄ bitar. Det Àr praktiskt sÄ, och det har alltid varit sÄ. GÄr man in pÄ detaljer, sÄ mÄste operativsystemet översÀtta virtuella adresser till fysiska. Och det Àr en ganska komplicerad process, dÀrför lagrar operativsystemet resultatet av denna operation i Translation Lookaside Buffer (TLB).
Och eftersom TLB Àr en cache, uppstÄr alla de problem som Àr förknippade med cachen i denna situation. För det första, om du har vÀldigt mycket RAM och det Àr helt uppdelat i smÄ bitar, sÄ blir denna buffer mycket stor. Och om cachen Àr stor, tar det lÀngre tid att söka i den. Det finns en stor overhead som i sig upptar utrymme, vilket innebÀr att RAM förbrukar nÄgot olÀmpligt. Det Àr punkt ett.
För det andra â ju mer cachen vĂ€xer i denna situation, desto större Ă€r risken att du fĂ„r cache misses. Effektiviteten hos denna cache sjunker kraftigt med ökad storlek. DĂ€rför har man i operativsystemen utvecklat en enkel lösning. I Linux har det anvĂ€nts lĂ€nge. I FreeBSD har det nyligen införts. Men vi pratar om Linux. Det handlar om huge pages.
Det bör noteras att huge pages, som idé, ursprungligen föresprÄkades av samhÀllen som inkluderade Oracle och IBM, det vill sÀga, databasproducenter tÀnkte verkligen att detta skulle vara anvÀndbart, Àven för databaser.

Och hur kan man integrera detta med PostgreSQL? För det första mÄste huge pages vara aktiverade i Linux-kÀrnan.
För det andra mĂ„ste de anges tydligt som en sysctl-parameter â hur mĂ„nga av dem. Dessa siffror kommer frĂ„n en gammal server. Du kan berĂ€kna hur mĂ„nga shared buffers du ungefĂ€r har, sĂ„ att huge pages fĂ„r plats dĂ€r.
Och om hela servern Ă€r tillĂ€gnad PostgreSQL, dĂ„ Ă€r en bra utgĂ„ngspunkt att antingen ge 25 % av RAM till shared buffers, eller 75 %, om du Ă€r sĂ€ker pĂ„ att din databas fĂ„r plats i dessa 75 %. Det första utgĂ„ngsvĂ€rdet. Och rĂ€kna, om du har 256 GB RAM, sĂ„ fĂ„r du alltsĂ„ 64 GB som shared buffers. RĂ€kna ungefĂ€r med ett visst överskott â vilket vĂ€rde detta ska stĂ€llas in pĂ„.
Före version 9.2 (om jag minns rĂ€tt, frĂ„n version 8.2) var det möjligt att anvĂ€nda ett tredjepartsbibliotek för att ansluta PostgreSQL med huge pages. Och det Ă€r alltid nödvĂ€ndigt att göra. För det första behöver du att kĂ€rnan kan allokera huge pages pĂ„ rĂ€tt sĂ€tt. För det andra mĂ„ste applikationen som arbetar med dem kunna anvĂ€nda dem. Den kan inte bara anvĂ€nda dem utan vidare. Eftersom PostgreSQL allokerade minne med system 5-stilen, kunde detta göras med hjĂ€lp av libhugetlbfs â det fullstĂ€ndiga namnet pĂ„ biblioteket.
I 9.3 förbÀttrades PostgreSQL:s prestanda nÀr det gÀllde minneshantering och de övergav system 5-metoden för minnesallokering. Alla blev mycket glada, för annars försöker du starta tvÄ PostgreSQL-instanser pÄ en maskin, och den sÀger att den har brist pÄ delat minne. Och den sÀger att du mÄste justera sysctl. Och dÀr Àr sysctl sÄ att du ocksÄ mÄste starta om och sÄ vidare. Sammanfattningsvis blev alla glada. Men minnesallokeringen med mmap bröt anvÀndningen av huge pages. De flesta av vÄra kunder anvÀnder stora delade buffrar. Och vi rekommenderade starkt att inte uppgradera till 9.3, eftersom overheadet började rÀkna i goda procent.
Men gemenskapen uppmÀrksammade detta problem, och i 9.4 förbÀttrades detta avsevÀrt. I 9.4 kom en parameter i postgresql.conf, dÀr man kan aktivera try, on eller off.
Try Àr den sÀkraste parametern. NÀr PostgreSQL startar och allokerar delat minne, försöker den ta minnet frÄn huge pages. Om det inte lyckas, faller den tillbaka pÄ vanlig allokering. Om du har FreeBSD eller Solaris kan du sÀtta try, det Àr alltid sÀkert.
Om on Àr aktivt startar den helt enkelt inte om den inte kan allokera frÄn huge pages. HÀr handlar det verkligen om vad som passar bÀst för er. Men om du har try, kontrollera att det verkligen har allokerats det som behövs, för det finns mycket utrymme för fel. För tillfÀllet fungerar denna funktionalitet endast pÄ Linux.
Ett litet ytterligare pÄpekande innan vi gÄr vidare. Transparent huge pages handlar inte om PostgreSQL just nu. Den kan inte dra nytta av dem pÄ ett bra sÀtt. NÀr det kommer till transparent huge pages för sÄdana arbetsbelastningar dÀr en stor del av det delade minnet krÀvs, sÄ börjar fördelarna upptrÀda först vid mycket stora mÀngder. Om ni har terabyte av minne kan det spela roll. Om vi pratar om mer vardagliga tillÀmpningar, dÀr ni har 32, 64, 128 eller 256 GB minne pÄ maskinen, sÄ Àr vanliga huge pages okej, medan transparent bara stÀngs av.

Och den sista punkten kring minne, som inte Àr direkt kopplad till genomströmningen, kan verkligen förstöra livet. Hela bandbredden lider kraftigt av att servern stÀndigt vÀxlar.
Och detta kommer att vara vÀldigt obehagligt i mÄnga situationer. Den största besvÀret ligger i att beteendet hos moderna kÀrnor avviker lite frÄn Àldre Linux-kÀrnor. Och detta Àr nÄgot man helst vill undvika, för nÀr vi pratar om att arbeta med swap sÄ slutar det inte med en snabb Ankomst av OOM-killer. Och OOM-killer som inte kom i tid och stÀngde ner PostgreSQL Àr obehagligt. Detta kommer alla att mÀrka, det vill sÀga Ànda till den sista anvÀndaren.

Vad hÀnder? Ni har en stor mÀngd RAM, allt fungerar bra. Men av nÄgon anledning hÀnger servern i swap och fördröjer pÄ grund av detta. Det kan tyckas som om ni har mycket minne, men ÀndÄ hÀnder det.

Tidigare rekommenderade vi att sÀtta vm.swappiness till noll, det vill sÀga stÀnga av swap. Det verkade tidigare som om 32 GB RAM och motsvarande delade buffrar var en enorm mÀngd. Huvudsyftet med swap Àr att ha en plats att lÀgga en kÀrna pÄ, om vi skulle falla. Och det fyller inte riktigt sin funktion lÀngre. Och vad ska man göra med den kÀrnan sedan? Det Àr en sÄdan uppgift dÀr det inte Àr sÄ tydligt varför swap behövs, sÀrskilt i sÄ stora mÀngder.
Men i de mer moderna, dvs. i tredje versionerna av kÀrnan, har beteendet förÀndrats. Och om du sÀtter swap till noll, dvs. stÀnger av det, sÄ kommer OOM-killer att dyka upp förr eller senare, Àven med en viss mÀngd ledigt arbetsminne, för att döda de mest resurskrÀvande processerna. Det för att den kommer att anta att vi har lite kvar och att vi kan överbelasta, dvs. att den inte kommer att döda systemprocessen, utan nÄgot mindre viktigt. Denna mindre viktiga process kan vara en intensiv konsument av delat minne, nÀmligen postmaster. Och efter det Àr det bra om databasen inte behöver ÄterstÀllas.
DÀrför rekommenderar jag att de flesta distributioner nu som standard Àr nÄgonstans runt 6, dvs. vid vilken punkt man bör börja anvÀnda swap beroende pÄ hur mycket minne som Àr kvar. Vi rÄder nu att sÀtta vm.swappiness = 1, eftersom detta praktiskt taget stÀnger av det, men inte ger sÄdana effekter som med den ovÀntat anlÀndande OOM-killern som dödar allt det hÀr.

Vad hÀnder hÀrnÀst? NÀr vi pratar om databasprestanda och gradvis nÀrmar oss diskar, sÄ börjar alla att bli stressade. För sanningen Àr att diskar Àr lÄngsamma och minnet Àr snabbt, detta Àr nÄgot som alla kÀnner till. Och alla vet att det kommer att uppstÄ problem med diskprestanda i databasen.
Huvudproblemet med PostgreSQL:s prestanda, kopplat till checkpoints spikes, uppstÄr inte för att disken Àr lÄngsam. Det handlar snarare om att kapaciteten hos minnet och disken inte Àr balanserad. De kan vara obalanserade pÄ olika sÀtt. PostgreSQL Àr inte konfigurerat, operativsystemet Àr inte konfigurerat, hÄrdvaran Àr inte rÀtt instÀlld. Och detta problem uppstÄr inte om allt fungerar som det ska, dvs. antingen finns det ingen belastning, eller sÄ Àr instÀllningarna och hÄrdvaran vÀl avpassade.

Vad Àr det och hur ser det ut? Vanligtvis har personer som arbetar med PostgreSQL stött pÄ detta problem flera gÄnger. Jag ska förklara. Som jag nÀmnde gör PostgreSQL periodiskt checkpoints för att dumpa smutsiga sidor frÄn delat minne till disken. Om vi har ett stort antal sidor i det delade minnet börjar checkpointen att belasta disken intensivt, eftersom den dumpas med fsync. Den gÄr till kernel-buffer och skrivs till diskarna med hjÀlp av fsync. Och om volymen av detta Àr stor kan vi observera en otrevlig effekt, nÀmligen en mycket hög diskutilization.
HĂ€r har jag tvĂ„ bilder. Jag ska nu förklara vad detta Ă€r. Det Ă€r tvĂ„ tidskorrelerade diagram. Det första diagrammet â det som visar diskutilization. HĂ€r nĂ„r den nĂ€stan upp till 90 % vid denna tidpunkt. Om du upplever databasen mot fysiska diskar, med RAID-kontroller, och diskutilization ligger omkring 90 %, Ă€r det dĂ„liga nyheter. Det betyder att om det fortsĂ€tter sĂ„ hĂ€r, nĂ€rmar vi oss 100 och in- och utströmmen kommer att stanna.
Om du har en diskarray, Àr historien lite annorlunda. Det beror pÄ hur den Àr konfigurerad, vilken typ av array det handlar om, osv.
Samtidigt Àr hÀr konfigurerad en graf frÄn en intern PostgreSQL-vy, som visar hur checkpointen fungerar. Och med grön fÀrg visas antalet buffrar, de smutsiga sidorna som kommit in i denna checkpoint för synkronisering. Detta Àr det viktigaste att kÀnna till hÀr. Vi ser att mÄnga sidor har kommit in och vid en viss tidpunkt har vi kört fast, dvs. vi har skrivit och skrivit, och diskens system Àr uppenbarligen mycket belastat. VÄr checkpoint pÄverkar disken kraftigt. I ett idealiskt fall borde situationen se ut sÄ hÀr, dvs. att vi hade skrivit mindre. Och vi kan justera instÀllningarna för att se till att det fortsÀtter sÄ. Dvs. liten utnyttjande, men vi skriver ÀndÄ nÄgot hÀr.
Vad behöver göras för att lösa detta problem? Om IO har stannat upp under databasen, betyder det att alla anvÀndare som kommit för att utföra sina förfrÄgningar kommer att fÄ vÀnta.

Om man ser pÄ det ur ett Linux-perspektiv, om man har bra hÄrdvara, har konfigurerat den korrekt och normala instÀllningar för PostgreSQL för att minska antalet checkpoints och sprida ut dem över tid, sÄ hamnar man i standardinstÀllningarna för Debian. För de flesta Linux-distributioner ser bilden ut sÄ hÀr: vm.dirty_ratio=20, vm.dirty_background_ratio=10.
Vad betyder detta? FrÄn kÀrnan 2.6 har en demon för flushing introducerats. Pdglush, beroende pÄ vilken man anvÀnder, ansvarar för bakgrundsvisning av smutsiga sidor frÄn kernel buffer och för att frigöra dessa sidor nÀr det Àr absolut nödvÀndigt, Àven nÀr bakgrundsfrislÀppandet inte rÀcker till.
NÀr intrÀffar bakgrunden? NÀr 10 % av allt RAM-minne pÄ servern anvÀnds av smutsiga sidor i kernel buffer, aktiveras en sÀrskild funktion för bakgrundsvisning. Varför Àr den bakgrunds? Den tar emot som parameter hur mÄnga sidor som ska frigöras. Om den till exempel frigör N sidor. Och under en tid gÄr den i vilolÀge. Sedan kommer den tillbaka och frigör ytterligare ett visst antal sidor.
Detta Àr en mycket enkel historia. Det Àr som med en bassÀng, nÀr det rinner ut genom en slang och fylls upp genom en annan. Vi har en checkpoint och om den har skickat fÄ smutsiga sidor för visning, sÄ kommer pgflush att gradvis lösa upp allt detta försiktigt frÄn kernel buffer.
Om dessa smutsiga sidor fortsÀtter att ackumuleras, nÄr de 20 %, och dÀrefter prioriterar OS att frigöra dem till disken för att undvika dataförlust vid strömavbrott, vilket kan leda till att vi förlorar dessa data.
Vad Àr tricket? Tricket Àr att dessa parametrar, 20 och 10 % av allt RAM-minne i maskinen, Àr helt oacceptabla med avseende pÄ prestanda för vilket disk system som helst.
TÀnk dig att du har 128 GB RAM. 12,8 GB nÄr ditt disksystem. Och vilket cacheminne eller array du Àn har dÀr, de kommer inte att klara av sÄ mycket.

DÀrför rekommenderar vi att justera dessa siffror baserat pÄ ditt RAID-kontrollers kapabiliteter. HÀr Àr en rekommendation för en kontroller med 512 MB cache.
Det anses vara ganska enkelt. Man kan stÀlla in vm.dirty_background i byte. Och dessa instÀllningar avbryter de tidigare tvÄ. Antingen ratio som standard, eller om de som anvÀnder byte Àr aktiverade, kommer de att fungera. Men eftersom jag Àr en DBA-konsult och arbetar med olika kunder försöker jag varna för eventuella problem, sÄ om det Àr i byte, sÄ Àr det i byte. Ingen har gett nÄgon garanti för att en god administratör inte slÀnger in mer minne till servern, eller startar om den, medan siffran förblir densamma. BerÀkna bara dessa siffror för att sÀkerstÀlla att allt fÄr plats.
Vad hĂ€nder om du inte fĂ„r plats? Jag har skrivit att alla flushing effektivt stoppas, men det Ă€r egentligen en talfigur. Operativsystemet har ett stort problem â det finns mĂ„nga smutsiga sidor, sĂ„ effektivt stoppas den IO som skapas av dina klienter, det vill sĂ€ga nĂ€r en applikation skickar en SQL-frĂ„ga till databasen, den vĂ€ntar. All IO till den har lĂ€gsta prioritet, eftersom databasen Ă€r upptagen med checkpoint. Och nĂ€r den avslutar det Ă€r helt oklart. Och nĂ€r du nĂ„r ett inte bakgrunds- eller inte bakgrundsflushing, betyder det att all din IO Ă€r upptagen med detta. Och sĂ„ lĂ€nge det inte Ă€r klart, kan du inte göra nĂ„got.
Det finns ytterligare tvÄ viktiga punkter som ligger utanför denna rapport. Dessa instÀllningar bör matcha instÀllningarna i postgresql.conf, det vill sÀga instÀllningarna för checkpoints. Och ditt lagringssystem mÄste vara korrekt konfigurerat. Om du har en cache pÄ RAID, mÄste det finnas ett batteri pÄ den. Folk köper RAID med bra cache utan batteri. Om du har SSD i RAID, sÄ mÄste de vara serverklassade, dÀr mÄste det finnas kondensatorer. HÀr Àr en utförlig checklista. Genom den hÀr lÀnken finns min presentation om hur man konfigurerar diskprestanda i PostgreSQL. DÀr finns alla dessa checklistor.

Vad kan dessutom komplicera livet avsevÀrt? Det Àr tvÄ parametrar. De Àr relativt nya. De kan som standard vara aktiverade i olika applikationer. Och de kan försvÄra livet inte mindre om de aktiveras felaktigt.

Det finns tvÄ relativt nya funktioner. De har redan dykt upp i tredje kÀrnor. Det handlar om sched_migration_cost i nanosekunder och sched_autogroup_enabled, som som standard Àr aktiv.
Och hur förstör de livet? Vad Ă€r sched_migration_cost? I Linux kan schemalĂ€ggaren migrera en process frĂ„n en CPU till en annan. För PostgreSQL, som utför förfrĂ„gningar, Ă€r det helt oklart varför migration till en annan CPU skulle behövas. Ur ett operativsystemsperspektiv, nĂ€r du vĂ€xlar fönster mellan OpenOffice och terminalen, kan detta vara bra, men för databasen â detta Ă€r mycket dĂ„ligt. DĂ€rför Ă€r en rimlig policy att sĂ€tta migration_cost till nĂ„got stort vĂ€rde, Ă„tminstone flera tusen nanosekunder.
Vad kommer detta att innebÀra för schemalÀggaren? Den kommer att tro att processen fortfarande Àr "het" under denna tid. Det vill sÀga, om du har en lÄng transaktion som sysslar med nÄgot, kommer schemalÀggaren att förstÄ detta. Den kommer att anse att sÄ lÀnge denna timeout inte har passerat, behöver inte migration av denna process ske. Om processen gör nÄgot kommer den inte att migreras, utan avsluta sitt arbete pÄ den CPU som den tilldelats. Resultatet blir utmÀrkt.
En annan aspekt Ă€r autogroup. Det finns en bra idĂ© för specifika arbetsbelastningar som inte har nĂ„got att göra med moderna databaser â att gruppera processer efter den virtuella terminal som de körs ifrĂ„n. Detta Ă€r praktiskt för vissa uppgifter. I praktiken Ă€r PostgreSQL ett multiprocessystem med prefork, som startas frĂ„n en terminal. Du har lock writer, checkpoint och alla dina klientförfrĂ„gningar kommer att grupperas pĂ„ en schemalĂ€ggare, pĂ„ en CPU. De kommer att vĂ€nta dĂ€r tillsammans tills den blir ledig, för att inte störa varandra och ta lĂ€ngre tid av den. Denna situation Ă€r helt onödig under sĂ„dana belastningar och dĂ€rför behöver den stĂ€ngas av.

Min kollega Alexey Lesovsky genomförde tester med en enkel pgbench dÀr han ökade migration_cost med en ordning och stÀngde av autogroup. Resultatet pÄ dÄlig hÄrdvara var nÀstan 10 %.Det finns en diskussion i PostgreSQL:s mailinglista dÀr folk visar resultat pÄ hur sÄdana förÀndringar pÄverkat frÄgehastigheten med 50 %.Det finns mÄnga sÄdana exempel.

Och slutligen, om strömsparande policy. Det Àr bra att Linux nu kan anvÀndas pÄ bÀrbara datorer. Och det kommer att pÄstÄs vara bra för batteriförbrukningen. Men plötsligt visar det sig att detta ocksÄ kan hÀnda pÄ servrar.
Mer Àn sÄ, om du hyr servrar frÄn en hostingleverantör kan "snÀlla" hostingtjÀnster de oro ingen har nÄgot fokus pÄ att förbÀttra din prestanda. Deras uppgift Àr att se till att deras hÄrdvara utnyttjas sÄ effektivt som möjligt. DÀrför kan de som standard aktivera energibesparande lÀge pÄ operativsystemet.
Om du anvĂ€nder en server med en databas under intensiv belastning, Ă€r ditt val acpi_cpufreq + performance. Ăven med ondemand kommer det att uppstĂ„ problem.
Intel_pstate Àr en nÄgot annan drivrutin. Nu föredras denna, eftersom den Àr nyare och fungerar bÀttre.
Och dÀrför Àr guvernören endast performance. Ondemand, powersave och allt annat Àr inte för dig.
Resultaten frÄn explain analyze PostgreSQL kan skilja sig Ät med flera ordningar om du aktiverar powersave, eftersom CPU:n kommer att schemalÀggas pÄ ett helt oförutsÀgbart sÀtt under databasen.
Dessa instÀllningar kan vara aktiverade som standard. Titta noga för att se om de Àr aktiverade. Detta kan verkligen vara ett stort problem.

Och till sist vill jag tacka killarna i vÄrt DBA-team PosgreSQL-Consulting, sÀrskilt Max Boguk och Alexey Lesovsky, som varje dag stöter pÄ problemen. Vi försöker göra vÄrt bÀsta för vÄra kunder sÄ att allt fungerar bra. HÀr Àr det som med flygplanssÀkerhetsinstruktioner. Allt hÀr Àr skrivet med blod. Varje skruv upptÀcktes nÀr ett problem uppstod. Jag delar gÀrna med mig av dem till er.
FrÄgor:
Tack! Om ett företag till exempel vill spara pengar och köra en databas och applikationslogik pÄ samma server, eller om företaget följer den trendiga riktningen av mikrotjÀnstarkitekturer dÀr PostgreSQL körs i en container. Vad Àr grejen? Sysctl pÄverkar globalt hela kÀrnan. Jag har inte hört talas om att sysctl pÄ nÄgot sÀtt virtualiseras sÄ att de fungerar separat i containern. Det finns bara cgroup och dÀr finns kontrollen bara för en del. Hur kan man leva med det? Eller om du vill ha prestanda, kör PostgreSQL pÄ en separat fysisk server och optimera den?
Vi har svarat pĂ„ din frĂ„ga pĂ„ ungefĂ€r tre sĂ€tt. Om det inte handlar om en dedikerad server som du kan optimera och sĂ„ vidare, kan du slappna av â det kommer att fungera bra utan dessa instĂ€llningar. Om du har en sĂ„dan belastning att du behöver göra dessa instĂ€llningar kommer du att behöva en dedikerad server tidigare Ă€n du nĂ„r dessa instĂ€llningar.
Vad Ă€r problemet? Om det Ă€r en virtuell maskin kommer du troligen att ha mĂ„nga problem, till exempel att det Ă€r mycket inkonsekvent latens pĂ„ diskarna i de flesta virtuella maskiner. Ăven om diskarna har bra bandbredd kan en misslyckad I/O-transaktion, som inte pĂ„verkar den genomsnittliga bandbredden mycket, hĂ€nda under en checkpoint eller vid skrivning till WAL, och databasen kommer att lida av det. Och du kommer att mĂ€rka det tidigare Ă€n du hamnar i dessa problem.
Om du har NGINX pÄ samma server kommer du att ha samma problem. Den kommer att slÄss om det delade minnet. Och du kommer inte att nÄ de problem som beskrivs hÀr.
Men Ă„ andra sidan kommer vissa av dessa parametrar fortfarande att vara relevanta för dig. Till exempel, med sysctl kan du stĂ€lla in dirty_ratio sĂ„ att den inte Ă€r sĂ„ galen â det kommer att hjĂ€lpa pĂ„ nĂ„got sĂ€tt. Hur som helst kommer du att ha interaktion med disken. Och det kommer att vara felaktigt. Det Ă€r faktiskt standarden för de parametrar som jag visade. Och det Ă€r bĂ€ttre att Ă€ndra dem oavsett.
Det kan finnas problem med NUMA. VmWare fungerar till exempel bra med NUMA med helt motsatt instĂ€llning. HĂ€r mĂ„ste du vĂ€lja â dedikerad server eller inte.
Jag har en frÄga relaterad till Amazon AWS. De har förinstÀllda bilder. En av dem kallas Amazon RDS. Finns det nÄgra anpassade instÀllningar för deras operativsystem?
Det finns instÀllningar, men det Àr andra instÀllningar. HÀr konfigurerar vi operativsystemet utifrÄn hur databasen kommer att anvÀnda det. Och dÀr finns det parametrar som bestÀmmer vart vi ska gÄ nu, sÄ mycket shaping. Det vill sÀga, vi behöver sÄ mycket resurser, och vi kommer att utnyttja dem nu. Efter det kopplar Amazon RDS dessa resurser, och prestandan faller. Det finns separata berÀttelser om hur folk börjar experimentera med detta. Ibland ganska framgÄngsrikt. Men det har inget att göra med operativsystemets instÀllningar. Det handlar mer om att hacka molnet. Det Àr en annan historia.
Varför ger Transparent huge pages ingen effekt jÀmfört med Huge TLB?
Det gör de inte. Detta kan förklaras pĂ„ mĂ„nga sĂ€tt. Men faktum Ă€r att de helt enkelt inte bidrar. Vad Ă€r historien med PostgreSQL? Vid start reserverar den en stor del av det delade minnet. Oavsett om de Ă€r transparenta eller inte â det spelar ingen roll. Faktumet att de allokeras vid start förklarar allt. Om det finns mycket minne och det behöver omstruktureras, dĂ„ blir Transparent huge pages aktuellt. I PostgreSQL allokeras det helt enkelt en stor del frĂ„n början och sedan hĂ€nder det inget sĂ€rskilt lĂ€ngre. Man kan sjĂ€lvklart anvĂ€nda det, men det finns en risk att fĂ„ korrupt delat minne nĂ€r det omallokerar nĂ„got. PostgreSQL vet ju inte om detta.
KĂ€lla: habr.com
