Linuxi hÀÀlestamine PostgreSQLi jÔudluse parandamiseks. Ilya Kosmodemyanskiy

2015. aasta ettekande "Linuxi hÀÀlestamine PostgreSQLi jÔudluse parandamiseks" tÔlgendus Ilya Kosmodemyanskiy poolt

KĂ€esolev vĂ€ljavĂ”te: Tahan mĂ€rkida, et see ettekande kuupĂ€ev on novembrist 2015 — on möödunud rohkem kui 4 aastat ja palju on muutunud. Ettekandes kĂ€sitletav versioon 9.4 ei ole enam toetatud. Viimase 4 aasta jooksul on ilmunud 5 uut PostgreSQL versiooni ja 15 Linuxi kerneli versiooni. Kui siin kohtasid ĂŒmber kirjutada, saaks lĂ”ppkokkuvĂ”ttes hoopis teine ettekande. Kuid siinkohal on kĂ€sitletud pĂ”hi hÀÀlestust Linuxi jaoks PostgreSQL’i jaoks, mis on endiselt aktuaalne.

Linuxi hÀÀlestamine PostgreSQLi jÔudluse parandamiseks. Ilya Kosmodemyanskiy


MĂ€ngi videot

Minu nimi on Ilya Kosmodemyanskiy. Töödan ettevĂ”ttes PostgreSQL-Consulting. Ja nĂŒĂŒd hakkan rÀÀkima natuke sellest, mida teha Linuxiga, seoses andmebaasidega ĂŒldiselt ja PostgreSQL’iga konkreetselt, sest pĂ”himĂ”tted on ĂŒsna sarnased.

Millest me rÀÀgime? Kui suhtlete PostgreSQL’iga, peate mingil mÀÀral olema UNIXi administraator. Mida see tĂ€hendab? Kui vĂ”rrelda Oracle’it ja PostgreSQL’i, siis Oracle’iga peab olema 80% DBA andmebaasi administraator ja 20% Linuxi administraator.

PostgreSQL’iga on natuke keerulisem. PostgreSQL’i puhul tuleb oluliselt paremini mĂ”ista, kuidas Linux töötab. Ja samal ajal tuleb vahel kiiremini joosta, sest viimasel ajal on kĂ”ik ĂŒsna aktiivselt uuendatud. Uusi kernelit on vĂ€lja antud ning uut funktsionaalsust on ilmunud, jĂ”udlus paraneb jne.

Miks me rÀÀgime Linuxist? Mitte sellepĂ€rast, et oleme Linuxi konverentsil Peterburis, vaid seetĂ”ttu, et tĂ€napĂ€eval on ĂŒks kĂ”ige pĂ”hjendatum operatsioonisĂŒsteem andmebaaside kĂ€itamiseks ĂŒldiselt ja PostgreSQL’iga konkreetselt — see on Linux. Kuna FreeBSD, kahjuks, areneb mingis vĂ€ga kummalises suunas. Ja tekivad probleemid nii jĂ”udluse kui ka paljude muude aspektidega. PostgreSQL jĂ”udlus Windowsis — see on tĂ€iesti eraldi karm teema, kuna Windowsil ei ole sellist jagatud mĂ€lu nagu UNIXil, ja PostgreSQL sĂ”ltub sellest, sest see on mitme protsessi sĂŒsteem.

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

Linuxi hÀÀlestamine PostgreSQLi jÔudluse parandamiseks. Ilya Kosmodemyanskiy

Kaasaegse Linuxi distributsiooni puhul on ĂŒle 1 000 syctl parameetri, sĂ”ltuvalt sellest, kuidas tuum koguda. Kui vaatame veel erinevaid mutreid, siis on veel palju viise, kuidas midagi kohandada. On failisĂŒsteemi parameetreid, kuidas mountida. Kui kĂŒsimusi, kuidas kĂ€ivitada: mida BIOSis sisse lĂŒlitada, kuidas riistvara seadistada jne.

See on vĂ€ga mahukas teema, millest vĂ”iks rÀÀkida mitu pĂ€eva, mitte ĂŒhe lĂŒhikese ettekande jooksul, kuid ma keskendun nĂŒĂŒd olulistele asjadele, kuidas vĂ€ltida neid lĂ”kse, mis kindlasti ei vĂ”imalda teil hĂ€sti hallata andmebaasi Linuxis, kui te neid ei paranda. Oluline on mĂ€rkida, et paljud parameetrid on vaikimisi seades, mis ei ole andmebaasi jaoks Ă”iged. Ehkki vaikimisi töötamine vĂ”ib olla halb vĂ”i mitte töötada ĂŒldse.

Linuxi hÀÀlestamine PostgreSQLi jÔudluse parandamiseks. Ilya Kosmodemyanskiy

Millised on traditsioonilised tuning targets Linuxis? Ma arvan, et kuna te kÔik tegeleme Linuxi haldamisega, siis ei ole targets'i seletamine eriti vajalik.

VÔimalik on hÀÀlestada:

  • CPU.
  • MĂ€lu.
  • Salvestus.
  • Muud. Sellest rÀÀgime lĂ”pus. Isegi nĂ€iteks sellised parameetrid nagu energiasÀÀstupoliitika vĂ”ivad ettearvamatu ja mitte kĂ”ige meeldivama mĂ”juga olla jĂ”udlusele.

Linuxi hÀÀlestamine PostgreSQLi jÔudluse parandamiseks. Ilya Kosmodemyanskiy

Milline on PostgreSQL spetsiifika ja andmebaaside ĂŒldiselt? Probleem on selles, et ei saa hÀÀlestada mĂ”nda eraldi mutrit ja vaadata, et jĂ”udlus on oluliselt paranenud.

Jah, selliseid mutreid on, kuid andmebaas on keeruline asi. See suhtleb kĂ”igi serveri ressurssidega ja eelistab nendega tĂ€ielikult suhelda. Kui vaatate Oracle'i kaasaegseid soovitusi selle kohta, kuidas kasutada hostimisoperatsioonisĂŒsteemi, on see nagu anekdoot Mongoli kosmonautidest – toida koera ja Ă€ra puuduta midagi. Andke andmebaasile kĂ”ik ressursid, andmebaas lahendab kĂ”ik ise.

Üldiselt on PostgreSQL puhul sama olukord. Erinevus seisneb selles, et andmebaas ei oska kĂ”iki ressursse ise haarata, seega tuleb Linuxi tasemel mĂ”ned asjad ise korraldada.

Peamine idee ei ole valida ĂŒhte sihtkohta ja alustada selle tuunimist, 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 saaks tĂ”husalt lĂ€bi viia laengu, mille head programmeerijad meile kokku on pannud, sealhulgas ka meie kasutajad.

Linuxi hÀÀlestamine PostgreSQLi jÔudluse parandamiseks. Ilya Kosmodemyanskiy

Siin on pilt, et selgitada, mis see on. On Linuxi operatsioonisĂŒsteemi puhversĂ€lu, jagatud mĂ€lu ja PostgreSQL jagatud puhversĂ€lu. PostgreSQL töötab erinevalt Oracle'ist otse ainult tuuma puhversĂ€luga, st et leht peab lĂ€bima tuumapuhversĂ€lu, et jĂ”uda tema jagatud mĂ€lu, ja sama olukord kehtib ka tagasi.

Selle sĂŒsteemi all asuvad kettad. Ma joonistasin need ketasteks. Tegelikult vĂ”ib seal olla RAID-kontroller jne.

Ja see sisse- ja vÀljund, mingil moel, toimub lÀbi selle asja.

PostgreSQL on klassikaline andmebaas. Seal on lehed sees. Ja kogu sisse- ja vÀljund toimub lehtede abil. Me toome lehed mÀllu. Ja kui midagi ei juhtunud, lihtsalt lugesime neid, siis jÀrk-jÀrgult need kaduvad sellest puhversÀlust, jagatud puhversÀlist ja jÔuavad tagasi kettale.

Kui me kuskil midagi asendasime, siis mĂ€rgistatakse kogu leht kui mÀÀrdunud. Ma olen need sinise vĂ€rviga esile tĂ”stnud. See tĂ€hendab, et see leht peab olema sĂŒnkroniseeritud plokkidehoidjaga. St kui me tegime selle mÀÀrdunuks, siis tegime kirje WAL-is. Ja mingil kaunil hetkel saabus nĂ€htus nimega kontrollpunkt. Ja sellesse logisse salvestati teave selle kohta, et see on saabunud. See tĂ€hendab, et kĂ”ik mÀÀrdunud lehed, mis seal sel hetkel jagatud puhversĂ€list olid, sĂŒnkroniseeriti kettal hoidmisega fsync kaudu tuumapuhversĂ€lu abil.

Miks see tehakse? Kui meil kaob toide, siis me ei saa olukorda, kus kĂ”ik andmed on kadunud. PĂŒsiv mĂ€lu, millest me kĂ”ik oleme kuulnud, on seni andmebaaside teoorias – see on helge tulevik, mille poole me loomulikult pĂŒrgime ja see meeldib meile, kuid praegu elavad nad endiselt 20 aastat minevikus. Ja loomulikult peab selle ĂŒle jĂ€lgima.

Ja ĂŒlesanne maksimeerida lĂ€bilaskvust on hÀÀlestada kĂ”igis neis etappides, et kĂ”ik see liiguks kiiresti edasi-tagasi. Jagatud mĂ€lu on peamiselt lehekĂŒljekassa. PostgreSQL-is sĂ”idame pĂ€ringu select midagi seal, see tĂ”i need andmed kettalt vĂ€lja. Need jĂ”udsid jagatud puhverdesse. Seega, et see töötaks paremini, peab olema palju mĂ€lu.

Selleks, et see kĂ”ik toimiks hĂ€sti ja kiiresti, peate kĂ”igis etappides operatsioonisĂŒsteemi Ă”igesti seadistama. Ja valima tasakaalustatud riistvara, sest kui teil on mĂ”nes kohas tasakaaluhĂ€ire, siis vĂ”ite teha vĂ€ga palju mĂ€lu, kuid see teenindatakse ebapiisava kiiruseni.

Ja vaatame igaĂŒht neist punktidest.

Linuxi hÀÀlestamine PostgreSQLi jÔudluse parandamiseks. Ilya Kosmodemyanskiy

Kuna neid lehekĂŒlgi tuleb kiiremini edasi-tagasi liigutada, tuleb saavutada jĂ€rgnev:

  • Esiteks, tuleb tĂ”husamalt mĂ€lu kasutada.
  • Teiseks, see ĂŒleminek, kui lehekĂŒljed mĂ€lust kettale jĂ”uavad, peab olema tĂ”husam.
  • Ja kolmandaks, peab olema head kettad.

Kui teil on 512 GB RAM-i serveris ja see kÔik suundub lÔpuks SATA kÔvakettale ilma igasuguse vahemÀlu, siis muutub kogu andmebaasiserver mitte lihtsalt kÔrvitsaks, vaid kÔrvitsaks SATA liidesega. Te seisate selle ees otseselt. Ja miski ei pÀÀsta teid.

Linuxi hÀÀlestamine PostgreSQLi jÔudluse parandamiseks. Ilya Kosmodemyanskiy

Mida puudutab esimest punkti mÀlu osas, siis on kolm asja, mis vÔivad elu oluliselt keerulisemaks muuta.

Esimene neist on NUMA. NUMA on asi, mis on loodud jĂ”udluse parandamiseks. Olenevalt töökoormusest vĂ”ib erinevaid asju optimeerida. Ja oma tĂ€nases kujus ei ole see selliste rakenduste, nagu andmebaas, mis intensiivselt kasutavad lehekĂŒlje vahemĂ€lu jagatud puhverdes, vĂ€ga hea.

Linuxi hÀÀlestamine PostgreSQLi jÔudluse parandamiseks. Ilya Kosmodemyanskiy

LĂŒhidalt. Kuidas mĂ”ista, et NUMA-ga on midagi valesti? Teil on mingi ebameeldiv mĂŒrin, ĂŒhtĂ€kki on mĂ”ni CPU ĂŒlekoormatud. Samal ajal analĂŒĂŒsite PostgreSQL-is pĂ€ringuid ja nĂ€ete, et seal pole midagi sellist. Need pĂ€ringud ei tohiks olla nii intensiivsed CPU kasutamise osas. Seda saab kaua jĂ€lgida. Lihtsam on alates algusest kasutada Ă”iget soovitust, kuidas NUMA PostgreSQL-i seadistada.

Linuxi hÀÀlestamine PostgreSQLi jÔudluse parandamiseks. Ilya Kosmodemyanskiy

Mis tegelikult juhtub? NUMA - see on MittetÀiuslik MÀluelektroonika. Miks see on? Teil on CPU, mille kÔrval on tema kohaliku mÀlu. Ja see mÀlu interconnects vÔib tuua mÀlu teistelt CPU-delt.

Kui kĂ€ivitate numactl --hardware, siis saate sellise suure lehe. Muuhulgas on seal valdkond distances. Seal on numbrid – 10-20, midagi sellist. Need numbrid ei ole midagi muud kui hĂŒpikute arv, et see eemal asuv mĂ€lu ĂŒhendada ja kohapeal kasutada. Üldiselt on see hea mĂ”te. See kiirendab jĂ”udlust teatud koormuste puhul.

Kujutage nĂŒĂŒd ette, et teie ĂŒks CPU ĂŒritab esmalt kasutada oma kohalikku mĂ€lu, seejĂ€rel proovib ta interconnecti kaudu tuua endale muud mĂ€lu millegi tarbeks. Ja sellele CPU-le jĂ”uab kogu teie PostgreSQL page cache – kĂ”ik need paar gigabaiti. Te alati saate halvimat juhtumit, sest CPU-l on tavaliselt otseselt selles mĂ€lumoodulis vĂ€he mĂ€lu. Ja kogu mĂ€lu, mis teenindatakse, liigub lĂ€bi nende interconnectide. See on aeglane ja kurb. Ja teil on protsessor, mis teenindab seda sĂ”lme, pidevalt ĂŒle koormatud. Ja selle mĂ€lu juurdepÀÀsu aeg on halb, aeglane. See on see olukord, mida te ei soovi, kui kasutate seda andmebaasi tarbeks.

SeetĂ”ttu on Ă”igem variant andmebaasiks, et Linuxi operatsioonisĂŒsteem ei teadliks sellest, mis seal toimub. Et ta pöördub mĂ€lu poole nii, nagu ta tavaliselt pöördub.

Miks nii? Tundub, et peaks olema vastupidi. See juhtub ĂŒhel lihtsal pĂ”hjusel, et mĂ€lu on meil page cache jaoks palju vaja – kĂŒmneid, sadu gigabaiate.

Ja kui me oleme kÔik selle eraldanud ja oma andmed seal vahemÀlusse salvestanud, siis on kasu vahemÀlu kasutamisest oluliselt suurem kui see kasu, mis tuleneb sellisest nutikast mÀlu kÀsitsemisest. Ja me vÔidame seelÀbi vÔrreldamatult rohkem, vÔrreldes sellega, et oleksime efektiivsemad mÀlu kÀsitsemisel NUMA abil.

Niisiis, hetkel on siin kaks lÀhenemist, kuni valgus tulevikus ei saabu ja andmebaas ei oska ise aru saada, millistel CPU-del ta töötab ja kust tuleb midagi laadida.

Linuxi hÀÀlestamine PostgreSQLi jÔudluse parandamiseks. Ilya Kosmodemyanskiy

SeetĂ”ttu on Ă”ige lĂ€henemine – ĂŒldse NUMA vĂ€lja lĂŒlitada, nĂ€iteks taaskĂ€ivitamisel. Enamiku juhtumite puhul on kasum nii suur, et kĂŒsimus, kuidas paremini, ei teki ĂŒldse.

On teine vĂ”imalus. Me kasutame seda sagedamini kui esimest, sest kui klient tuleb meie tehnilisse tugi, siis on serveri taaskĂ€ivitamine tema jaoks suur asi. Tema seal ju Ă€ri kĂ€ib. Probleemid NUMA tĂ”ttu on nad kogenud. SeetĂ”ttu pĂŒĂŒame neid vĂ€lja lĂŒlitada vĂ€hem invasiivsete meetoditega kui taaskĂ€ivitamine, kuid siin tuleb ettevaatlikult kontrollida, et see tĂ”esti vĂ€lja lĂŒlitatud oleks. Sest, nagu kogemus nĂ€itab, kui me vanemalt PostgreSQL NUMA protsessilt vĂ€lja lĂŒlitame, on see hea, kuid kindlasti pole see vajalik, et see tööle hakkaks. Tuleb kontrollida ja vaadata, et see tĂ”eliselt vĂ€lja lĂŒlitatakse.

On olemas hea postitus Robert Haasilt. Ta on ĂŒks PostgreSQL'i pannijaid. Üks vĂ”tme arendajatest kĂ”ikide madala taseme komponente. Ja kui sellele postitusele viidatud linkidele minna, siis seal on mitmeid vĂ€rvikate lugusid sellest, kuidas NUMA elusid keeruliseks tegi. Vaadake, uurige sĂŒsteemiadministraatori kontrollnimekirja, mida serveris seadistada, et meie andmebaas töötaks hĂ€sti. Need seaded tuleb kirja panna ja kontrollida, sest vastasel juhul ei lĂ€he hĂ€sti.

TĂ”mban tĂ€helepanu sellele, et see puudutab kĂ”iki seadeid, millest ma rÀÀgin. Kuid tavaliselt kogutakse andmebaasid master-slave reĆŸiimis tĂ”rgeteta töökindluse jaoks. Ärge unustage need seaded slave'i sisse viia, sest ĂŒhel kaunil hetkel juhtub teil katastroof ja te lĂŒlitate ĂŒle slave'ile, kes saab masteriks.

HÀdaolukorras, kui kÔik on vÀga halb, heliseb teie telefon pidevalt ja juhataja jookseb suure kepiga, siis pole teil aega mÔelda, et kontrollida. Ja tulemused vÔivad olla vÀga kurvad.

Linuxi hÀÀlestamine PostgreSQLi jÔudluse parandamiseks. Ilya Kosmodemyanskiy

JÀrgmine punkt on huge pages. Huge pages'i on keeruline eraldi testida, ja selles pole ka mÔtet, kuigi on olemas benhmarke, mis oskavad seda teha. Need leiavad kergesti Google'is.

Mis on mĂ”te? Teil on mitte eriti kallis server, milles on palju RAM-i, nĂ€iteks ĂŒle 30 GB. Te ei kasuta huge pages'i. See tĂ€hendab, et teil on kindlasti Ă”ige ĂŒleliigne mĂ€lu kasutamine. Ja see ĂŒleliigne on kaugeltki mitte mugav.

Linuxi hÀÀlestamine PostgreSQLi jÔudluse parandamiseks. Ilya Kosmodemyanskiy

Miks see nii on? Mis toimub? OperatsioonisĂŒsteem jaotab mĂ€lu vĂ€ikesteks tĂŒkkideks. See on mugav ja ajalooliselt vĂ€lja kujunenud. Ja kui detaljidesse laskuda, peab operatsioonisĂŒsteem edastama virtuaalsed aadressid fĂŒĂŒsilistesse aadressitesse. See protsess ei ole kĂ”ige lihtsam, seega talletab operatsioonisĂŒsteem selle operatsiooni tulemuse Translation Lookaside Bufferis (TLB).

Ja kuna TLB on vahemĂ€lu, siis sellistes olukordades tekivad kĂ”ik sellele omased probleemid. Esiteks, kui teil on vĂ€ga palju jĂ”udlusse 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, on selle tĂ”ttu otsimine aeglasem. Üleminek on suur ja see ise vĂ”tab ruumi, st, et operatiivmĂ€lu tarbib midagi ebavajalikku. See on esimene punkt.

Teiseks – mida suurem muutub vahemĂ€lu sellises olukorras, seda suurem on tĂ”enĂ€osus, et teil tekib cache misses. Ja selle vahemĂ€lu efektiivsus langeb kiiresti koos selle suuruse suurenemisega. SeetĂ”ttu on operatsioonisĂŒsteemides vĂ€lja mĂ”eldud lihtne lĂ€henemine. Linuxis on see juba ammu kasutusel. FreeBSD-s on see mitte nii kaua tagasi ilmunud. Kuid me rÀÀgime Linuxist. See on huge pages.

Siinkohal tuleb mÀrkida, et huge pages mÔtteviit oli algselt edendatud kogukondade poolt, kuhu kuulusid Oracle ja IBM, st andmebaasi tootjad mÔtlesid tÔsiselt, et see vÔiks olla kasulik, sealhulgas andmebaaside jaoks.

Linuxi hÀÀlestamine PostgreSQLi jÔudluse parandamiseks. Ilya Kosmodemyanskiy

Kuidas seda PostgreSQL-iga siduda? Esiteks peavad Linuxi ydas olema lubatud huge pages.

Teiseks, need peavad olema selgelt mÀÀratud sysctl parameetriga – kui palju neid on. Numbrid siinkohal pĂ€rinevad mĂ”nelt vanalt serverilt. Saate arvutada, kui palju teile ligikaudu shared buffers on, et huge pages sinna mahuksid.

Ja kui kogu server on pĂŒhendatud PostgreSQL-ile, siis hea lĂ€htepunkt on kas anda 25% operatiivmĂ€last jagatud pufferitele vĂ”i 75%, kui olete kindel, et teie andmebaas mahub kindlasti sellesse 75% suurusesse. Esimene lĂ€htepunkt. Ja arvutage, kui teil on 256 GB operatiivmĂ€lu, siis vastavalt on 64 GB jagatud pufferite jaoks. Arvutage veidi marginaaliga – milline peaks see arv olema.

Enne versiooni 9.2 (kui ma ei eksi, alates versioonist 8.2) oli vĂ”imalik kolmanda osapoole raamatukogu abil PostgreSQL ĂŒhendada huge pages'iga. Ja seda tuleb alati teha. Esiteks, teil on vajalik, et kernel oskaks huge pages'i Ă”igesti jagada. Teiseks, rakendusel, mis nendega töötab, peab olema vĂ”imalus neid kasutada. Ilma selle vĂ”imaluseta ei saa see nendest kasu. Kuna PostgreSQL jagas mĂ€lu system 5 stiilis, sai seda teha libhugetlbfs abil — see on selle raamatukogu tĂ€isnimi.

Versioonis 9.3 paranes PostgreSQL-i jĂ”udlus mĂ€lu haldamisel ja loobuti system 5 mĂ€lu jagamise meetodist. KĂ”ik olid vĂ€ga rÔÔmsad, sest muidu proovisid sa kĂ€ivitada kahte PostgreSQL-i instantsi samal masinal ja ĂŒtles, et mul on jagatud mĂ€lu vĂ€he. Ja selgus, et sysctl tuleb muuta. Ja seal on selline sysctl, et peab veel taaskĂ€ivitama jne. ÜhesĂ”naga, kĂ”ik olid rÔÔmsad. Kuid mmap-i mĂ€lu jagamine rikkus huge pages'i kasutamist. Enamik meie kliente kasutab suuri jagatud puhvreid. Ja me soovisime tungivalt mitte minna versioonile 9.3, kuna seal tekkis ĂŒlekattega probleemide hulk.

Aga siiski tĂ€helepanu sellele probleemile pööras community ja versioonis 9.4 töötati seda vĂ€ga hĂ€sti ĂŒmber. Ja versioonis 9.4 ilmus parameeter postgresql.conf-is, kus saab lubada try, on vĂ”i off.

Try on kĂ”ige ohutum parameeter. PostgreSQL-i kĂ€ivitamisel, kui see jagab jagatud mĂ€lu, pĂŒĂŒab ta endale vastava mĂ€lu saada huge pages-ist. Ja kui see ei Ă”nnestu, siis tagasi tavalisel jagamisel. Kui teie sĂŒsteem on FreeBSD vĂ”i Solaris, siis saate panna try, see on alati ohutu.

Kui on on, siis see lihtsalt ei kÀivitu, kui ei suutnud huge pages'ist jagada. Siin sÔltub kÔik teie eelistustest. Kuid kui teil on seadistatud try, siis kontrollige, et teil on tÔepoolest see, mis peab olema eraldatud, sest seal on palju viga tegemise ruumi. Praegu töötab see funktsioon ainult Linuxis.

Veel tĂ€helepanuts, enne kui lĂ€heme edasi. Transparent huge pages ei kehti hetkel PostgreSQL jaoks. Ta ei saa neid normaalselt kasutada. Ja transparent huge pages puhul, kui on vajalik suur osa jagatud mĂ€lu, tulevad eelised esile ainult vĂ€ga suurte mahtude korral. Kui teil on terabaiti mĂ€lu, siis see vĂ”ib mĂ€ngida rolli. Aga kui rÀÀgime tavapĂ€rastest rakendustest, kus teie masinas on 32, 64, 128, 256 GB mĂ€lu, siis tavalised huge pages on ok ja transparent tuleb lihtsalt vĂ€lja lĂŒlitada.

Linuxi hÀÀlestamine PostgreSQLi jÔudluse parandamiseks. Ilya Kosmodemyanskiy

Ja viimane asi, mis on mÀluga seotud, ei ole otseselt seotud lÀbilaskevÔimega, vaid vÔib elu oluliselt halvendada. Kogu lÀbilaskvus kannatab selle all, et server vahetab pidevalt.

Ja see on mitmel hetkel vĂ€ga ebameeldiv. Peamine ebameeldivus tuleneb sellest, et kaasaegsete kernide kĂ€itumine erineb veidi vanematest Linuxi kernidest. Ja see on asi, mille peale astuda on ĂŒsna ebameeldiv, kuna kui rÀÀgime swap'iga töötamisest, lĂ”ppeb see OOM-killeri ebamugava sissetuleku tĂ”ttu. Ja OOM-killer, mis ei tule Ă”igeaegselt ja lĂ”petab PostgreSQL-i, on ebameeldiv. Sellest saavad teada kĂ”ik, st viimane kasutaja.

Linuxi hÀÀlestamine PostgreSQLi jÔudluse parandamiseks. Ilya Kosmodemyanskiy

Mis toimub? Sul on seal suur hulk operatiivmÀlu, kÔik töötab hÀsti. Kuid mingil pÔhjusel server hangub swap'is ja see pÔhjustab viivitusi. Tundub, et mÀlu on piisavalt, aga see juhtub ikkagi.

Linuxi hÀÀlestamine PostgreSQLi jÔudluse parandamiseks. Ilya Kosmodemyanskiy

Varem soovitasime vm.swappiness nulli seadistada, st swap vĂ€lja lĂŒlitada. Varem tundus, et 32 GB operatiivmĂ€lu ja vastavad jagatud buferid on tohutu hulk. Swap'i peamine eesmĂ€rk on anda ruumi, kuhu visata tuum, kui oleme kukkunud. Ja see ei tĂ€itnud enam oma eesmĂ€rki. Ja mida sa selle tuumaga pĂ€rast teed? See on juba selline ĂŒlesanne, kus ei ole eriti selge, miks swap'i sellises suuruses ĂŒldse vaja on.

Kuid kaasaegsemates, st kolmandates versioonides on kĂ€itumine muutunud. Ja kui seadistada swap nulli, st vĂ€lja lĂŒlitada, siis varem vĂ”i hiljem, isegi kui mĂ”ned mĂ€luressursid on alles, tuleb OOM-killer teie juurde, et tappa kĂ”ige intensiivsemad ressursikasutajad. Sest ta arvab, et sellise töökoormuse korral on meil jÀÀnud veel vĂ€he mĂ€lu ja me lĂ€heme ĂŒle piiri, st mitte sĂŒsteemset protsessi tapma, vaid midagi vĂ€hem olulist. Selleks vĂ€hem oluliseks osutub intensiivne jagatud mĂ€lu tarbija, nimelt postmaster. Ja pĂ€rast seda on hea, kui andmebaasi ei pea taastama.

SeetĂ”ttu on nĂŒĂŒd vaikimisi, kui ma Ă”igesti mĂ€letan, enamikus jaotustes umbes 6, st millal hakata kasutama swap'i sĂ”ltuvalt sellest, kui palju mĂ€lu on jÀÀnud. Me soovitame praegu seadistada vm.swappiness = 1, sest see praktiliselt lĂŒlitab selle vĂ€lja, kuid ei too kaasa selliseid efekte, nagu ootamatult saabunud OOM-killer ja kĂ”ik see, mis on igasuguste probleemide pĂ”hjus.

Linuxi hÀÀlestamine PostgreSQLi jÔudluse parandamiseks. Ilya Kosmodemyanskiy

Mis edasi? Kui rÀÀgime andmebaaside jÔudlusest ja jÀrk-jÀrgult jÔuame ketaste juurde, haaravad kÔik oma pead. Sest tÔde, et ketas on aeglane ja mÀlu kiire, on kÔigile lapsepÔlvest tuttav. Ja kÔik teavad, et andmebaasis tekivad probleemid ketta jÔudlusega.

Peamine probleem PostgreSQL-i jĂ”udlusega, mis on seotud checkpoints spikes'idega, ei tulene mitte sellest, et ketas on aeglane. See tuleneb pigem sellest, et mĂ€lu ja ketta lĂ€bilaskevĂ”ime ei ole tasakaalus. Samas vĂ”ivad nad olla tasakaalustamata erinevates kohtades. PostgreSQL ei ole seadistatud, operatsioonisĂŒsteem ei ole seadistatud, riistvara ei ole seadistatud ja riistvara ei ole Ă”ige. Ja seda probleem ei esine ainult siis, kui kĂ”ik toimub nii nagu peab, st kas koormust ei ole vĂ”i seadistused ja riistvara on hĂ€sti valitud.

Linuxi hÀÀlestamine PostgreSQLi jÔudluse parandamiseks. Ilya Kosmodemyanskiy

Mis see on ja kuidas see vĂ€lja nĂ€eb? Tavaliselt astuvad inimesed, kes töötavad PostgreSQL-iga, sellesse valdkonda korduvalt. Selgitan. Nagu ma ĂŒtlesin, teeb PostgreSQL perioodiliselt kontrollpunkte, et mÀÀrdunud lehed jagatud mĂ€lust kettale salvestada. Kui meil on suur jagatud mĂ€lu maht, siis hakkab kontrollpunkt intensiivselt kettale mĂ”ju avaldama, kuna see salvestab need lehed fsync'iga. Need jĂ”uavad kernel-buffrisse ja kirjutatakse ketastele fsync'i abil. Ja kui selle mahud on suured, siis vĂ”ime jĂ€lgida ebameeldivat efekti, nimelt vĂ€ga kĂ”rget ketaste kasutust.

Siin on mul kaks pilti. Selgitan, mis need on. Need on kaks ajaliselt korreleeritud graafikut. Esimene graafik – see on ketta kasutus. Siin ulatub see antud hetkel peaaegu 90%-ni. Kui teie andmebaas ja fĂŒĂŒsilised kettad koos RAID-kontrolleriga saavutavad 90% kasutust, siis on see halvad uudised. See tĂ€hendab, et veel natuke ja jĂ”uame 100%-ni ning sisend-vĂ€ljund peatub.

Kui teil on kettasĂŒsteem, siis on seal veidi teine lugu. See sĂ”ltub sellest, kuidas see on konfigureeritud, milline sĂŒsteem see on jne.

Samas on siin konfigureeritud graafik PostgreSQL-i sisemise vaate pĂ”hjal, mis nĂ€itab, kuidas kontrollpunkt toimub. Roheline vĂ€rv nĂ€itab, kui palju bufreid, neid mÀÀrdunud lehti, on sel hetkel selle kontrollpunkti jaoks sĂŒnkroniseerimiseks saabunud. Ja see on peamine, mida siin teadma peame. NĂ€eme, et meil on siin palju lehti saabunud ja mingil hetkel saime 'plaati' otsa, st kirjutasime-kirjutasime, siin on ilmselgelt kettasĂŒsteem vĂ€ga hĂ”ivatud. Ja meie kontrollpunkt avaldab kettale suurt mĂ”ju. Ideaalis peaks olukord vĂ€lja nĂ€gema pigem nii, et meil oleks siin vĂ€hem kirjutatud. Ja saame seadistustega selle parandada, et tulevikus niimoodi ei juhtuks. St kasutus on vĂ€ike, kuid midagi me siin kirjutame.

Mida tuleb teha, et see probleem ĂŒletada? Kui teie andmebaasi IO on peatunud, tĂ€hendab see, et kĂ”ik kasutajad, kes tulid oma pĂ€ringute tĂ€itmiseks, peavad ootama.

Linuxi hÀÀlestamine PostgreSQLi jÔudluse parandamiseks. Ilya Kosmodemyanskiy

Kui vaadata Linuxi perspektiivist, siis kui olete valinud hea riistvara, seadistanud selle Ôigesti ja konfigureerinud PostgreSQL, et see teeks need checkpoints harvem, ja hajutaks need ajaliselt, siis jÀÀte Debian'i vaikeseadistuste juurde. Enamiku Linuxi distributsioonide puhul on pilt jÀrgmine: vm.dirty_ratio=20, vm.dirty_background_ratio=10.

Mida see tĂ€hendab? Tuumast 2.6 alates ilmus ĂŒks demon, mis tegeleb andmete tĂŒhjendamisega. Pdglush sĂ”ltuvalt sellest, kes mida kasutab, tegeleb taustal mÀÀrdunud lehtede eemaldamisega kernel buffer'ist ja eemaldab need, kui on hĂ€davajalik tĂŒhjendada mÀÀrdunud lehti, kui taustal tĂŒhjendamine enam ei aita.

Millal algab taust? Kui 10% kogu serveri RAM-ist on mÀÀrdunud lehtedega kernel buffer'is, siis kutsutakse spetsiaalne funktsioon tĂŒhjendamiseks taustal. Miks see on taustal? See vĂ”tab parameterina, kui palju lehti tĂŒhjendada. NĂ€iteks tĂŒhjendab N lehte. Ja mĂ”neks ajaks see asi magab. Siis tuleb see jĂ€lle ja tĂŒhjendab veel mingi arvu lehti.

See on ÀÀrmiselt lihtne lugu. Siin on ĂŒlesanne nagu basseinis, kus ĂŒhte torusse voolab vett ja teisest voolab vĂ€lja. Meil on checkpoint ja kui ta on saatnud vĂ€he mÀÀrdunud lehti eemaldamiseks, siis imenduvad need jĂ€rk-jĂ€rgult kernel buffer'i pgflush'i kaudu.

Kui need mÀÀrdunud lehed jĂ€tkuvalt kuhjuvad, kuhjuvad nad kuni 20%, pĂ€rast seda on OS prioriteet need Ă€ra tĂŒhjendada, sest vĂ”ite kaotada toite ja meil lĂ€heb kĂ”ik halvasti. NĂ€iteks vĂ”ime kaotada need andmed.

Mis on trikk? Trikk seisneb selles, et need parameetrid, 20 ja 10% kogu masina RAM-ist, on tĂ€iesti kohutavad diskisĂŒsteemi lĂ€bilaskvuse seisukohalt, mis teil on.

Kujutage ette, et teil on 128 GB RAM. 12,8 GB jĂ”uab teie diskisĂŒsteemi. Ja milline iganes vahemĂ€lu vĂ”i maatriks teil seal on, ei suuda nad seda taluda.

Linuxi hÀÀlestamine PostgreSQLi jÔudluse parandamiseks. Ilya Kosmodemyanskiy

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

Arvatakse, et kĂ”ik on vĂ€ga lihtne. VĂ”ite vm.dirty_background seadistada baitides. Need seaded tĂŒhistavad kaks eelnevat. Kas defaukti jĂ€rgi, vĂ”i aktiveeritakse need, mis on baitides, ja siis töötavad need, mis on baitides. Aga kuna ma olen DBA-konsultant ja töötan erinevate klientidega, siis pĂŒĂŒan ma tagada, et kĂ”ik oleks stabiilne, seega, kui baitides, siis baitides. Keegi ei ole andnud mingisugust garantiid, et hea admin ei lisa serverisse mĂ€lu, ei taaskĂ€ivita teda, ja numbrid jÀÀvad samaks. Lihtsalt arvutage need numbrid, et garanteerida, et kĂ”ik mahub sinna sisse.

Mis juhtub, kui te ei mahu sisse? Mul on kirjas, et igasugune flushing peatub efektiivselt, aga tegelikult on see metafoor. OperatsioonisĂŒsteemil on tĂ”sine probleem – tal on palju rĂ€pane lehti, seega peatub efektiivselt see IO, mis teie klientide poolt genereeritud, st. kui rakendus saadab SQL-pĂ€ringu andmebaasi, ootab see. Iga IO sinna – on madalaimal prioriteedil, sest andmebaas on kinni checkpointis. Ja millal ta selle lĂ”petab, pole selge. Ja kui olete jĂ”udnud mitte-taustalisse flushing'usse, siis see tĂ€hendab, et kogu teie IO on selle tööga hĂ”ivatud. Ja seni, kuni see ei lĂ”peta, ei tee te midagi.

Siin on veel kaks olulist punkti, mis ĂŒletavad selle ettekande piire. Need seaded peavad vastama postgresql.conf seadetega, st. checkpointide seadistustega. Ja teie diskisĂŒsteem peab olema Ă”igesti seadistatud. Kui teil on RAID-kate, siis sellel peaks olema aku. Inimesed ostavad RAIDi hea kĂ€tiga ilma akuta. Kui teil on SSD RAIDis, siis need peaks olema serveri tĂŒĂŒpi, seal peaks olema kondensaatorid. Siin on pĂ”hjalik kontrollnimekiri. Selle lingi kaudu on mu ettekannet, kuidas konfigureerida disk perfomance'i PostgreSQL-is. Seal on kĂ”ik need kontrolle.

Linuxi hÀÀlestamine PostgreSQLi jÔudluse parandamiseks. Ilya Kosmodemyanskiy

Mis veel vĂ”ib elu keeruliseks muuta? Need on kaks parameetrit. Need on suhteliselt uued. Need vĂ”ivad erinevates rakendustes olla vaikimisi sisselĂŒlitatud. Ja need vĂ”ivad keeruliseks muuta elu mitte vĂ€hem, kui nad on valesti sisse lĂŒlitatud.

Linuxi hÀÀlestamine PostgreSQLi jÔudluse parandamiseks. Ilya Kosmodemyanskiy

On kaks suhteliselt uut funktsiooni. Need on juba ilmunud kolmandates kernites. Need on sched_migration_cost nanosekundites ja sched_autogroup_enabled, mis vaikimisi on ĂŒks.

Ja kuidas nad elu rikuvad? Mis on sched_migration_cost? Linuxi ajakava vĂ”ib protsessi migreerida ĂŒhest CPU-st teise. Ja PostgreSQL jaoks, mis tĂ€idab pĂ€ringuid, on migreerimise pĂ”hjustamine teisele CPU-le tĂ€iesti arusaamatu. OperatsioonisĂŒsteemi seisukohalt, kui vahetate aknaid OpenOffice'i ja terminali vahel, siis see vĂ”ib-olla on hea, kuid andmebaasi jaoks – see on vĂ€ga halb. SeetĂ”ttu on mĂ”istlik poliitika seada migration_cost mĂ”neks suureks vÀÀrtuseks, vĂ€hemalt paar tuhat nanosekundit.

Mida see scheduler’i jaoks tĂ€hendab? Ta peab arvestama, et selle aja jooksul on see protsess endiselt kuum. T. e. kui teil on mĂ”ni pikk tehing, mis millegagi kaua tegeleb, siis scheduler saab sellest aru. Ta arvab, et seni, kuni see ajavahemik ei ole möödas, ei ole mĂ”tet seda protsessi mitte kuhugi migreerida. Kui protsess sel ajal midagi teeb, siis ei migreerita seda kuhugi, vaid ta lĂ”petab rahulikult selle CPU-l, mis talle mÀÀratud. Ja tulemus on suurepĂ€rane.

Teine aspekt on autogroup. Oleks hea idee spetsiifiliste töökoormuste jaoks, mis ei ole seotud kaasaegsete andmebaasidega – rĂŒhmitada protsessid vastavalt sellele virtuaalsele terminalile, mille alt nad on kĂ€ivitatud. See on mugav mĂ”ningate ĂŒlesannete jaoks. Praktikas on PostgreSQL mitme protsessiga sĂŒsteem prefork’iga, mis kĂ€ivitatakse ĂŒhest terminalist. Teil on lock writer, checkpoint ja kĂ”ik teie kliendipĂ€ringud rĂŒhmitatakse ĂŒhe ajakava alla, ĂŒhe CPU alla. Ja nad ootavad seal rahulikult, kuni see vabastatakse, et ĂŒksteisele segada ja kauem oma ressursse kasutada. See on lugu, mis on sellise koormuse korral tĂ€iesti ebavajalik ja seetĂ”ttu tuleb see vĂ€lja lĂŒlitada.

Linuxi hÀÀlestamine PostgreSQLi jÔudluse parandamiseks. Ilya Kosmodemyanskiy

Minu kolleeg Alexey Lesovski tegi teste lihtsa pgbench'iga, kus ta suurendas migration_cost vÀÀrtust ja lĂŒlitas autogroup vĂ€lja. Halva riistvara korral oli erinevus peaaegu 10%. Postgresi postituslistis toimub arutelu, kus inimesed toovad tulemusi selle kohta, kuidas sarnased muutused pĂ€ringu kiirus mĂ”jutasid 50%. Selliseid lugusid on pĂ€ris palju.

Linuxi hÀÀlestamine PostgreSQLi jÔudluse parandamiseks. Ilya Kosmodemyanskiy

Ja lĂ”petuseks vooluharjumuste poliitika. HĂ€sti, et nĂŒĂŒd saab Linuxit kasutada sĂŒlearvutis. Ja see eeldab, et see sÀÀstab aku energiat. Kuid ootamatult selgub, et serveris vĂ”ib see samuti juhtuda.

Veelgi enam, kui rentite servereid mĂ”nelt hostitajalt, siis on "head" hostitajad ei hoolitse selle eest, et teie jĂ”udlus oleks parem. Nende ĂŒlesanne on tagada, et nende riistvara oleks maksimaalselt efektiivne. SeetĂ”ttu vĂ”ivad nad vaikimisi oma operatsioonisĂŒsteemis lubada sĂŒlearvuti energiasÀÀstureĆŸiimi.

Kui kasutate andmebaasi serveris, mille koormus on kÔrge, siis teie valikuks on acpi_cpufreq + performance. Isegi ondemandiga hakkavad juba probleemid tekkima.

Intel_pstate on juba veidi teine draiver. Praegu eelistatakse seda, kuna see on uuem ja töötab paremini.

Ja seega governor ainult performance. Ondemand, powersave ja kĂ”ik muu – see ei ole teie jaoks.

PostgreSQL explain analyze tulemused vÔivad erineda mitme jÀrgu vÔrra, kui lubate powersave, kuna teie all oleva andmebaasi CPU ajakava on tÀiesti ettearvamatu.

Need asjad vĂ”ivad olla vaikimisi sisse lĂŒlitatud. Vaadake hoolikalt – kas need on vaikimisi sisse lĂŒlitatud. See vĂ”ib olla tĂ”eliselt suur probleem.

Linuxi hÀÀlestamine PostgreSQLi jÔudluse parandamiseks. Ilya Kosmodemyanskiy

Ja lĂ”puks tahaksin tĂ€nada meie DBA meeskonna PosgreSQL-Consulting, eriti Maks Bogu ja Aleksei Lesovsky, kes iga pĂ€ev sellel alal vaeva nĂ€evad. Me pĂŒĂŒame meie klientide jaoks teha kĂ”ik vĂ”imaliku, et see toimiks hĂ€sti. Siin on see nagu lennuohutuse juhistes. KĂ”ik on kirjutatud verega. Iga mutter avastatakse mingi probleemi kĂ€igus. Jagame rÔÔmuga koos teiega.

KĂŒsimused:

AitĂ€h! Kui nĂ€iteks ettevĂ”te soovib kokku hoida ja paigutada andmebaasi ning rakenduse loogika samale serverile vĂ”i kui ettevĂ”te jĂ€rgib moes suundi mikroteenuste arhitektuuris, kus PostgreSQL töötab konteineris. Mis on trikk? Sysctl mĂ”jutavad globaalselt kogu tuuma. Ma ei ole kuulnud, et sysctl kuidagi virtualiseeritaks, et need toimiksid konteineris eraldi. Ainult cgroup ja seal on kontroll ainult osa kohta. Kuidas sellega elada? VĂ”i kui soovite jĂ”udlust, siis kĂ€ivitage PostgreSQL eraldi fĂŒĂŒsilisel serveril ja optimeerige seda?

Me vastasime teie kĂŒsimusele umbes kolme erineva viisi kaudu. Kui jutt ei ole raua serverist, mida saab seadistada jne, siis vĂ”tke rahulikult, kĂ”ik töötab hĂ€sti ilma nende seadistusteta. Kui teil tekib koormus, mis nĂ”uab neid seadistusi, siis jĂ”uate raua serverini varem, kui nende seadistusteni.

Mis on probleem? Kui see on virtuaalmasin, siis on tĂ”enĂ€oliselt palju probleeme, nĂ€iteks see, et paljuski virtuaalmasinate kettas on ebajĂ€rjekindel latentsus. Isegi kui ketaste ribalaius on hea, siis ĂŒks ebaĂ”nnestunud sisend-vĂ€ljundoperatsiooni tehing, mis ei mĂ”juta keskmist ribalaiust, mis juhtus hetkel checkpoin'is vĂ”i WAL'i kirjutamisel, pĂ”hjustab andmebaasile tĂ”siseid probleeme. Ja te mĂ€rkate seda varem, kui te nendesse probleemidesse takerduda.

Kui teil on NGINX samal serveril, siis on ka sama probleem. Ta vÔitleb jagatud mÀluga. Ja te ei jÔua kunagi siinkohal kirjeldatud probleemideni.

Aga teisest kĂŒljest, mĂ”ned neist parameetritest on teile ikkagi olulised. NĂ€iteks, seadistage sysctl'is dirty_ratio, et see ei oleks nii hull – see aitab sellegipoolest. Igal juhul on teil suhe kettaga. Ja see toimub vale mustri jĂ€rgi. Need on vaikimisi parameetrid, mida ma nĂ€itasin. Ja igal juhul on parem need muuta.

NUMA-ga vĂ”ivad olla probleemid. VmWare töötab nĂ€iteks NUMA-ga hĂ€sti tĂ€pselt vastupidiste seadistustega. Siin tuleb valida – raua server vĂ”i mitte raua.

Mul on kĂŒsimus, mis on seotud Amazon AWS-iga. Neil on eelkonfigureeritud pildid. Üks neist nimetatakse Amazon RDS-iks. Kas seal on mingeid kohandatud seadistusi nende operatsioonisĂŒsteemi jaoks?

Seal on seadistused, kuid need on teistsugused seadistused. Siin seadistame operatsioonisĂŒsteemi vaatenurgast, kuidas andmebaas seda kasutab. Ja seal on parameetrid, mis mÀÀravad, kuhu me praegu minema peame, selline shaping. Ehk me vajame nii palju ressursse, me hakkame neid nĂŒĂŒd kulutama. PĂ€rast seda kinnitab Amazon RDS need ressursid, ja sealne jĂ”udlus kannatab. On eraldi lugusid, kuidas 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 teine lugu.

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

Ei toimi. Seda saab selgitada mitmeti. Kuid tegelikult nad lihtsalt ei anna efekti. Mis lugu on PostgreSQLiga? Ta eraldab kĂ€ivitamisel suure tĂŒki jagatud mĂ€lust. Kas nad on transparent vĂ”i mitte – see pole absoluutselt oluline. Fakt, et nad eraldatakse kĂ€ivitamisel, selgitab kĂ”ike. Ja kui mĂ€lu on vĂ€ga palju ja jagatud mĂ€lu segmenti tuleb ĂŒmber ehitada, siis on Transparent huge pages asjakohased. PostgreSQL eraldab selle lihtsalt kĂ€ivitamisel tohutu tĂŒki ja kĂ”ik, edasi seal midagi erilist ei toimu. Loomulikult vĂ”ib seda kasutada, kuid on oht saada jagatud mĂ€lu kahjustusi, kui see pĂŒĂŒab midagi uuesti eraldada. PostgreSQL ei tea sellest.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster