PostgreSQL jÔudluse parandamiseks mÔeldud Linuxi hÀÀlestus. Ilya Kosmodemyanski

2015. aasta Ilya Kosmodemyanski ettekande "PostgreSQL jÔudluse parandamiseks mÔeldud Linuxi hÀÀlestus" kokkuvÔte

KliĆĄee: Tahan mĂ€rkida, et see ettekand on dateeritud 2015. aasta novembrisse — on möödunud ĂŒle 4 aasta ja palju on juhtunud. Ettekandes kĂ€sitletud versioon 9.4 ei ole enam toetatud. Viimase 4 aasta jooksul on ilmunud 5 uut PostgreSQL versiooni ning 15 Linuxi tuuma versiooni. Kui neid kohti ĂŒle kirjutada, saame lĂ”puks teistsuguse ettekande. Kuid siin kĂ€sitletakse Linuxi pĂ”hihÀÀlestust PostgreSQL jaoks, mis on endiselt aktuaalne.

PostgreSQL jÔudluse parandamiseks mÔeldud Linuxi hÀÀlestus. Ilya Kosmodemyanski


Vaata videot

Minu nimi on Ilya Kosmodemyanski. Töötan ettevĂ”ttes PostgreSQL-Consulting. TĂ€na rÀÀgin pisut, mida teha Linuxiga, mis puudutab andmebaase ĂŒldiselt ja PostgreSQL-i konkreetselt, kuna pĂ”himĂ”tted on ĂŒsna sarnased.

Millest me rÀÀgime? Kui suhtlete PostgreSQL-iga, tuleb mingil mÀÀral olla UNIX-i administraator. Mis see tÀhendab? Kui vÔrrelda Oracle'i ja PostgreSQL-i, peab Oracle'is olema 80% andmebaasi DBA ja 20% Linuxi administraator.

PostgreSQL on natuke keerulisem. PostgreSQL-i puhul peab Linuxi toimimisest palju paremini aru saama. Ja samas peab veidi jÀrele jÔudma, kuna viimasel ajal on toimunud palju vÀrskendusi. Uued tuumad ilmuvad, uus funktsionaalsus tuleb, jÔudlus paraneb jne.

Miks me rÀÀgime Linuxist? Mitte sellepĂ€rast, et oleme Linuxi konverentsil Peterburis, vaid sellepĂ€rast, et tĂ€napĂ€eva tingimustes on ĂŒks kĂ”ige pĂ”hjendatumaid operatsioonisĂŒsteeme andmebaaside ning eelkĂ”ige PostgreSQL-i jaoks – just Linux. Kuna FreeBSD, kahjuks, areneb mingis vĂ€ga kummalises suunas. Ja tulevad probleemid nii jĂ”udluse kui paljude muude asjadega. PostgreSQL-i jĂ”udlus Windowsis – see on ĂŒldse eraldi karm teema, mis sĂ”ltub siitĂ€, et Windowsil ei ole sellist jagatud mĂ€lu nagu UNIX-il, ja PostgreSQL pĂ”hineb just sellel, kuna see on mitme protsessi sĂŒsteem.

Ja eksootika, nagu Solaris, usun ma, huvitab vÀhem inimesi, seega liikume edasi.

PostgreSQL jÔudluse parandamiseks mÔeldud Linuxi hÀÀlestus. Ilya Kosmodemyanski

Kaasaegsetel Linuxi jaotustel on ĂŒle 1000 syctl parameetri, sĂ”ltuvalt sellest, kuidas tuuma kokku panna. Kui vaatame erinevaid seadeid, saame neid veel paljusid viise kohandada. On olemas failisĂŒsteemi parameetreid, nĂ€iteks kuidas mĂ€lu mountida. Kui tekib kĂŒsimusi, kuidas kĂ€ivitada: mida BIOSis aktiveerida, kuidas riistvara konfigureerida jne.

See on vĂ€ga suur teema, millest vĂ”iks rÀÀkida mitu pĂ€eva, mitte ĂŒhe lĂŒhikese ettekande jooksul, aga ma peatun praegu olulistel punktidel, kuidas vĂ€ltida neid takistusi, mis kindlasti ei luba teil hĂ€sti hallata andmebaasi Linuxis, kui te neid ei paranda. Oluline on ka see, et paljud parameetrid on vaikimisi seatud mitte just sellistele seadistustele, mis sobiksid andmebaasi jaoks. T. e. vaikimisi töötab see halvasti vĂ”i ei tööta ĂŒldse.

PostgreSQL jÔudluse parandamiseks mÔeldud Linuxi hÀÀlestus. Ilya Kosmodemyanski

Millised on traditsioonilised hÀÀlestusobjektid Linuxis? Arvan, et kuna te kÔik tegelete Linuxi haldamisega, pole eriti vaja selgitada, mis on hÀÀlestusobjektid.

Saab hÀÀlestada:

  • CPU.
  • MĂ€lu.
  • Salvestus.
  • Muud. Sellega rÀÀgime lĂ”pus naljana. NĂ€iteks vĂ”ivad sellised parameetrid nagu energiasÀÀstupoliitika mĂ”jutada jĂ”udlust vĂ€ga ettearvamatult ja mitte kĂ”ige meeldivamal viisil.

PostgreSQL jÔudluse parandamiseks mÔeldud Linuxi hÀÀlestus. Ilya Kosmodemyanski

Milline on PostgreSQL'i ja andmebaasi eripĂ€ra ĂŒleĂŒldiselt? Probleem on selles, et ei saa reguleerida mĂ”nda ĂŒksikut mutrit ja vaadata, kas jĂ”udlus on oluliselt paranenud.

Jah, selliseid mutreid on, kuid andmebaas on keeruline asi. See suhtleb kĂ”igi serveri ressurssidega ja eelistab suhelda tĂ€ielikult. Kui vaatate Oracle'i tĂ€napĂ€evaseid soovitusi, kuidas kasutada hostitud OS-i, siis see meenutab nalja mongoli kosmonautidest – sööta koera ja mitte midagi puudutada. Anname andmebaasile kĂ”ik ressursid, andmebaas lahendab kĂ”ik ise.

PÔhimÔtteliselt on PostgreSQL-il samasugune olukord. Erinevus seisneb selles, et andmebaas ei oska endale kÔiki ressursse ise vÔtta, st kuskil tuleb Linuxi tasandil ise kÔik Àra lahendada.

