Linux-instÀllning för att förbÀttra PostgreSQL-prestanda. Ilya Kosmodemyansky

Transkription av 2015 Ärs rapport av Ilya Kosmodemyansky "Linux-instÀllning för att förbÀttra PostgreSQL-prestanda"

Disclaimer: Jag noterar att denna rapport Àr daterad november 2015 - mer Àn 4 Är har gÄtt och mycket tid har gÄtt. Den version 9.4 som diskuteras i rapporten stöds inte lÀngre. Under de senaste fyra Ären har 4 nya versioner av PostgreSQL slÀppts och 5 versioner av Linux-kÀrnan har slÀppts. Om du skriver om dessa avsnitt kommer du att fÄ en annan rapport. Men hÀr övervÀger vi grundlÀggande Linux-instÀllning för PostgreSQL, vilket fortfarande Àr relevant idag.

Linux-instÀllning för att förbÀttra PostgreSQL-prestanda. Ilya Kosmodemyansky


Mitt namn Àr Ilya Kosmodemyansky. Jag arbetar pÄ PostgreSQL-Consulting. Och nu ska jag prata lite om vad man ska göra med Linux i förhÄllande till databaser i allmÀnhet och PostgreSQL i synnerhet, eftersom principerna Àr ganska lika.

Vad ska vi prata om? Om du kommunicerar med PostgreSQL mĂ„ste du till viss del vara UNIX-administratör. Vad betyder det? Om vi ​​jĂ€mför Oracle och PostgreSQL, mĂ„ste du i Oracle vara 80 % DBA-databasadministratör och 20 % Linux-admin.

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. Och samtidigt springa lite efter loket, för pÄ sistone har allt uppdaterats ganska snyggt. Och nya kÀrnor slÀpps, och ny funktionalitet dyker upp, prestanda förbÀttras, etc.

Varför pratar vi om Linux? Inte alls för att vi Àr pÄ Linuxkonferensen Peter, utan för att i moderna förhÄllanden Àr ett av de mest motiverade operativsystemen för att anvÀnda databaser i allmÀnhet och PostgreSQL i synnerhet Linux. Eftersom FreeBSD, tyvÀrr, utvecklas i nÄgon mycket konstig riktning. Och det blir problem bÄde med prestanda och med mycket annat. Prestandan för PostgreSQL pÄ Windows Àr generellt sett ett separat allvarligt problem, baserat pÄ det faktum att Windows inte har samma delade minne som UNIX, medan PostgreSQL Àr kopplat till detta, eftersom det Àr ett multiprocesssystem.

Och jag tror att alla Àr mindre intresserade av exotiska saker som Solaris, sÄ lÄt oss gÄ.

Linux-instÀllning för att förbÀttra PostgreSQL-prestanda. Ilya Kosmodemyansky

En modern Linux-distribution har över 1 000 syctl-alternativ, beroende pÄ hur du bygger kÀrnan. Samtidigt, om vi tittar pÄ de olika muttrarna, kan vi justera nÄgot pÄ mÄnga sÀtt. Det finns filsystemparametrar för hur man monterar dem. Om du har frÄgor om hur du startar det: vad du ska aktivera i BIOS, hur du konfigurerar hÄrdvaran, etc.

Det hÀr Àr en mycket stor volym som kan diskuteras över flera dagar, och inte i en kort rapport, men nu ska jag fokusera pÄ viktiga saker, hur man undviker de rakes som garanterat hindrar dig frÄn att anvÀnda din databas bra pÄ Linux om du korrigera dem inte. Och samtidigt Àr en viktig poÀng att mÄnga standardparametrar inte ingÄr i de instÀllningar som Àr korrekta för databasen. Det vill sÀga, som standard kommer det att fungera dÄligt eller inte alls.

Linux-instÀllning för att förbÀttra PostgreSQL-prestanda. Ilya Kosmodemyansky

Vilka traditionella instÀllningsmÄl finns det i Linux? Jag tror att eftersom ni alla har att göra med Linux-administration finns det inget sÀrskilt behov av att förklara vad mÄl Àr.

Du kan stÀlla in:

  • CPU.
  • Minne.
  • Lagring.
  • Övrig. Vi pratar om detta i slutet för ett mellanmĂ„l. Även till exempel parametrar som energisparpolitik kan pĂ„verka prestandan pĂ„ ett mycket oförutsĂ€gbart och inte det mest trevliga sĂ€ttet.

Linux-instÀllning för att förbÀttra PostgreSQL-prestanda. Ilya Kosmodemyansky

Vilka Àr detaljerna för PostgreSQL och databasen i allmÀnhet? Problemet Àr att du inte kan justera nÄgon enskild mutter och se att vÄr prestanda har förbÀttrats avsevÀrt.

Ja, det finns sÄdana prylar, men en databas Àr en komplex sak. Den interagerar med alla resurser som servern har och föredrar att interagera till fullo. Om du tittar pÄ Oracles nuvarande rekommendationer om hur man anvÀnder ett vÀrdoperativsystem, kommer det att vara som skÀmtet om den mongoliska kosmonauten - mata hunden och inte röra nÄgonting. LÄt oss ge databasen alla resurser, sjÀlva databasen kommer att reda ut allt.

I princip Àr situationen i viss mÄn exakt densamma med PostgreSQL. Skillnaden Àr att databasen Ànnu inte kan ta alla resurser för sig sjÀlv, d.v.s. nÄgonstans pÄ Linux-nivÄ behöver du reda ut det hela sjÀlv.

Huvudidén Àr inte att vÀlja ett enda mÄl och börja stÀlla in det, till exempel minne, CPU eller nÄgot liknande, utan att analysera arbetsbelastningen och försöka förbÀttra genomströmningen sÄ mycket som möjligt sÄ att belastningen som bra programmerare skapade den för oss, inklusive vÄra anvÀndare.

Linux-instÀllning för att förbÀttra PostgreSQL-prestanda. Ilya Kosmodemyansky

HÀr Àr en bild för att förklara vad det Àr. Det finns en Linux OS-buffert och det finns delat minne och det finns PostgreSQL delade buffertar. PostgreSQL, till skillnad frÄn Oracle, fungerar bara 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 gÄ igenom kÀrnbufferten och tillbaka, exakt samma situation.

Diskar lever under detta system. Jag ritade detta som diskar. Faktum Àr att det kan finnas en RAID-kontroller, etc.

Och denna input-output sker pÄ ett eller annat sÀtt genom denna frÄga.

PostgreSQL Àr en klassisk databas. Det finns en sida inuti. Och all in- och utmatning sker med hjÀlp av sidor. Vi lyfter upp block i minnet med sidor. Och om inget hÀnde, lÀser vi dem bara, sedan försvinner de gradvis frÄn denna cache, frÄn de delade buffertarna och hamnar tillbaka pÄ disken.

Om vi ​​byter ut nĂ„got nĂ„gonstans markeras hela sidan som smutsig. Jag markerade dem hĂ€r i blĂ„tt. Och det betyder att den hĂ€r sidan mĂ„ste synkroniseras med blocklagring. Det vill sĂ€ga nĂ€r vi gjorde det smutsigt gjorde vi ett inlĂ€gg i WAL. Och vid nĂ„got underbart ögonblick i tiden kom ett fenomen som kallas checkpoint. Och information antecknades i denna logg om att han hade anlĂ€nt. Och detta betyder att alla smutsiga sidor som fanns hĂ€r vid det ögonblicket i dessa delade buffertar synkroniserades med lagringsdisken med hjĂ€lp av fsync genom kĂ€rnbufferten.

Varför görs detta? Om vi ​​tappade spĂ€nningen sĂ„ fick vi inte situationen att all data gick förlorad. Persistent minne, som alla berĂ€ttade om, finns hittills i databasteorin - det hĂ€r Ă€r en ljus framtid, som vi naturligtvis strĂ€var efter och vi gillar det, men för nĂ€rvarande lever de om minus 20 Ă„r. Och naturligtvis mĂ„ste allt detta övervakas.

Och uppgiften att maximera genomströmningen Àr att finjustera i alla dessa stadier sÄ att det hela rör sig snabbt fram och tillbaka. Delat minne Àr i grunden en sidcache. I PostgreSQL skickade vi en urvalsfrÄga eller nÄgot, den hÀmtade denna data frÄn disken. De hamnade i delade buffertar. Följaktligen mÄste det finnas mycket minne för att detta ska fungera bÀttre.

För att allt detta ska fungera bra och snabbt mÄste du konfigurera operativsystemet korrekt i alla skeden. Och vÀlj balanserad hÄrdvara, för om du har en obalans pÄ nÄgot stÀlle, dÄ kan du göra mycket minne, men det kommer inte att servas i tillrÀcklig hastighet.

Och lÄt oss gÄ igenom var och en av dessa punkter.

Linux-instÀllning för att förbÀttra PostgreSQL-prestanda. Ilya Kosmodemyansky

För att fÄ dessa sidor att resa fram och tillbaka snabbare mÄste du uppnÄ följande:

  • För det första mĂ„ste du arbeta mer effektivt med minnet.
  • För det andra bör denna övergĂ„ng nĂ€r sidor frĂ„n minnet gĂ„r till disken vara mer effektiv.
  • Och för det tredje mĂ„ste det finnas bra diskar.

Om du har 512 GB RAM i servern och allt hamnar pÄ en SATA-hÄrddisk utan nÄgon cache, sÄ förvandlas hela databasservern till inte bara en pumpa, utan en pumpa med ett SATA-grÀnssnitt. Du kommer att stöta pÄ det direkt. Och ingenting kommer att rÀdda dig.

Linux-instÀllning för att förbÀttra PostgreSQL-prestanda. Ilya Kosmodemyansky

AngÄende den första punkten med minnet sÄ finns det tre saker som kan göra livet vÀldigt svÄrt.

Den första av dem Àr NUMA. NUMA Àr en sak som Àr gjord för att förbÀttra prestandan. Beroende pÄ arbetsbelastningen kan olika saker optimeras. Och i sin nya nuvarande form Àr det inte sÀrskilt bra för applikationer som databaser som intensivt anvÀnder sidcache-delade buffertar.

Linux-instÀllning för att förbÀttra PostgreSQL-prestanda. Ilya Kosmodemyansky

I ett nötskal. Hur kan du se om nÄgot Àr fel med NUMA? Du har nÄgon form av obehaglig knackning, plötsligt Àr nÄgon CPU överbelastad. Samtidigt analyserar du frÄgor i PostgreSQL och ser att det inte finns nÄgot liknande dÀr. Dessa frÄgor bör inte vara sÄ CPU-intensiva. Du kan fÄnga detta lÀnge. Det Àr lÀttare att anvÀnda rÀtt rekommendation redan frÄn början om hur man konfigurerar NUMA för PostgreSQL.

Linux-instÀllning för att förbÀttra PostgreSQL-prestanda. Ilya Kosmodemyansky

Vad Àr det som hÀnder egentligen? NUMA stÄr för Non-Uniform Memory Access. Vad Àr poÀngen? Du har en CPU, bredvid den finns dess lokala minne. Och dessa minnesanslutningar kan dra upp minne frÄn andra processorer.

Om du springer numactl --hardware, dÄ fÄr du ett sÄ stort ark. Det kommer bland annat att finnas ett distansfÀlt. Det blir siffror - 10-20, nÄgot sÄnt. Dessa siffror Àr inget annat Àn antalet hopp för att plocka upp det hÀr fjÀrrminnet och anvÀnda det lokalt. I princip en bra idé. Detta snabbar upp prestanda bra under en rad arbetsbelastningar.

FörestÀll dig nu att du har en CPU som först försöker anvÀnda sitt lokala minne och sedan försöker dra upp ett annat minne via sammankoppling för nÄgot. Och den hÀr processorn fÄr hela din PostgreSQL-sidcache - det Àr det, nÄgra gigabyte. Du fÄr alltid det vÀrsta fallet, för pÄ CPU:n finns det oftast lite minne i sjÀlva modulen. Och allt minne som betjÀnas gÄr genom dessa sammankopplingar. Det blir lÄngsamt och trist. Och din processor som servar denna nod Àr stÀndigt överbelastad. Och Ätkomsttiden för detta minne Àr dÄlig, lÄngsam. Det hÀr Àr situationen du inte vill ha om du anvÀnder den för en databas.

DÀrför Àr ett mer korrekt alternativ för databasen att operativsystemet Linux inte alls vet vad som hÀnder dÀr. SÄ att den kommer Ät minnet som den gör.

Varför Àr det sÄ? Det verkar som att det borde vara tvÀrtom. Detta hÀnder av en enkel anledning: vi behöver mycket minne för sidcachen - tiotals, hundratals gigabyte.

Och om vi allokerade allt detta och cachade vÄr data dÀr, sÄ kommer vinsten frÄn att anvÀnda cachen att vara betydligt större Àn vinsten frÄn en sÄ knepig Ätkomst till minnet. Och vi kommer dÀrmed att gynnas ojÀmförligt jÀmfört med det faktum att vi kommer Ät minnet mer effektivt med NUMA.

DÀrför finns det tvÄ tillvÀgagÄngssÀtt hÀr för tillfÀllet, tills den ljusa framtiden har anlÀnt, och databasen sjÀlv inte kan lista ut vilka CPU:er den körs pÄ och var den behöver hÀmta nÄgot ifrÄn.

Linux-instÀllning för att förbÀttra PostgreSQL-prestanda. Ilya Kosmodemyansky

DÀrför Àr det korrekta tillvÀgagÄngssÀttet att inaktivera NUMA helt och hÄllet, till exempel vid omstart. I de flesta fall Àr vinsterna av sÄdan storleksordning att frÄgan om vilket som Àr bÀst inte alls uppstÄr.

Det finns ett annat alternativ. Vi anvÀnder den oftare Àn den första, för nÀr en klient kommer till oss för att fÄ support Àr det en stor sak för honom att starta om servern. Han har ett företag dÀr. Och de upplever problem pÄ grund av NUMA. DÀrför försöker vi inaktivera den pÄ mindre invasiva sÀtt Àn att starta om, men var noga med att kontrollera att den Àr inaktiverad. För, som erfarenheten visar, Àr det bra att vi inaktiverar NUMA pÄ den överordnade PostgreSQL-processen, men det Àr inte alls nödvÀndigt att det fungerar. Vi mÄste kolla och se att hon verkligen stÀngt av.

Det finns ett bra inlÀgg av Robert Haas. Detta Àr en av PostgreSQL-kommittarna. En av de viktigaste utvecklarna av alla lÄgnivÄgiblets. Och om du följer lÀnkarna frÄn det hÀr inlÀgget beskriver de flera fÀrgstarka berÀttelser om hur NUMA gjorde livet svÄrt för mÀnniskor. Titta, studera systemadministratörens checklista över vad som behöver konfigureras pÄ servern för att vÄr databas ska fungera bra. Dessa instÀllningar mÄste skrivas ner och kontrolleras, för annars blir det inte sÀrskilt bra.

Observera att detta gÀller alla instÀllningar som jag kommer att prata om. Men vanligtvis samlas databaser in i master-slave-lÀge för feltolerans. Glöm inte att göra dessa instÀllningar pÄ slaven för en dag kommer du att rÄka ut för en olycka och du kommer att byta till slaven och den kommer att bli master.

I en nödsituation, nÀr allt Àr vÀldigt dÄligt, din telefon hela tiden ringer och din chef kommer springande med en stor pinne, har du ingen tid att tÀnka pÄ att kolla. Och resultaten kan bli ganska katastrofala.

Linux-instÀllning för att förbÀttra PostgreSQL-prestanda. Ilya Kosmodemyansky

NÀsta punkt Àr stora sidor. Enorma sidor Àr svÄra att testa separat, och det Àr ingen idé att göra det, Àven om det finns riktmÀrken som kan göra detta. De Àr lÀtta att Google.

Vad Àr poÀngen? Du har en inte sÀrskilt dyr server med mycket RAM, till exempel mer Àn 30 GB. Du anvÀnder inte stora sidor. Detta innebÀr att du definitivt har overhead nÀr det gÀller minnesanvÀndning. Och denna overhead Àr lÄngt ifrÄn den mest trevliga.

Linux-instÀllning för att förbÀttra PostgreSQL-prestanda. Ilya Kosmodemyansky

Varför Àr det sÄ? SÄ vad hÀnder? Operativsystemet allokerar minne i smÄ bitar. Det Àr sÄ bekvÀmt, det Àr sÄ det hÀnde historiskt. Och om vi gÄr in pÄ detaljer mÄste operativsystemet översÀtta virtuella adresser till fysiska. Och denna process Àr inte den enklaste, sÄ operativsystemet cachar resultatet av denna operation i Translation Lookaside Buffer (TLB).

Och eftersom TLB Àr en cache, uppstÄr alla problem som Àr inneboende i en cache i denna situation. För det första, om du har mycket RAM och allt Àr allokerat i smÄ bitar, sÄ blir denna buffert vÀldigt stor. Och om cachen Àr stor gÄr det lÄngsammare att söka igenom det. Overhead Àr hÀlsosamt och det tar i sig utrymme, d.v.s. RAM-minnet förbrukas av nÄgot felaktigt. Den hÀr gÄngen.

TvÄ - ju mer cachen vÀxer i en sÄdan situation, desto mer sannolikt Àr det att du fÄr cachemissar. Och effektiviteten för denna cache minskar snabbt nÀr dess storlek ökar. DÀrför kom operativsystemen med ett enkelt tillvÀgagÄngssÀtt. Det har anvÀnts i Linux under lÄng tid. Det dök upp i FreeBSD för inte sÄ lÀnge sedan. Men vi pratar om Linux. Det hÀr Àr enorma sidor.

Och hÀr bör det noteras att enorma sidor, som en idé, frÄn början drevs av gemenskaper som inkluderade Oracle och IBM, det vill sÀga databastillverkare trodde starkt att detta skulle vara anvÀndbart för databaser ocksÄ.

Linux-instÀllning för att förbÀttra PostgreSQL-prestanda. Ilya Kosmodemyansky

Och hur kan detta bli vÀn med PostgreSQL? För det första mÄste stora sidor vara aktiverade i Linux-kÀrnan.

För det andra mÄste de explicit specificeras av sysctl-parametern - hur mÄnga det finns. Siffrorna hÀr Àr frÄn nÄgon gammal server. Du kan rÀkna ut hur mÄnga delade buffertar du har sÄ att enorma sidor fÄr plats dÀr.

Och om hela din server Àr dedikerad till PostgreSQL, sÄ Àr en bra utgÄngspunkt att allokera antingen 25% av RAM-minnet till delade buffertar, eller 75% om du Àr sÀker pÄ att din databas definitivt kommer att passa i dessa 75%. UtgÄngspunkt ett. Och tÀnk pÄ att om du har 256 GB RAM-minne, kommer du följaktligen att ha 64 GB stora buffertar. RÀkna ungefÀr med viss marginal - vad denna siffra ska sÀttas till.

Före version 9.2 (om jag inte har fel, sedan version 8.2) var det möjligt att koppla PostgreSQL med enorma sidor med hjÀlp av ett tredjepartsbibliotek. Och detta bör alltid göras. Först behöver du kÀrnan för att kunna allokera enorma sidor korrekt. Och för det andra sÄ att applikationen som fungerar med dem kan anvÀnda dem. Det kommer inte bara att anvÀndas pÄ det sÀttet. Eftersom PostgreSQL allokerade minne i system 5-stilen kunde detta göras med libhugetlbfs - detta Àr bibliotekets fullstÀndiga namn.

I 9.3 förbÀttrades PostgreSQL-prestanda nÀr man arbetade med minne och system 5-minnestilldelningsmetoden övergavs. Alla var vÀldigt glada, för annars försöker man köra tvÄ PostgreSQL-instanser pÄ en maskin, och han sÀger att jag inte har tillrÀckligt med delat minne. Och han sÀger att sysctl mÄste korrigeras. Och det finns en sÄdan sysctl att du fortfarande behöver starta om, etc. I allmÀnhet var alla nöjda. Men tilldelning av mmap-minne bröt anvÀndningen av enorma sidor. De flesta av vÄra kunder anvÀnder stora delade buffertar. Och vi rekommenderade starkt att inte byta till 9.3, för dÀr började omkostnaderna berÀknas i bra procentsatser.

Men samhÀllet uppmÀrksammade detta problem och i 9.4 omarbetade de denna hÀndelse mycket bra. Och i 9.4 dök en parameter upp i postgresql.conf dÀr du kan aktivera försök, pÄ eller av.

Prova Àr det sÀkraste alternativet. NÀr PostgreSQL startar, nÀr den allokerar delat minne, försöker den ta detta minne frÄn de enorma sidorna. Och om det inte fungerar, rullar det tillbaka till det normala valet. Och om du har FreeBSD eller Solaris, dÄ kan du prova, det Àr alltid sÀkert.

Om den Àr pÄ startar den helt enkelt inte om den inte kunde vÀlja frÄn de enorma sidorna. HÀr handlar det redan om vem och vad som Àr snyggast. Men om du har försökt, kontrollera dÄ att du verkligen har det du behöver markerat, för det finns mycket utrymme för fel. För nÀrvarande fungerar den hÀr funktionen bara pÄ Linux.

En liten anteckning till innan vi gĂ„r vidare. Transparenta enorma sidor handlar inte om PostgreSQL Ă€n. Han kan inte anvĂ€nda dem normalt. Och med Transparenta enorma sidor för en sĂ„dan arbetsbelastning, nĂ€r en stor bit delat minne behövs, kommer fördelarna bara med mycket stora volymer. Om du har terabyte minne kan detta spela in. Om vi ​​pratar om mer vardagliga applikationer, nĂ€r du har 32, 64, 128, 256 GB minne pĂ„ din maskin, dĂ„ Ă€r de vanliga enorma sidorna Ok, och vi inaktiverar helt enkelt Transparent.

Linux-instÀllning för att förbÀttra PostgreSQL-prestanda. Ilya Kosmodemyansky

Och det sista med minnet Àr inte direkt relaterat till fruitut, det kan verkligen förstöra ditt liv. All genomströmning kommer att pÄverkas kraftigt av att servern stÀndigt byter.

Och detta kommer att vara vÀldigt obehagligt pÄ flera sÀtt. Och huvudproblemet Àr att moderna kÀrnor beter sig nÄgot annorlunda Àn Àldre Linux-kÀrnor. Och den hÀr saken Àr ganska obehaglig att trampa pÄ, för nÀr vi pratar om nÄgot slags arbete med swap, slutar det med att OOM-mördaren kommer i tid. Och OOM-mördaren, som inte kom fram i tid och slÀppte PostgreSQL, Àr obehaglig. Alla kommer att veta om detta, det vill sÀga tills den sista anvÀndaren.

Linux-instÀllning för att förbÀttra PostgreSQL-prestanda. Ilya Kosmodemyansky

Vad hÀnder? Du har en stor mÀngd RAM dÀr, allt fungerar bra. Men av nÄgon anledning hÀnger servern i swap och saktar ner pÄ grund av detta. Det verkar som att det finns mycket minne, men detta hÀnder.

Linux-instÀllning för att förbÀttra PostgreSQL-prestanda. Ilya Kosmodemyansky

Tidigare rekommenderade vi att stÀlla in vm.swappiness till noll, det vill sÀga att inaktivera swap. Tidigare verkade det som att 32 GB RAM och motsvarande delade buffertar var en enorm mÀngd. Huvudsyftet med bytet Àr att ha en plats att kasta skorpan om vi ramlar av. Och det var inte lÀngre sÀrskilt uppfyllt. Och vad ska du göra med den hÀr skorpan? Detta Àr en uppgift dÀr det inte Àr sÀrskilt tydligt varför swap behövs, sÀrskilt av en sÄdan storlek.

Men i mer moderna, d.v.s. tredje versioner av kÀrnan, har beteendet förÀndrats. Och om du stÀller in swap pÄ noll, det vill sÀga stÀnger av det, kommer förr eller senare, Àven om det finns lite RAM kvar, en OOM-mördare att komma till dig för att döda de mest intensiva konsumenterna. För han kommer att anse att med en sÄdan arbetsbelastning har vi fortfarande en liten bit kvar och vi kommer att hoppa ut, det vill sÀga inte för att spika systemprocessen, utan för att spika nÄgot mindre viktigt. Denne mindre viktiga kommer att vara den intensiva konsumenten av delat minne, nÀmligen postmÀstaren. Och efter det kommer det att vara bra om basen inte behöver ÄterstÀllas.

DÀrför Àr nu standard, sÄvitt jag minns, de flesta distributioner Àr nÄgonstans runt 6, dvs vid vilken tidpunkt ska du börja anvÀnda swap beroende pÄ hur mycket minne som finns kvar. Vi rekommenderar nu att stÀlla in vm.swappiness = 1, eftersom detta praktiskt taget stÀnger av det, men ger inte samma effekter som med en OOM-mördare som ovÀntat anlÀnde och dödade det hela.

Linux-instÀllning för att förbÀttra PostgreSQL-prestanda. Ilya Kosmodemyansky

Vad kommer hÀrnÀst? NÀr vi pratar om databasers prestanda och gradvis rör oss mot diskar, börjar alla ta tag i huvudet. För sanningen att skivan Àr lÄngsam och minnet Àr snabbt Àr bekant för alla frÄn barndomen. Och alla vet att databasen kommer att ha problem med diskprestanda.

Det huvudsakliga PostgreSQL-prestandaproblemet som Àr associerat med kontrollpunkters toppar uppstÄr inte eftersom disken Àr lÄngsam. Detta beror med största sannolikhet pÄ att minnet och diskbandbredden inte Àr balanserade. De kanske inte Àr balanserade pÄ olika stÀllen. PostgreSQL Àr inte konfigurerat, operativsystemet Àr inte konfigurerat, hÄrdvaran Àr inte konfigurerad och hÄrdvaran Àr felaktig. Och det hÀr problemet uppstÄr inte bara om allt hÀnder som det ska, det vill sÀga antingen det inte Àr nÄgon belastning eller sÄ Àr instÀllningarna och hÄrdvaran vÀl valda.

Linux-instÀllning för att förbÀttra PostgreSQL-prestanda. Ilya Kosmodemyansky

Vad Ă€r det och hur ser det ut? Vanligtvis har personer som arbetar med PostgreSQL gĂ„tt in i denna frĂ„ga mer Ă€n en gĂ„ng. Jag ska förklara. Som jag sa, PostgreSQL gör periodvis kontrollpunkter för att dumpa smutsiga sidor i delat minne till disk. Om vi ​​har en stor mĂ€ngd delat minne, börjar checkpoint ha en intensiv inverkan pĂ„ disken, eftersom den dumpar dessa sidor med fsync. Den anlĂ€nder till kĂ€rnbufferten och skrivs till diskar med fsync. Och om volymen av denna verksamhet Ă€r stor, kan vi observera en obehaglig effekt, nĂ€mligen en mycket stor anvĂ€ndning av diskar.

HÀr har jag tvÄ bilder. Jag ska nu förklara vad det Àr. Dessa Àr tvÄ tidskorrelerade grafer. Den första grafen Àr diskutnyttjande. HÀr nÄr den nÀstan 90 % vid denna tidpunkt. Om du har ett databasfel med fysiska diskar, med en RAID-kontrolleranvÀndning pÄ 90 %, sÄ Àr detta dÄliga nyheter. Det betyder att lite mer och det kommer att nÄ 100 och I/O kommer att stanna.

Om du har en diskarray Àr det en lite annorlunda historia. Det beror pÄ hur det Àr konfigurerat, vilken typ av array det Àr osv.

Och parallellt konfigureras hÀr en graf frÄn den interna postgres-vyn, som berÀttar hur kontrollpunkten uppstÄr. Och den gröna fÀrgen hÀr visar hur mÄnga buffertar, dessa smutsiga sidor, som i det ögonblicket anlÀnde till denna kontrollpunkt för synkronisering. Och detta Àr det viktigaste du behöver veta hÀr. Vi ser att vi har mÄnga sidor hÀr och nÄgon gÄng slog vi till pÄ brÀdan, det vill sÀga vi skrev och skrev, hÀr Àr skivsystemet helt klart vÀldigt upptaget. Och vÄr checkpoint har en mycket stark inverkan pÄ disken. Helst skulle situationen se ut mer sÄ hÀr, det vill sÀga vi hade mindre inspelning hÀr. Och vi kan fixa det med instÀllningarna sÄ att det fortsÀtter att vara sÄ hÀr. Det vill sÀga Ätervinningen Àr liten, men nÄgonstans skriver vi nÄgot hÀr.

Vad behöver göras för att övervinna detta problem? Om du har stoppat IO under databasen betyder det att alla anvÀndare som kom för att uppfylla sina önskemÄl vÀntar.

Linux-instÀllning för att förbÀttra PostgreSQL-prestanda. Ilya Kosmodemyansky

Om du ser ur Linux synvinkel, om du tog bra hÄrdvara, konfigurerade den korrekt, konfigurerade PostgreSQL normalt sÄ att den gör dessa kontrollpunkter mer sÀllan, sprider dem över tid mellan varandra, sÄ gÄr du in i Debians standardparametrar. För de flesta Linux-distributioner Àr detta bilden: vm.dirty_ratio=20, vm.dirty_background_ratio=10.

Vad betyder det? En spolningsdemon dök upp frÄn kÀrnan 2.6. Pdglush, beroende pÄ vem som anvÀnder vilken, som Àr engagerad i bakgrundskastning av smutsiga sidor frÄn kÀrnbufferten och kassering nÀr det Àr nödvÀndigt att kassera smutsiga sidor oavsett vad, nÀr kassering i bakgrunden inte hjÀlper.

NÀr kommer bakgrunden? NÀr 10 % av det totala RAM-minnet som Àr tillgÀngligt pÄ servern Àr upptaget av smutsiga sidor i kÀrnbufferten, anropas en speciell avskrivningsfunktion i bakgrunden. Varför Àr det bakgrund? Som parameter tar den hÀnsyn till hur mÄnga sidor som ska skrivas av. Och lÄt oss sÀga, han skriver av N sidor. Och för en stund somnar den hÀr saken. Och sÄ kommer hon igen och kopierar nÄgra sidor till.

Det hÀr Àr en extremt enkel historia. Problemet hÀr Àr som med en simbassÀng, nÀr det hÀller i ett rör rinner det ut i ett annat. VÄr kontrollpunkt anlÀnde och om den skickade nÄgra smutsiga sidor för att kastas, sÄ kommer det hela gradvis att lösas snyggt frÄn kÀrnbufferten pgflush.

Om dessa smutsiga sidor fortsÀtter att ackumuleras ackumuleras de upp till 20%, varefter OS-prioriteten Àr att skriva av det hela till disken, eftersom strömmen kommer att gÄ sönder och allt blir dÄligt för oss. Vi kommer till exempel att förlora denna data.

Vad Àr tricket? Tricket Àr att dessa parametrar i den moderna vÀrlden Àr 20 och 10% av det totala RAM-minnet som finns pÄ maskinen, de Àr helt monstruösa nÀr det gÀller genomströmningen av alla disksystem du har.

FörestÀll dig att du har 128 GB RAM. 12,8 GB kommer till ditt disksystem. Och oavsett vilken cache du har dÀr, oavsett vilken array du har dÀr, kommer de inte att hÄlla sÄ lÀnge.

Linux-instÀllning för att förbÀttra PostgreSQL-prestanda. Ilya Kosmodemyansky

DÀrför rekommenderar vi att du omedelbart justerar dessa siffror baserat pÄ kapaciteten hos din RAID-kontroller. Jag gav direkt en rekommendation hÀr för en kontroller som har 512 MB cache.

Allt anses vara vÀldigt enkelt. Du kan lÀgga vm.dirty_background i byte. Och dessa instÀllningar avbryter de tvÄ föregÄende. Antingen Àr förhÄllandet som standard, eller sÄ Àr de med byte aktiverade, dÄ fungerar de med byte. Men eftersom jag Àr DBA-konsult och jobbar med olika kunder försöker jag dra strÄn och dÀrför, om i byte, sÄ i byte. Ingen gav nÄgon garanti för att en bra administratör inte skulle lÀgga till mer minne till servern, starta om den och siffran skulle förbli densamma. RÀkna bara ut dessa siffror sÄ att allt fÄr plats dÀr med garanti.

Vad hÀnder om du inte passar in? Jag har skrivit att all spolning effektivt stoppas, men i sjÀlva verket Àr detta ett tal. Operativsystemet har ett stort problem - det har mÄnga smutsiga sidor, sÄ den IO som dina klienter genererar stoppas effektivt, dvs applikationen har kommit för att skicka en sql-frÄga till databasen, den vÀntar. Alla in-/utdata till den har lÀgst prioritet, eftersom databasen Àr upptagen av en kontrollpunkt. Och nÀr hon blir klar Àr helt oklart. Och nÀr du har uppnÄtt icke-bakgrundsspolning, betyder det att all din IO Àr upptagen av den. Och tills det tar slut kommer du inte att göra nÄgot.

Det finns ytterligare tvÄ viktiga punkter hÀr som ligger utanför ramen för denna rapport. Dessa instÀllningar bör matcha instÀllningarna i postgresql.conf, det vill sÀga kontrollpunktersinstÀllningar. Och ditt disksystem mÄste vara tillrÀckligt konfigurerat. Om du har en cache pÄ en RAID mÄste den ha ett batteri. Folk köper RAID med bra cache utan batteri. Har du SSD:er i RAID sÄ mÄste de vara server, det mÄste finnas kondensatorer dÀr. HÀr Àr en detaljerad checklista. Den hÀr lÀnken innehÄller min rapport om hur man konfigurerar en prestandadisk i PostgreSQL. Det finns alla dessa checklistor dÀr.

Linux-instÀllning för att förbÀttra PostgreSQL-prestanda. Ilya Kosmodemyansky

Vad mer kan göra livet mycket svÄrt? Detta Àr tvÄ parametrar. De Àr relativt nya. Som standard kan de inkluderas i olika applikationer. Och de kan göra livet lika svÄrt om de sÀtts pÄ fel.

Linux-instÀllning för att förbÀttra PostgreSQL-prestanda. Ilya Kosmodemyansky

Det Àr tvÄ relativt nya saker. De har redan dykt upp i de tredje kÀrnorna. Detta Àr sched_migration_cost i nanosekunder och sched_autogroup_enabled, vilket Àr en som standard.

Och hur förstör de ditt liv? Vad Àr sched_migration_cost? PÄ Linux kan schemalÀggaren migrera en process frÄn en CPU till en annan. Och för PostgreSQL, som kör frÄgor, Àr det helt oklart att migrera till en annan CPU. Ur operativsystemsynpunkt, nÀr du byter fönster mellan openoffice och terminal, kan det hÀr vara bra, men för en databas Àr detta 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 betyda för schemalÀggaren? Det kommer att övervÀgas att processen fortfarande Àr varm under denna tid. Det vill sÀga, om du har en lÄngvarig transaktion som har gjort nÄgot under lÄng tid, kommer schemalÀggaren att förstÄ detta. Han kommer att anta att det inte finns nÄgot behov av att migrera denna process nÄgonstans tills denna timeout gÄr. Om samtidigt processen gör nÄgot, kommer den inte att migreras nÄgonstans, den kommer tyst att fungera pÄ CPU:n som tilldelades den. Och resultatet Àr utmÀrkt.

Den andra punkten Àr autogrupp. Det finns en bra idé för specifika arbetsbelastningar som inte Àr relaterade till moderna databaser - det hÀr Àr att gruppera processer efter den virtuella terminalen frÄn vilken de startas. Detta Àr praktiskt för vissa uppgifter. I praktiken Àr PostgreSQL ett multiprocesssystem med en förgaffel som körs frÄn en enda terminal. Du har en lÄsskrivare, kontrollpunkt och alla dina klientförfrÄgningar kommer att grupperas i en schemalÀggare per CPU. Och de kommer att vÀnta dÀr unisont pÄ att han ska bli fri, för att störa varandra och hÄlla honom sysselsatt lÀngre. Det hÀr Àr en historia som Àr helt onödig vid en sÄdan belastning och dÀrför mÄste den stÀngas av.

Linux-instÀllning för att förbÀttra PostgreSQL-prestanda. Ilya Kosmodemyansky

Min kollega Alexey Lesovsky gjorde tester med en enkel pgbench, dÀr han ökade migration_cost med en storleksordning och stÀngde av autogrupp. Skillnaden pÄ dÄlig hÄrdvara var nÀstan 10 %. Det pÄgÄr en diskussion pÄ postgres e-postlista dÀr mÀnniskor ger resultat av liknande förÀndringar av frÄgehastighet pÄverkade 50%. Det finns ganska mÄnga sÄdana historier.

Linux-instÀllning för att förbÀttra PostgreSQL-prestanda. Ilya Kosmodemyansky

Och slutligen, om energisparpolitik. Det som Àr bra Àr att Linux nu kan anvÀndas pÄ en bÀrbar dator. Och det kommer förmodligen att anvÀnda upp batteriet bra. Men plötsligt visar det sig att detta Àven kan hÀnda pÄ servern.

Dessutom, om du hyr servrar frÄn nÄgon vÀrd, sÄ bryr sig inte de "bra" vÀrdarna om att du har bÀttre prestanda. Deras uppgift Àr att se till att deras jÀrn utnyttjas sÄ effektivt som möjligt. DÀrför kan de som standard aktivera strömsparlÀge för bÀrbar dator pÄ operativsystemet.

Om du anvĂ€nder det hĂ€r pĂ„ en server med en databas under hög belastning, dĂ„ Ă€r ditt val acpi_cpufreq + permormance. Även med on-demand kommer det att finnas problem.

Intel_pstate Àr en lite annorlunda drivrutin. Och nu ges företrÀde Ät denna, eftersom den Àr senare och fungerar bÀttre.

Och följaktligen Àr guvernör bara prestation. Ondemand, energispar och allt annat handlar inte om dig.

Resultaten av den förklarade analysen PostgreSQL kan skilja sig Ät i flera storleksordningar om du aktiverar energisparlÀge, eftersom praktiskt taget CPU:n under din databas kommer att köras pÄ ett helt oförutsÀgbart sÀtt.

Dessa objekt kan inkluderas som standard. Titta noga för att se om de har aktiverat det som standard. Detta kan vara ett riktigt stort problem.

Linux-instÀllning för att förbÀttra PostgreSQL-prestanda. Ilya Kosmodemyansky

Och till sist ville jag sÀga tack till killarna frÄn vÄrt PosgreSQL-Consulting DBA-team, nÀmligen Max Boguk och Alexey Lesovsky, som gör framsteg i denna frÄga varje dag. Och vi försöker göra det bÀsta vi kan för vÄra kunder sÄ att allt fungerar för dem. Det Àr som med flygsÀkerhetsinstruktioner. Allt hÀr Àr skrivet i blod. Var och en av dessa nötter finns i processen med nÄgot slags problem. Jag delar dem gÀrna med dig.

FrÄgor:

Tack! Om till exempel ett företag vill spara pengar och placera databasen och applikationslogiken pÄ en server, eller om företaget följer den fashionabla trenden med mikrotjÀnstarkitekturer, dÀr PostgreSQL körs i en container. Vad Àr tricket? Sysctl kommer att pÄverka hela kÀrnan globalt. Jag har inte hört talas om att sysctls pÄ nÄgot sÀtt virtualiseras sÄ att de fungerar separat pÄ en container. Det finns bara en cgroup och det finns bara en del av kontrollen dÀr. Hur kan du leva med detta? Eller om du vill ha prestanda, kör PostgreSQL pÄ en separat hÄrdvaruserver och stÀll in den?

Vi besvarade din frĂ„ga pĂ„ ungefĂ€r tre sĂ€tt. Om vi ​​inte pratar om en hĂ„rdvaruserver som kan stĂ€llas in, etc., slappna av, allt kommer att fungera bra utan dessa instĂ€llningar. Om du har en sĂ„dan belastning att du behöver göra dessa instĂ€llningar, sĂ„ kommer du till jĂ€rnservern tidigare Ă€n till dessa instĂ€llningar.

Vad Ă€r problemet? Om detta Ă€r en virtuell maskin, kommer du troligen att ha mĂ„nga problem, till exempel med det faktum att pĂ„ de flesta virtuella maskiner Ă€r diskens latens ganska inkonsekvent. Även om diskgenomströmningen Ă€r bra, dĂ„ en misslyckad I/O-transaktion som inte i hög grad pĂ„verkar den genomsnittliga genomströmningen som skedde vid tidpunkten för kontrollpunkten eller i skrivande stund till WAL, dĂ„ kommer databasen att lida mycket av detta. Och du kommer att mĂ€rka detta innan du stöter pĂ„ dessa problem.

Om du har NGINX pÄ samma server kommer du ocksÄ att ha samma problem. Han kommer att kÀmpa för delat minne. Och du kommer inte till problemen som beskrivs hÀr.

Men Ä andra sidan kommer vissa av dessa parametrar fortfarande att vara relevanta för dig. Till exempel, stÀll in dirty_ratio med sysctl sÄ att det inte Àr sÄ tokigt - i alla fall kommer detta att hjÀlpa. PÄ ett eller annat sÀtt kommer du att ha interaktion med disken. Och det blir enligt fel mönster. Detta Àr i allmÀnhet en standard för parametrarna som jag visade. Och i alla fall Àr det bÀttre att Àndra dem.

Men det kan finnas problem med NUMA. VmWare, till exempel, fungerar bra med NUMA med exakt motsatta instÀllningar. Och hÀr mÄste du vÀlja - en jÀrnserver eller en icke-jÀrnserver.

Jag har en frÄga relaterad till Amazon AWS. De har bilder förkonfigurerade. En av dem heter Amazon RDS. Finns det nÄgra anpassade instÀllningar för deras operativsystem?

Det finns instÀllningar dÀr, men det Àr olika instÀllningar. HÀr konfigurerar vi operativsystemet i termer av hur databasen kommer att anvÀnda denna sak. Och det finns parametrar som avgör vart vi ska gÄ nu, som att forma. Det vill sÀga, vi behöver sÄ mycket resurser, vi kommer nu att Àta upp dem. Efter detta drar Amazon RDS Ät dessa resurser, och prestandan sjunker dÀr. Det finns individuella historier om hur folk börjar brÄka med den hÀr saken. Ibland till och med ganska framgÄngsrikt. Men detta har inget med OS-instÀllningar att göra. Det Àr som att hacka molnet. Det Àr en annan historia.

Varför har Transparenta enorma sidor ingen effekt jÀmfört med Huge TLB?

Ge inte. Detta kan förklaras pÄ mÄnga sÀtt. Men i sjÀlva verket ger de det helt enkelt inte. Vad Àr historien om PostgreSQL? Vid start allokerar den en stor bit delat minne. Om de Àr genomskinliga eller inte Àr helt irrelevant. Att de sticker ut i början förklarar allt. Och om det finns mycket minne och du behöver bygga om segmentet shared_memory, kommer Transparenta enorma sidor att vara relevanta. I PostgreSQL Àr det helt enkelt allokerat i en stor bit i början och det Àr det, och sedan hÀnder inget speciellt dÀr. Du kan naturligtvis anvÀnda det, men det finns en chans att fÄ en korruption av shared_memory nÀr den omfördelar nÄgot. PostgreSQL kÀnner inte till detta.

KĂ€lla: will.com

LĂ€gg en kommentar