PĂ”himĂ”te on mitte valida ĂŒhte spetsiifilist sihtmĂ€rki ja hakata seda hÀÀlestama, nĂ€iteks mĂ€lu, CPU vĂ”i midagi sarnast, vaid analĂŒĂŒsida töökoormust ja pĂŒĂŒda maksimaalselt parandada lĂ€bilaskevĂ”imet, et meie andmebaas suudaks kĂ”ige efektiivsemalt hallata koormust, mille head programmeerijad meile loonud on, sealhulgas meie kasutajad.

PostgreSQL jÔudluse parandamiseks mÔeldud Linuxi hÀÀlestus. Ilya Kosmodemyanski

Siin on selline joonis, et selgitada, mis see on. On olemas Linuxi OS puhverside, jagatud mÀlu ja jagatud puhver PostgreSQL-is. PostgreSQL erinevalt Oracle'ist töötab otse ainult tuumapuhverside kaudu, st et leht peab diskilt jÔudma tema jagatud mÀllu, mis tÀhendab, et see peab lÀbima kernel bufferi ja sama kehtib tagasitee kohta.

Selle sĂŒsteemi all elavad kettad. Joonistasin selle ketaste kujul. Tegelikult vĂ”ivad seal olla RAID-kontroller jne.

Ja see sisend-vÀljund toimub kas vÔi mingil viisil selle kaudu.

PostgreSQL on klassikaline andmebaas. Seal sees on lehed. KÔik sisend-vÀljund toimub lehtede kaudu. Me tÔstame lehti mÀllu. Ja kui midagi ei juhtunud, siis me lihtsalt lugesime neid, siis nad aeglaselt kaovad sellest vahemÀlust, jagatud puhverdest ja naasevad kettale.

Kui me kuskil midagi asendasime, siis kogu leht mĂ€rgitakse mustaks. Ma mĂ€rkisin need siin sinise vĂ€rviga. Ja see tĂ€hendab, et see leht peab olema sĂŒnkroniseeritud plokkide salvestamisega. St kui me selle mustaks tegime, siis tegime kirje WAL-sse. Ja mingil hetkel tekkis nĂ€htus nimega checkpoint. Ja sellesse logisse sai kirja teave selle kohta, et see on toimunud. Ja see tĂ€hendab, et kĂ”ik mustad lehed, mis seal sel hetkel olid jagatud puhverdes, sĂŒnkroniseeriti kettaga salvestamisega fsync kaudu kernel'i puhvri abil.

Miks seda tehakse? Kui meil on elektrikatkestus, ei pea me muretsema, et kĂ”ik andmed on kadunud. Perpetuaalne mĂ€lu, millest me kĂ”ik oleme kuulnud, on praegu rohkem teoreetiline mĂ”te – see on helge tulevik, mille poole me loomulikult pĂŒĂŒame ja mis meile meeldib, kuid seni elame me ikka veel 20 aastat minevikus. Ja seda tuleb jĂ€lgida.

KĂŒsimus, kuidas maksimeerida lĂ€bilaskevĂ”imet, on hÀÀlestada kĂ”ik need etapid nii, et kĂ”ik liiguks kiiresti edasi-tagasi. Jagatud mĂ€lu pĂ”hineb peamiselt lehekĂŒlje puhvritel. PostgreSQL-is saadame pĂ€ringu select, see toob andmed kettalt. Need jĂ”uavad jagatud puhvritesse. Seega, et see paremini töötaks, peab olema palju mĂ€lu.

Kuna kĂ”ik toimiks hĂ€sti ja kiiresti, peate operatsioonisĂŒsteemi kĂ”igil etappidel Ă”igesti seadistama. Samuti tuleb tasakaalustada riistvara, sest kui mĂ”nes kohas on tasakaaluhĂ€ired, vĂ”ite kĂŒll omada suurt mĂ€lu, kuid see töötab siiski aeglaselt.

Ja vaatame iga punkti lÀhemalt.

PostgreSQL jÔudluse parandamiseks mÔeldud Linuxi hÀÀlestus. Ilya Kosmodemyanski

Ette need lehed kiiremini liikuda saaks, tuleb saavutada jÀrgmised tingimused:

  • Esiteks tuleb tĂ”husamalt töötada mĂ€luga.
  • Teiseks peab see ĂŒleminek olema efektiivsem, kui lehed mĂ€lust kĂ”vakettale jĂ”uavad.
  • Ja kolmandaks peavad olema kvaliteetsed kĂ”vakettad.

Kui teil on 512 GB RAM-i serveril ja kÔik see jÔuab lÔpuks SATA kÔvakettale ilma igasuguse vahemÀluta, siis muutub kogu andmebaasiserver mitte ainult kÔrvitsaks, vaid kÔrvitsaks SATA liidesega. Te peate sellega otse kokku puutuma. Ja miski ei pÀÀsta teid sellest.

PostgreSQL jÔudluse parandamiseks mÔeldud Linuxi hÀÀlestus. Ilya Kosmodemyanski

Esimese punkti osas mÀlust on kolm asja, mis vÔivad elu oluliselt raskendada.

Esimene neist on NUMA. NUMA on sĂŒsteem, mis on loodud tulemuslikkuse parandamiseks. sĂ”ltuvalt töökoormusest saab erinevaid asju optimeerida. Ja oma praeguses vormis ei ole see andmebaasi rakenduste jaoks, mis kasutavad intensiivselt lehekĂŒlje vahemĂ€lu ja jagatud puhvreid, just eriti kasulik.

PostgreSQL jÔudluse parandamiseks mÔeldud Linuxi hÀÀlestus. Ilya Kosmodemyanski

Kahe sĂ”naga. Kuidas mĂ”ista, et NUMA-ga on midagi valesti? Teil on ebamugav mĂŒra, Ă€kki avastate, et mĂ”ni CPU on ĂŒlekoormatud. Samas analĂŒĂŒsite PostgreSQL-i pĂ€ringuid ja nĂ€ete, et seal pole midagi sellist. Need pĂ€ringud ei tohiks CPU-d nii intensiivselt koormata. Sellist olukorda on kaua raske tabada. Lihtsam on algusest peale kasutada Ă”iget soovitust NUMA seadistamiseks PostgreSQL jaoks.

PostgreSQL jÔudluse parandamiseks mÔeldud Linuxi hÀÀlestus. Ilya Kosmodemyanski

Mis tegelikult toimub? NUMA on Non-Uniform Memory Access. Mis on selle mÔte? Teil on CPU, mille lÀheduses on tema kohaliku mÀlu. Ja see mÀlu interconnects vÔib tuua mÀlu teistelt CPU-delt.

Kui kĂ€ivitate numactl --hardware, siis nĂ€ete suurt vĂ€ljatrĂŒkki. Muuhulgas on seal ka kauguste vĂ€li. Seal on numbrid - 10-20, midagi sellist. Need numbrid on ĂŒksnes hĂŒpetega, et seda kauget mĂ€lu ĂŒhenduda ja kohalikult kasutada. Üldiselt on see hea idee. See kiirendab tĂ”husust teatud koormuste puhul.

Kujutage nĂŒĂŒd ette, et teil on ĂŒks CPU, mis esmalt proovib kasutada oma lokaalset mĂ€lu ja seejĂ€rel pĂŒĂŒab interconnect'i kaudu tĂ”mmata teist mĂ€lu millegi jaoks. Ja kĂ”ik teie PostgreSQL page cache'i mahud jĂ”uavad selle CPU-ni – paar gigabaiti. Te saate alati halva tulemuse, sest selle mĂ€lu mooduli kohta on CPU-s tavaliselt vĂ€he mĂ€lurubit. Ja kogu mĂ€lu, mida teenindatakse, liigub lĂ€bi nende interconnect'ide. Tulemuseks on aeglane ja kurb olukord. Teie protsessor, mis teenindab seda sĂ”lme, on pidevalt ĂŒle koormatud. Ja selle mĂ€lu ligipÀÀsu aeg – halb ja aeglane. See on olukord, mida te ei soovi, kui kasutate seda andmebaasi jaoks.

SeetĂ”ttu on andmebaasi jaoks Ă”igem lahendus, et Linuxi operatsioonisĂŒsteem ei teaks ĂŒldse, mis toimub. Et ta kĂ€sitleks mĂ€lu sama moodi nagu tavaliselt.

Miks on nii? Tundub, et peaks olema vastupidi. See juhtub ĂŒhel lihtsal pĂ”hjusel – me vajame page cache'i jaoks palju mĂ€lu – kĂŒmneid, sadu gigabaiti.

Ja kui me oleme kÔik need andmed vÀlja tÔstnud ja vahemÀcacheerinud, siis kasu vahemÀcacheerimise kasutamisest on mÀrkimisvÀÀrselt suurem kui sellisest nutikast mÀluhaldusest saadud kasu. Nii saavutame me vÔidu, mis ei ole vÔrreldav selle uue mÀluhaldurimeetodi tÔhusama rakendamisega NUMA abil.

Teisest kĂŒljest on sel hetkel kaks lĂ€henemist, kuni helge tulevik saabub ja andmebaas oskab ise aru saada, millistel CPU-del ta töötab ja kust tal midagi tĂ”mmata on vaja.

PostgreSQL jÔudluse parandamiseks mÔeldud Linuxi hÀÀlestus. Ilya Kosmodemyanski

Seega on Ă”ige lĂ€henemine NUMA tĂ€ielik vĂ€ljalĂŒlitamine., nĂ€iteks taaskĂ€ivitamisel. Enamasti on kasu nii suur, et pole ĂŒldse kĂŒsimust, kuidas paremini toimida.

On olemas teine variant. Me kasutame seda tihedamini kui esimest, kuna kui klient meie tugiteenusele tuleb, on serveri taaskĂ€ivitamine tema jaoks suur probleem. Tal on seal Ă€ri kĂ€imas. Ja NUMA probleemide tĂ”ttu nad kannatavad. SeetĂ”ttu pĂŒĂŒame vĂ€hem invasiivsete meetoditega vĂ€lja lĂŒlitada, kui taaskĂ€ivitamine, kuid siin tuleb ettevaatlikult kontrollida, et see tĂ”esti vĂ€lja lĂŒlitus. Kuna kogemus nĂ€itab, et kui me vĂ€lja lĂŒlitame vanema PostgreSQL NUMA protsessi, siis see on hea, kuid pole sugugi kindel, et see töötab. Tuleb kontrollida ja vaadata, et see tĂ”epoolest vĂ€lja lĂŒlitus.

On olemas hea postitus Robert Haasilt. Ta on ĂŒks PostgreSQL-i arendajatest. Üks vĂ”tme arendaja kĂ”igist madalate tasemete tööriistadest. Ja kui selle postituse linkide kaudu edasi liikuda, siis seal on mitmeid vĂ€rvikaid lugusid selle kohta, kuidas NUMA inimese elu keerulisemaks tegi. Vaadake, uurige sĂŒsteemiadministraatorite kontrollnimekirja, mida serveris seadistada, et meie andmebaas hĂ€sti töötaks. Need seadistused tuleb ĂŒles kirjutada ja kontrollida, sest muidu ei ole asjad head.

MĂ€rgin Ă€ra, et see kehtib kĂ”ikide seadistuste kohta, millest ma rÀÀgin. Kuid tavaliselt kogutakse andmebaase master-slave reĆŸiimis, et tagada tĂ”rketaluvus. Ärge unustage neid seadistusi slave'ile teha, sest ĂŒhel hetkel vĂ”ib teil juhtuda Ă”nnetus, te lĂŒlitate ĂŒle slave'ile ja see saab masteriks.

Kriitilises olukorras, kui kĂ”ik on vĂ€ga halvasti, heliseb teie telefon pidevalt ja ĂŒlemus jookseb kohale suures kĂ€es, teil pole aega mĂ”elda, et kontrollida. Ja tulemused vĂ”ivad olla vĂ€ga kahetsusvÀÀrsed.

PostgreSQL jÔudluse parandamiseks mÔeldud Linuxi hÀÀlestus. Ilya Kosmodemyanski

J ŃĐ»Đ”ĐŽŃƒŃŽŃ‰ĐžĐč ĐŒĐŸĐŒĐ”ĐœŃ‚ – ŃŃ‚ĐŸ huge pages. Huge pages on keeruline eraldi testida, ega sellel pole mĂ”tet, kuigi on bĂ€nkmĂ€rgid, mis oskavad seda teha. Need on kergesti ĂŒlesleitavad.

Mis mĂ”te on? Teil on mitte vĂ€ga kallis server, millel on palju RAMi, nĂ€iteks rohkem kui 30 GB. Te ei kasuta huge pages. See tĂ€hendab, et teil on kindlasti mĂ€lukasutuse ĂŒlekatte. Ja see ĂŒlekaal ei ole sugugi meeldiv.

PostgreSQL jÔudluse parandamiseks mÔeldud Linuxi hÀÀlestus. Ilya Kosmodemyanski

Miks nii on? Mis toimub? OperatsioonisĂŒsteem eraldab mĂ€lu vĂ€ikeste tĂŒkkidena. See on mugav ja nii on ajalooliselt kujunenud. Kui vaadata sĂŒgavamale, peab OS tĂ”lkima virtuaalsed aadressid fĂŒĂŒsilisteks. See ei ole kĂ”ige lihtsam protsess, mistĂ”ttu OS talletab selle operatsiooni tulemuse Translation Lookaside Buffer (TLB) mĂ€llu.

Kuna TLB on vahemĂ€lu, siis sellises olukorras tekivad kĂ”ik vahemĂ€lu probleemid. Esiteks, kui teil on vĂ€ga palju raamatu mĂ€lu ja see on kĂ”ik jaotatud vĂ€ikesteks tĂŒkkideks, siis muutub see vahemĂ€lu vĂ€ga suureks. Ja kui vahemĂ€lu on suur, siis on selle otsimine aeglasem. Üksus on suur ja see ise tarvitab ruumi, st. midagi vale kasutab operatiivmĂ€lu. See on esimene asi.

Teiseks, mida suuremaks kasvab vahemĂ€lu, seda tĂ”enĂ€olisem on, et teil tekivad vahemĂ€lu tabamised (cache misses). Ja selle vahemĂ€lu efektiivsus langeb kiiresti koos selle suuruse kasvuga. SeetĂ”ttu on operatsioonisĂŒsteemides vĂ€lja töötatud lihtne lĂ€henemine. Linuxis on see juba ammu kasutusel. FreeBSD-s ilmus see mitte nii kaua aega tagasi. Kuid me rÀÀgime samuti Linuxist. See on huge pages.

Siin tuleb mÀrkida, et huge pages, kui idee, sai algselt propageeritud kogukondade poolt, kuhu kuulusid Oracle ja IBM, st andmebaasi tootjad mÔtlesid tÔsiselt, et see tuleb kasuks, sealhulgas andmebaasidele.

PostgreSQL jÔudluse parandamiseks mÔeldud Linuxi hÀÀlestus. Ilya Kosmodemyanski

Kuidas neid PostgreSQL'iga kooskĂ”lastada? Esiteks peavad Linuxi tuumas olema sisse lĂŒlitatud huge pages.

Teiseks peavad need olema selgelt mÀÀratletud sysctl parameetriga – kui palju neid on. Numbrid on siin mĂ”nelt vanalt serverilt. Saate arvutada, kui palju teie shared buffers ligikaudu on, et huge pages sinna sisse mahuks.

Ja kui kogu server on pĂŒhendatud PostgreSQL'ile, siis hea lĂ€htepunkt on kas 25% RAM-ist jagada shared buffersi jaoks vĂ”i 75%, kui olete kindel, et teie andmebaas mahtus kindlasti sellesse 75%. See on esimene lĂ€htepunkt. Ja arvutage, kui teil on 256 GB RAM-i, siis vastavalt on 64 GB teie shared bufferseid. Arvutage see mĂ”ningase varuga – mis numbriks peaks see olema seatud.

Versioonis 9.2 (kui ma ei eksi, alates versioonist 8.2) oli vĂ”imalik PostgreSQL ĂŒhendada huge pages'i abil kolmanda osapoole teegi kaudu. Seda on alati vajalik teha. Esiteks peab tuuma suudma Ă”igesti jaotada huge pages'e. Teiseks peab rakendus, mis nendega töötab, olema suuteline neid kasutama. Muul juhul nad ei tööta. Kuna PostgreSQL jagas mĂ€lu system 5 stiilis, oli selleks vĂ”imalik kasutada libhugetlbfs'i — see on teegi tĂ€isnimi.

Versioonis 9.3 parandati PostgreSQL-i jĂ”udlust mĂ€lu haldamisel ja loobuti system 5 mĂ€lu jaotamise meetodist. KĂ”ik olid vĂ€ga Ă”nnelikud, sest muidu proovid kĂ€ivitada kahte PostgreSQL'i eksemplari ĂŒhel masinal, ja ta ĂŒtleb, et mul pole jagatud mĂ€lu piisavalt. Ja ĂŒtleb, et sysctl'i tuleb parandada. Seal on selline sysctl, et tuleb veel taaskĂ€ivitada jms. ÜhesĂ”naga, kĂ”ik rÔÔmustasid. Kuid mĂ€luhalduse mmap rikkus huge pages'i kasutamise. Enamik meie kliente kasutab suuremaid jagatud puufe. Ja me soovisime tungivalt, et nad ei ĂŒleminekuks versioonile 9.3, sest seal algas overhead mĂ€rkimisvÀÀrselt kasvama.

Kuid siiski pöördus community selle probleemi poole ja 9.4 versioonis tehti sellele ĂŒritusele vĂ€ga head muudatused. Samuti ilmus 9.4-s postgresql.conf failis parameeter, millega saab aktiveerida try, on vĂ”i off.

Try on kĂ”ige ohutum parameeter. PostgreSQL-i kĂ€ivitamisel, kui see eraldab jagatud mĂ€lu, ĂŒritab ta saada mĂ€lumahtu huge pages’ist. Ja kui see ei Ă”nnestu, siis kukub tagasi tavalisse eraldamisse. Ja kui teil on FreeBSD vĂ”i Solaris, siis vĂ”ite kasutada try-d, see on alati ohutu.

Kui on, siis see lihtsalt ei kĂ€ivitu, kui ei suuda huge pages’ist eraldada. Siin on juba see, mis kellelegi sobib. Kuid kui teil on try, siis kontrollige, et teil on tĂ”eliselt vajalik mĂ€lu eraldatud, sest seal on palju vigu. Praegu töötab see funktsionaalsus ainult Linuxis.

Veel ĂŒks vĂ€ike mĂ€rkus, enne kui edasi liigume. Transparent huge pages ei kehti PostgreSQL jaoks praegu. Ta ei saa neid normaalselt kasutada. Ja Transparent huge pages puhul sellise töökoormuse korral, kus vajatakse suurt osa jagatud mĂ€lu, toovad kasu ainult vĂ€ga suurte mahtude korral. Kui teil on terabaite mĂ€lu, siis vĂ”ib see mĂ€ngida rolli. Kui rÀÀgime tavalisematest rakendustest, kus teil on masinas 32, 64, 128, 256 GB mĂ€lu, on tavalised huge pages tĂ€iesti piisavad, ning Transparent lihtsalt keelame.

PostgreSQL jÔudluse parandamiseks mÔeldud Linuxi hÀÀlestus. Ilya Kosmodemyanski

Ja viimane asi, mis on seotud mÀluga, ei ole otseselt seotud lÀbilaskevÔimega, kuid vÔib elu vÀga keeruliseks teha. Kogu lÀbilaskevÔime kannatab tÔsiselt, kui server pidevalt vahetab.

Ja ja see toob kaasa mitmeid ebamugavusi. Peamine probleem seisneb selles, et tĂ€napĂ€evaste kernide kĂ€itumine erineb natuke vanematest Linuxi kernidest. See on asi, millele astuda on ĂŒsna ebameeldiv, sest kui me rÀÀgime swap'iga töötamisest, lĂ”ppeb see mitte Ă”igeaegse OOM-killer'i saabumisega. Ja OOM-killer, kes ei saabu Ă”igel ajal ja kutsub PostgreSQL-i kokku kukkuma, on ebameeldiv. Sellest saavad teada kĂ”ik, st viimase kasutajani.

PostgreSQL jÔudluse parandamiseks mÔeldud Linuxi hÀÀlestus. Ilya Kosmodemyanski

Mis toimub? Teie serveris on suur hulk RAMi ja kÔik töötab hÀsti. Kuid mingil pÔhjusel seisab server swap'is ja aeglustub seetÔttu. Tundub, et mÀlu on palju, aga see juhtub siiski.

PostgreSQL jÔudluse parandamiseks mÔeldud Linuxi hÀÀlestus. Ilya Kosmodemyanski

Varem soovitasime vm.swappiness seada nulli, st swap vĂ€lja lĂŒlitada. Varem tundus, et 32 GB RAM ja vastavad jagatud pu Buffers on tohutu hulk. Swap'i peamine eesmĂ€rk on lihtsalt saata kernel kuhugi, kui meil on probleem. Ja see polnud enam eriti vajalik. Ja siis, mida sa selle keregiga teed? See on juba selline ĂŒlesanne, kus pole eriti selge, miks swap sellise suurusega vajalik on.

Kuid kaasaegsetes, st kolmandates tuumaversioonides on kĂ€itumine muutunud. Ja kui seadistada swap nulliks, st vĂ€lja lĂŒlitada, siis varem vĂ”i hiljem hakkab isegi vĂ€ikese mĂ€lusisalduse juures OOM-killer teie juurde tulema, et kĂ”rvaldada kĂ”ige intensiivsemad mĂ€lukasutajad. Ta arvab, et sellise koormuse korral on meil veel vĂ€he ja me lĂ€heme ĂŒle, st mitte sĂŒsteemi protsessi tappa, vaid tappa midagi vĂ€hem tĂ€htsat. Selleks vĂ€hem oluliseks osutub intensiivne jagatud mĂ€lu kasutaja, nimelt postmaster. Ja peale seda on hea, kui andmebaasi ei pea taastama.

SeetĂ”ttu on nĂŒĂŒd vaikesĂ€tteid, kui ma Ă”igesti mĂ€letan, enamus distributsioonides umbes 6, st millal hakata swap-i kasutama sĂ”ltuvalt sellest, kui palju mĂ€lu on jÀÀnud. KĂ€esoleval hetkel soovitame seadistada vm.swappiness = 1, sest see praktiliselt lĂŒlitab selle vĂ€lja, kuid ei pĂ”hjusta selliseid efekte, nagu ootamatult saabunud OOM-killer, kes kĂ”ik need asjad kĂ”rvaldada.

PostgreSQL jÔudluse parandamiseks mÔeldud Linuxi hÀÀlestus. Ilya Kosmodemyanski

Mis edasi? Kui rÀÀgime andmebaaside jÔudlusest ja jÀrk-jÀrgult liigume ketaste poole, hakkavad kÔik pead kinni haarama. Sest tÔde, et ketas on aeglane ja mÀlu kiire, on kÔigile lapsest peale tuttav. Ja kÔik teavad, et andmebaasis on ketta jÔudluse probleemid.

Peamine PostgreSQL-i jĂ”udluse probleem, mis on seotud checkpoints'i tĂ”usudega, ei tulene sellest, et ketas on aeglane. Pigem on see tingitud sellest, et mĂ€lu ja ketta lĂ€bilaskevĂ”ime ei ole tasakaalus. Samuti vĂ”ivad need olla tasakaalus eri kohtades. PostgreSQL ei ole seadistatud, operatsioonisĂŒsteem ei ole seadistatud, riistvara ei ole seadistatud ja riistvara on vale. Seda probleemi ei tekki ainult siis, kui kĂ”ik toimub nii nagu peab, st kas koormust ei ole vĂ”i seadistused ja riistvara on hĂ€sti valitud.

PostgreSQL jÔudluse parandamiseks mÔeldud Linuxi hÀÀlestus. Ilya Kosmodemyanski

Mis see on ja kuidas see vĂ€lja nĂ€eb? Tavaline on, et inimesed, kes töötavad PostgreSQL-iga, on sellesse protsessi korduvalt astunud. Selgitaksin. Nagu ma ĂŒtlesin, teeb PostgreSQL perioodiliselt checkpoint'e, et mÀÀrdunud lehed jagatud mĂ€lust kettale salvestada. Kui meil on suur jagatud mĂ€lu maht, hakkab checkpoint intensiivselt kettale mĂ”juma, sest see salvestab need lehed fsync'i kaudu. Need jĂ”uavad kernel'i puutasse ja kirjutatakse kettale fsync'i abil. Ja kui selle protsessi maht on suur, vĂ”ime tĂ€heldada ebameeldivat efekti, nimelt vĂ€ga suurt kettakasutust.

Siin on mul kaks pilti. Selgitan nĂŒĂŒd, mis need on. Need on kaks ajaliselt korreleeritud graafikut. Esimene graafik – see on kettakasutus. Siin ulatub see peaaegu 90%-ni antud hetkel. Kui teie andmebaasil on fĂŒĂŒsilised kettad ja RAID-kontrolleri kettakasutus on 90% ulatuses, siis on see halvad uudised. See tĂ€hendab, et veel natuke ja jĂ”uame 100% ja sisendi-vĂ€ljundi protsess peatus.

Kui teil on kettamassiiv, siis seal on lugu natuke erinev. Seal sÔltub see sellest, kuidas see on seadistatud, milline massiiv see on jne.

Siin on samal ajal konfigureeritud graafik sisemisest postgres'i vaatepunktist, mis nĂ€itab, kuidas kontrollpunkt toimub. Roheline vĂ€rv nĂ€itab, kui palju puhverdusi, neid mÀÀrdunud lehti, on sellel hetkel kontrollpunktis sĂŒnkroniseerimiseks saabunud. See on peamine, mida siin on vaja teada. NĂ€eme, et meil on siin palju lehti saabunud ja mingil hetkel tĂ”ukame piiri, st kirjutame-kirjutanud, siin on selgelt kett sĂŒsteem vĂ€ga hĂ”ivatud. Kontrollpunkt mĂ”jutab diskimist tugevalt. Ideaalis peaks olukord vĂ€lja nĂ€gema pigem nii, et meil oleks siin vĂ€hem kirjutamist. Saame seadistustega seda parandada, et tulevikus nii oleks. St madal kasutamine, kuid midagi me siin kirjutame.

Mida teha, et selle probleemi vÔita? Kui teie andmebaasi all IO peatub, tÀhendab see, et kÔik kasutajad, kes tulid oma pÀringute tÀitmiseks, peavad ootama.

PostgreSQL jÔudluse parandamiseks mÔeldud Linuxi hÀÀlestus. Ilya Kosmodemyanski

Kui vaadata Linuxi perspektiivist, siis kui oled vĂ”tnud hea riistvara, seadisti selle Ă”igesti ning seadisti PostgreSQL nii, et ta teeks checkpoint'e harvemini, lahutades need ajas ĂŒksteisest, siis satud debiani vaikesĂ€tetele. Enamikus Linuxi distributsioonides on selline pilt: vm.dirty_ratio=20, vm.dirty_background_ratio=10.

Mida see tĂ€hendab? Alates tuumast 2.6 ilmus ĂŒks daemon andmete eemaldamiseks. Pdglush sĂ”ltuvalt sellest, kes mida kasutab, tegeleb ta töökeskkonnas mustade lehtede eemaldamisega kernel-buffersist ja eemaldamisega, kui tuleb igal juhul mustade lehtede eemaldamine, kui juba taustal toimub eemaldamine ei aita.

Millal toimub taustaline tegevus? Kui 10% kogu serveri RAM-st on hĂ”ivatud mustade lehtedega kernel-bufferis, siis kutsutakse esile eriline funktsioon taustal eemaldamiseks. Miks see on taustaline? Ta vĂ”tab parameetrina, kui palju lehti eemaldada. Ja ĂŒtleme, et eemaldab N lehte. Ja mĂ”neks ajaks see asi uinub. Siis tuleb see jĂ€lle tagasi ja eemaldab veel mingi arvu lehti.

See on ĂŒlimalt lihtne lugu. Siin on ĂŒlesanne nagu basseiniga, kus ĂŒhte toru valatakse, ĂŒhest torust voolab vĂ€lja. Meil on checkpoint ja kui ta on saatnud liiga vĂ€he mÀÀrdunud lehti Ă€raviskamiseks, siis need hakkavad jĂ€rk-jĂ€rgult kernel bufferist pgflush'ist kenasti laiali minema.

Kui need mÀÀrdunud lehed jĂ€tkavad kogunemist, kogunevad nad 20%-ni, siis on operatsioonisĂŒsteemil prioriteet need kirjutada kettale, sest toide vĂ”ib katkeda ja siis on meil kĂ”ik halvasti. Kaotame need andmed, nĂ€iteks.

Mis on trikk? Trikk seisneb selles, et need parameetrid, 20% ja 10% kogu masina operatiivmĂ€lu kohta, on tĂ€iesti uskumatu diskisĂŒsteemi lĂ€bilaskevĂ”ime seisukohast.

Kujutage ette, et teil on 128 GB operatiivmĂ€lu. 12,8 GB jĂ”uab teie kettasĂŒsteemi. Ja sĂ”ltumata sellest, milline vahemĂ€lu teil seal on, ei talu nad nii palju.

PostgreSQL jÔudluse parandamiseks mÔeldud Linuxi hÀÀlestus. Ilya Kosmodemyanski

SeetÔttu soovitame need numbrid seadistada kohe vastavalt teie RAID-kontrolleri vÔimalustele. Mul on siin kohe soovitus kontrolleriga, millel on 512 MB vahemÀlu.

KĂ”ik on vĂ€ga lihtne. Saate vm.dirty_background mÀÀrata baitides. Need seaded tĂŒhistavad kaks eelnevat. Kas vaikimisi ratio vĂ”i kui aktiveeritud on need, mis on baitides, siis on need, mis on baitides, jĂ”us. Kuna olen DBA-nĂ”ustaja ja töötan erinevate klientidega, pĂŒĂŒan ma ettevaatlik olla, seega, kui baitides, siis baitides. Keegi ei andnud mingit garantiid, et hea administraator ei lisa serverile mĂ€lu, ei taaskĂ€ivita seda ja number jÀÀb samaks. Lihtsalt arvutage need numbrid nii, et kĂ”ik mahuks kindlasti sisse.

Mida juhtub, kui te ei pressi? Olen kuulnud, et iga flushimine peatutakse tĂ”husalt, kuid tegelikult on see kĂ”igest kujundlik vĂ€ljend. OpsĂŒsteem on suure probleemi keskel – tal on liiga palju mÀÀrdunud lehti, seega tĂ”husalt peatatakse IO, mis on teie klientide pĂ€ringutest tulenev, st kui rakendus saatis SQL-pĂ€ringu andmebaasile, ootab see. KĂ”ik sisend-vĂ€ljund, mis sinna jĂ”uab, on madalaima prioriteediga, kuna andmebaas on kinni checkpoin'is. Ja kui see valmis saab, on tĂ€iesti arusaamatu. Ja kui olete jĂ”udnud mitte-taustal, mitte-bakgrep flushimiseni, tĂ€hendab see, et kĂ”ik teie IO on sellega hĂ”ivatud. Ja kuni see pole lĂ”petatud, ei saa te midagi teha.

Siin on veel kaks olulist punkti, mis jÀÀvad sellest aruandest vĂ€ljapoole. Need seaded peavad vastama postgresql.conf seadetele, st checkpoint seaded. Ja teie kettasĂŒsteem peab olema nĂ”uetekohaselt konfigureeritud. Kui teil on RAID-i peal vahemĂ€lu, peab sellel olema patarei. Inimesed ostavad RAID-i hea vahemĂ€luga ilma patareita. Kui teil on RAID-is SSD-d, peavad need olema serveri SSD-d, seal peavad olema kondensaatorid. Siin on pĂ”hjalik kontrollnimekiri. Selle lingi kaudu leiate minu ettekande kohtlemise seadistamisest PostgreSQL-is. Seal on kĂ”ik need kontrollnimekirjad.

PostgreSQL jÔudluse parandamiseks mÔeldud Linuxi hÀÀlestus. Ilya Kosmodemyanski

Mis veel vĂ€ga palju elu keeruliseks vĂ”ib teha? Need on kaks parameetrit. Need on suhteliselt uued. Need vĂ”ivad vaikimisi olla sisse lĂŒlitatud erinevates rakendustes. Ja need vĂ”ivad elu keeruliseks teha sama palju, kui need on valesti sisse lĂŒlitatud.

PostgreSQL jÔudluse parandamiseks mÔeldud Linuxi hÀÀlestus. Ilya Kosmodemyanski

On kaks suhteliselt uut asja. Need ilmuvad juba kolmandates tuumades. Need on sched_migration_cost nanosekundites ja sched_autogroup_enabled, mis vaikimisi on ĂŒks.

Ja kuidas need elu rikuvad? Mis on sched_migration_cost? Linuxi ajakava vĂ”ib migratsiooniprotsessi ĂŒhest CPU-st teise. Ja PostgreSQL-i jaoks, mis tĂ€idab pĂ€ringuid, ei ole migreerimine teise CPU-le tĂ€iesti selge, miks seda teha. Operatiivsystemi vaatenurgast, kui vahetate aknaid OpenOffice'i ja terminali vahel, vĂ”ib see olla hea, kuid andmebaasi jaoks – see on vĂ€ga halb. SeetĂ”ttu on mĂ”istlik poliitika seadistada migration_cost mĂ”neks suureks vÀÀrtuseks, vĂ€hemalt paar tuhat nanosekundit.

Mida see scheduler'ile tÀhendab? See arvab, et selle aja jooksul on see protsess endiselt aktiivne. St kui teil on mingi pikk tehing, mis vÔtab aega, siis scheduler saab sellest aru. Ta arvab, et seni, kuni see aegumisaeg pole möödunud, ei ole vaja seda protsessi kuhugi migreerida. Kui protsess sel ajal midagi teeb, siis ei toimu migratsiooni, vaid see lÔpetab töö sellel CPU-l, mis on talle mÀÀratud. Ja tulemus on suurepÀrane.

Teine asi on autogroup. On hea idee spetsiifiliste töökoormuste jaoks, mis ei ole seotud kaasaegsete andmebaasidega – gruppida protsessid vastavalt sellele virtuaalsele terminalile, millelt need kĂ€ivitati. See on mugav mĂ”nede ĂŒlesannete jaoks. Praktikas on PostgreSQL mitme protsessi sĂŒsteem prefork'iga, mis kĂ€ivitatakse ĂŒhest terminalist. Teil on lukustaja, kontrollpunkt ja kĂ”ik teie kliendi pĂ€ringud rĂŒhmitatakse ĂŒhele scheduler'ile, ĂŒhele CPU-le. Ja nad ootavad seal sĂ”bralikult, kuni see vabaneb, et mitte teineteist segada ja kasutada seda kauem. See on lugu, mis ei ole sellise koormuse korral sugugi vajalik, seega tuleks see vĂ€lja lĂŒlitada.

PostgreSQL jÔudluse parandamiseks mÔeldud Linuxi hÀÀlestus. Ilya Kosmodemyanski

Minu kolleeg Aleksei Lesovski tegi katseid lihtsa pgbench'iga, kus ta suurendas migration_cost'i jĂ€rsult ja vĂ€ljas kirjutas autogroup'i. Halva riistvara puhul tuli vahe peaaegu 10%.. Postgres'i meililistil on arutelu, kus inimesed toovad vĂ€lja tulemusi, kuidas sellised muudatused mĂ”jutasid pĂ€ringu kiirus. mĂ”jutasid 50%.. Selliseid lugusid on ĂŒsna palju.

PostgreSQL jÔudluse parandamiseks mÔeldud Linuxi hÀÀlestus. Ilya Kosmodemyanski

Ja lĂ”petuseks energia salvestamise poliitika. HĂ€sti, et nĂŒĂŒd saab Linuxit kasutada sĂŒlearvutis. Ja see peaks tĂ”eliselt hĂ€sti akku kasutama. Kuid ĂŒllatuslikult selgub, et serverites vĂ”ib sama olla.

Veelgi enam, kui rendite servereid mĂ”nelt hostimisettevĂ”ttelt, siis 'head' hostinguteenuse pakkujad ei hooli sellest, et teil oleks parem jĂ”udlus. Nende ĂŒlesanne on tagada, et nende riistvara töötaks maksimaalselt tĂ”husalt. SeetĂ”ttu vĂ”ivad nad vaikimisi operatsioonisĂŒsteemi abil sisse lĂŒlitada sĂŒlearvutireĆŸiimi, mis sÀÀstab energiat.

Kui kasutate intensiivse koormuse aluseks oleva andmebaasi serveris seda head, siis teie valik on acpi_cpufreq + performance. Isegi ondemand'iga vÔivad juba olla probleemid.

Intel_pstate on nĂŒĂŒd veidi erinev draiver. Praegu eelistatakse just seda, kuna see on uuenduslikum ja paremini töötav.

Seega on governor ainult performance. Ondemand, powersave ja kĂ”ik muu – need ei puuduta teid.

Explain analyze PostgreSQL tulemused vÔivad erineda mitu korda, kui aktiveerite powersave, sest teie aluses kapoti all ajakava CPU-d tÀiesti ettearvamatul viisil.

Need asjad vĂ”ivad olla vaikesĂ€tetena sisse lĂŒlitatud. Vaadake hoolikalt – ei ole nad vaikimisi sisse lĂŒlitatud? See vĂ”ib olla tĂ”eliselt suur probleem.

PostgreSQL jÔudluse parandamiseks mÔeldud Linuxi hÀÀlestus. Ilya Kosmodemyanski

Ja lĂ”puks tahaksin tĂ€nada meie DBA meeskonda PostgreSQL-Consulting, nimelt Maks Boguuit ja Aleksei Lesovskit, kes iga pĂ€ev sellel alal oma vigadest Ă”pivad. PĂŒĂŒame meie klientidele maksimaalselt head teenust pakkuda, et nende sĂŒsteemid töötaksid. See on nagu lennunduse ohutusjuhendite puhul. KĂ”ik on siin verega kirjutatud. Iga nende mutri avastamine toimus mingi probleemi kĂ€igus. Jagame neid rÔÔmuga teiega.

KĂŒsimused:

AitĂ€h! Kui nĂ€iteks ettevĂ”te soovib sÀÀsta ja kĂ€itada ĂŒhel serveril andmebaasi ja rakenduse loogikat vĂ”i kui ettevĂ”te jĂ€rgib trendi mikroteenuste arhitektuuris, kus PostgreSQL töötab konteineris. Mis on nipiks? Sysctl mĂ”jutab globaalset kogu sĂŒdamikku. Ma ei ole kuulnud, et sysctl kuidagi virtualiseeritaks, et need töötaksid konteineris eraldi. On ainult cgroup ja seal on ainult osaline kontroll. Kuidas sellega elada? VĂ”i kui soovite jĂ”udlust, siis kĂ€itage PostgreSQL eraldi raua serveris ja optimeerige seda?

Oleme teie kĂŒsimusele vastanud umbkaudu kolme erineva viisiga. Kui jutt ei ole rauaserverist, mida saab optimeerida jne, siis rahunege, kĂ”ik töötab hĂ€sti ka nende seadistusteta. Kui teil tekib koormus, mis nĂ”uab nende seadistuste tegemist, siis jĂ”uate rauaserverile varem kui nende seadistusteni.

Mis probleem selles on? Kui see on virtuaalmasin, siis on tĂ”enĂ€oliselt mitmeid probleeme, nĂ€iteks sellele, et enamikul virtuaalmasinatest on ketta latentsus ebajĂ€rjekindel. Isegi kui kettamaht on hea, siis ĂŒks ebaĂ”nnestunud sisendi-vĂ€ljastusoperatsiooni tehing, mis ei mĂ”juta oluliselt keskmist lĂ€bilaskevĂ”imet, vĂ”ib mĂ€rkimisvÀÀrselt mĂ”jutada andmebaasi, kui see toimub checkpoint'i vĂ”i WAL-i kirjutamise ajal, ja te mĂ€rkate seda kiiremini, kui vĂ”iks arvata.

Kui teil on NGINX samal serveril, on probleem sama. See vÔitleb jagatud mÀluruumi pÀrast. Ja te ei jÔua siinkohal kirjeldatud probleemideni.

Teiselt poolt teatud parameetrid on siiski teie jaoks olulised. NĂ€iteks, seadistage sysctl dirty_ratio, et see ei oleks nii ÀÀrmuslik – igal juhul see aitab. Teie ketta kasutamine toimub mingil viisil. Ja see ei toimi Ă”igesti. Need on ĂŒldiselt vaikimisi seadistused, mida ma nĂ€itasin. Ja igal juhul on parem neid muuta.

NUMA vĂ”ib tekitada probleeme. NĂ€iteks töötab VmWare NUMA-ga hĂ€sti, kui seaded on tĂ€pselt vastupidised. Siin tuleb teha valik – kas raudserver vĂ”i mitte.

Mul on kĂŒsimus, mis on seotud Amazon AWS-iga. Neil on eelkonfigureeritud image. Üks neist on nimetatud Amazon RDS-iks. Kas seal on mingid kohandatud seaded nende operatsioonisĂŒsteemi jaoks?

Seal on seaded, kuid need on teistsugused. Siin seadistame operatsioonisĂŒsteemi selle perspektiivist, kuidas andmebaas seda kasutab. Ja seal on parameetrid, mis mÀÀravad, kuhu me praegu suundume, nii-öelda shaping. See tĂ€hendab, et me vajame nii palju ressursse, ja me hakkame neid kohe kasutama. PĂ€rast seda ĂŒhendab Amazon RDS need ressursid ja seal esineb jĂ”udluse langus. On eraldi juhtumeid, kus inimesed hakkavad sellega eksperimenteerima. MĂ”nikord isegi ĂŒsna edukalt. Kuid see ei ole seotud operatsioonisĂŒsteemi seadistustega. See on nagu pilve hĂ€kkimine. See on hoopis teine lugu.

Miks Transparent huge pages ei anna efekti vÔrreldes Huge TLB-ga?

Nad ei anna. Seda saab selgitada mitmeti, kuid tegelikult nad lihtsalt ei anna seda. Milline on PostgreSQL ajalugu? Ta jagab kĂ€ivitamisel suure osa jagatud mĂ€lust. Kas nad on lĂ€bipaistvad vĂ”i mitte – pole absoluutselt oluline. Fakt, et nad jaotatakse kĂ€ivitamisel, seletab kĂ”ik. Ja kui mĂ€lu on vĂ€ga palju ja tuleb ĂŒmber jaotada jagatud mĂ€lu segment, siis lĂ€bipaistvad suured lehed (Transparent huge pages) saavad asjakohaseks. PostgreSQL jaotab lihtsalt kĂ€ivitamisel tohutu tĂŒki ja kĂ”ik, ja edasi seal midagi erilist ei toimu. Loomulikult on vĂ”imalik kasutada, kuid on oht saada jagatud mĂ€lu rikutud, kui see peab midagi uuesti jaotama. PostgreSQL ei tea sellest.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster