{"id":84082,"date":"2020-06-05T07:42:28","date_gmt":"2020-06-05T05:42:28","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/linux-tuning-to-improve-postgresql-performance-ilya-kosmodemyanskij"},"modified":"2020-06-05T07:42:28","modified_gmt":"2020-06-05T05:42:28","slug":"linux-tuning-to-improve-postgresql-performance-ilya-kosmodemyanskij","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/linux-tuning-to-improve-postgresql-performance-ilya-kosmodemyanskij","title":{"rendered":"Linux optimizacija za izbolj\u0161anje performans PostgreSQL. Ilja Kosmodemjanskij","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>\u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 2015 \u0433\u043e\u0434\u0430 \u0418\u043b\u044c\u0438 \u041a\u043e\u0441\u043c\u043e\u0434\u0435\u043c\u044c\u044f\u043d\u0441\u043a\u043e\u0433\u043e &quot;Linux tuning to improve PostgreSQL performance&quot;<\/p>\n<p><\/p>\n<p>Izjava o odricanju: Napominjem da je ova prezentacija datirana novembrom 2015. godine \u2014 pro\u0161lo je vi\u0161e od 4 godine i vreme je u\u010dinilo svoje. Verzija 9.4 koja se razmatra u ovom izlaganju vi\u0161e nije podr\u017eana. Tokom protekle 4 godine, objavljeno je 5 novih verzija PostgreSQL-a i 15 verzija Linux jezgra. Ako bismo prepisivali ova mesta, na kraju bismo dobili potpuno druga\u010diju prezentaciju. No, ovde se razmatra osnovno pode\u0161avanje Linux-a za PostgreSQL, \u0161to je relevantno i danas.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Linux optimizacija za izbolj\u0161anje performans PostgreSQL. Ilja Kosmodemjanskij\" src=\"\/wp-content\/uploads\/2020\/06\/8292f74a7d004a9c13ff5f1393816340.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<center><div class=\"youtube-placeholder\" data-id=\"V0M6YwWmMYM\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/V0M6YwWmMYM\/hqdefault.jpg\" alt=\"Predvajaj video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<p>Zovem se Ilja Kosmodemjanski. Radim u firmi PostgreSQL-Consulting. Sada \u0107u malo govoriti o tome \u0161ta raditi sa Linux-om kada je re\u010d o bazama podataka generalno, a posebno o PostgreSQL-u, jer su principi vrlo sli\u010dni.<\/p>\n<p><\/p>\n<p>O \u010demu \u0107e se govoriti? Ako komunicirate sa PostgreSQL-om, do odre\u0111ene mere morate biti UNIX administrator. \u0160ta to zna\u010di? Ako uporedimo Oracle i PostgreSQL, u Oracle-u morate biti 80% DBA administrator baze podataka i 20% Linux administrator.<\/p>\n<p><\/p>\n<p>Sa PostgreSQL-om je malo slo\u017eenije. Sa PostgreSQL-om morate mnogo bolje razumeti kako Linux funkcioni\u0161e. I pri tome moramo malo tr\u010dati za vozom, jer se u poslednje vreme sve zna\u010dajno a\u017eurira. I nova jezgra izlaze, i nove funkcije se pojavljuju, performanse se pobolj\u0161avaju itd. <\/p>\n<p><\/p>\n<p>Za\u0161to govorimo o Linux-u? Ne zato \u0161to smo na konferenciji Linux Piter, ve\u0107 zato \u0161to je u savremenim uslovima jedan od najosnovanijih operativnih sistema za rad sa bazama podataka generalno i sa PostgreSQL-om posebno \u2013 Linux. Na\u017ealost, FreeBSD se razvija u veoma \u010dudnom pravcu. I ima\u0107e problema, kako sa performansama, tako i sa mnogim drugim stvarima. <strong>Performanse PostgreSQL-a na Windows-u \u2013 to je uop\u0161te posebna te\u0161ka tema, koja se suo\u010dava sa time \u0161to Windows nema zajedni\u010dku memoriju kao UNIX, a PostgreSQL se oslanja na to, jer je vi\u0161epostupkovni sistem.<\/strong> <\/p>\n<p><\/p>\n<p>I egzotika poput Solaris-a, mislim da manje interesuje sve, tako da da krenemo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Linux optimizacija za izbolj\u0161anje performans PostgreSQL. Ilja Kosmodemjanskij\" src=\"\/wp-content\/uploads\/2020\/06\/990133933bd1816895fc8f73edaf900e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Savremeni Linux distribucije imaju vi\u0161e od 1.000 sysctl parametara, u zavisnosti od toga kako je jezgro sastavljeno. U ovom smislu, ako pogledamo razli\u010dite podavake, mo\u017eemo na mnogo na\u010dina ne\u0161to dodatno prilagoditi. Postoje parametri za datote\u010dne sisteme, na\u010dine monta\u017ee. Ako imate pitanja o pokretanju: \u0161ta uklju\u010diti u BIOS-u, kako podesiti hardver itd.<\/p>\n<p><\/p>\n<p>To je zelo obse\u017ena tema, o kateri lahko govorimo dneve, ne pa v enem kratkem predavanju, vendar se bom osredoto\u010dil na pomembne stvari, kako se izogniti tistim napakam, ki vam zagotovo ne bodo omogo\u010dile dobrega delovanja podatkovne baze na Linuxu, \u010de jih ne odpravite. Pomembno je tudi, da so mnogi privzeti parametri vklju\u010deni v nastavitve, ki niso primerne za podatkovno bazo. To pomeni, da bo privzeto delovalo slabo ali pa ne bo delovalo sploh. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Linux optimizacija za izbolj\u0161anje performans PostgreSQL. Ilja Kosmodemjanskij\" src=\"\/wp-content\/uploads\/2020\/06\/189f6497c795a5e5fd5b458edfadb22f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Katere tradicionalne cilje optimizacije imamo v Linuxu? Menim, da za vas, ki se ukvarjate z upravljanjem Linuxa, ni treba posebej razlagati, kaj so cilji. <\/p>\n<p><\/p>\n<p>Tuning je mogo\u010de opraviti na:<\/p>\n<p><\/p>\n<ul>\n<li>CPU.<\/li>\n<li>Pomnilnik.<\/li>\n<li>Shramba.<\/li>\n<li>Ostalo. O tem bomo govorili na koncu za zakusko. Tudi na primer, tak\u0161ni parametri, kot je politika var\u010devanja z energijo, lahko na zelo nepri\u010dakovan in neprijeten na\u010din vplivajo na zmogljivost. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Linux optimizacija za izbolj\u0161anje performans PostgreSQL. Ilja Kosmodemjanskij\" src=\"\/wp-content\/uploads\/2020\/06\/92916aadaf123a3f836bed3a2c1bd95a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kak\u0161ne so posebnosti PostgreSQL in podatkovnih baz na splo\u0161no? Te\u017eava je v tem, da ne morete optimizirati neke posamezne male stvari in videti, da se je na\u0161a zmogljivost bistveno izbolj\u0161ala. <\/p>\n<p><\/p>\n<p>Da, tak\u0161ne male stvari obstajajo, vendar je podatkovna baza kompleksna zadeva. Interagira z vsemi viri, ki jih stre\u017enik ima, in raje deluje s celotno mo\u010djo. \u010ce si ogledate sodobna priporo\u010dila Oracla o tem, kako uporabljati gostiteljsko OS, bo to kot v anekdotah o mongolskem kozmonavtu \u2013 nahranite psa in ne dotikajte se ni\u010desar. Dajmo bazi vse vire, podatkovna baza bo vse sama uredila. <\/p>\n<p><\/p>\n<p>Na splo\u0161no je situacija pri PostgreSQL podobna. Razlika je v tem, da baza sama ne more vedno pridobiti vseh virov, torej je nekje treba to samo poenostaviti na ravni Linuxa. <\/p>\n<p><\/p>\n<p>Glavna ideja je, da ne izberete nekega enega cilja in za\u010dnete optimizirati, na primer, pomnilnik, CPU ali kaj podobnega, temve\u010d analizirati delovno obremenitev in poskusiti maksimalno izbolj\u0161ati preto\u010dnost, da skozi na\u0161o podatkovno bazo \u010dim bolj u\u010dinkovito preide obremenitev, ki so jo dobri programerji ustvarili za nas, vklju\u010dno z na\u0161imi uporabniki. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Linux optimizacija za izbolj\u0161anje performans PostgreSQL. Ilja Kosmodemjanskij\" src=\"\/wp-content\/uploads\/2020\/06\/2db6c11a6f612b8aecccfe126be4fd7f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tukaj je slika, ki pojasnjuje, kaj je to. Obstaja pomnilnik operacijskega sistema Linux ter deljena in deljena pomnilnika PostgreSQL. PostgreSQL v nasprotju z Oracle deluje neposredno samo preko pomnilnika jedra, torej da pride stran s diska v njegovo deljeno pomnilnik, mora najprej iti skozi pomnilnik jedra in se vrniti nazaj, je situacija prav tako. <\/p>\n<p><\/p>\n<p>Pod tem sistemom so diski. Narisan sem jih kot diske. V resnici tam lahko obstaja RAID kontroler itd. <\/p>\n<p><\/p>\n<p>In ta vhod-izhod se na ta ali oni na\u010din dogaja preko tega sistema.<\/p>\n<p><\/p>\n<p>PostgreSQL je klasi\u010dna podatkovna baza. Znotraj nje so strani. Vse vhodno-izhodne operacije potekajo z uporabo strani. Z njo nalagamo bloke v pomnilnik. In \u010de se ni\u010d ne zgodi, pa\u010d preberemo te bloke, se postopoma iz tega predpomnilnika, iz deljenih pomnilnikov, potopijo nazaj na disk. <\/p>\n<p><\/p>\n<p>\u010ce kje nekaj zamenjamo, se cela stran ozna\u010di kot umazana. Tukaj sem jih ozna\u010dil z modro barvo. To pomeni, da mora biti ta stran usklajena z blokovnim skladi\u0161\u010dem. Torej, ko jo naredimo umazano, zapi\u0161emo vanjo v WAL. In v nekem \u010dudovitem trenutku se zgodi pojav, imenovan checkpoint. In v ta dnevnik se zabele\u017ei informacija o tem, da je pri\u0161el. To pomeni, da so vseh umazanih strani, ki so bile v tem trenutku v teh deljenih pomnilnikih, usklajene z diskom skladi\u0161\u010da s pomo\u010djo fsync preko pomnilnika jedra.<\/p>\n<p><\/p>\n<p>Zakaj se to izvaja? \u010ce nam izgine elektrika, ne dobimo situacije, da so vsi podatki izginili. Trajna pomnilnika, o kateri so nam vsi govorili, je zaenkrat v teoriji podatkovnih baz \u2013 to je svetla prihodnost, ki ji seveda stremimo in nam je v\u0161e\u010d, a zaenkrat \u0161e \u017eivimo 20 let v preteklosti. In seveda, vse to je treba nadzorovati.<\/p>\n<p><\/p>\n<p>Cilj pove\u010danja pretoka je optimizirati na vseh teh stopnjah, da vse hitro deluje. Deljena pomnilnika je ve\u010dinoma predpomnilnik strani. V PostgreSQL smo poslali zahtevo select nekaj tam, dobil je te podatke iz diska. Ti so pri\u0161li v deljene pomnilnike. Da bi to delovalo bolje, mora biti veliko pomnilnika.<\/p>\n<p><\/p>\n<p>Da bi sve ovo radilo dobro i brzo, potrebno je pravilno konfigurisati operativni sistem na svim nivoima. Tako\u0111e je va\u017eno odabrati uravnote\u017eenu hardversku opremu, jer ako do\u0111e do neravnote\u017ee na nekom mestu, mo\u017eete imati veoma puno memorije, ali \u0107e njen rad biti spor. <\/p>\n<p><\/p>\n<p>Hajde da pro\u0111emo kroz svaku od ovih ta\u010daka.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Linux optimizacija za izbolj\u0161anje performans PostgreSQL. Ilja Kosmodemjanskij\" src=\"\/wp-content\/uploads\/2020\/06\/fe031218be39cd727f3a76b22563e101.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Da bi ove stranice putovale br\u017ee, potrebno je posti\u0107i slede\u0107e:<\/p>\n<p><\/p>\n<ul>\n<li>Prvo, potrebno je efikasnije raditi sa memorijom.<\/li>\n<li>Drugo, tranzicija kada stranice prelaze iz memorije na disk mora biti efikasnija.<\/li>\n<li>I tre\u0107e, potrebno je imati dobre diskove. <\/li>\n<\/ul>\n<p><\/p>\n<p>Ako imate 512 GB RAM-a u <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/sl\/server\/dts-dronten\/\"   title=\"stre\u017enikom\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"2587\">stre\u017enikom<\/a> i sve to na kraju ide na SATA hard disk bez bilo kakvog ke\u0161a, ceo server baze podataka ne postaje samo slabo, ve\u0107 postaje slabo sa SATA interfejsom. Onda \u0107ete se direktno suo\u010diti sa tim problemom i ni\u0161ta vas ne\u0107e spasiti.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Linux optimizacija za izbolj\u0161anje performans PostgreSQL. Ilja Kosmodemjanskij\" src=\"\/wp-content\/uploads\/2020\/06\/6630e445c96e94621ae670bc4aee8492.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0160to se ti\u010de prvog dela o memoriji, postoje tri stvari koje mogu uveliko ote\u017eati situaciju. <\/p>\n<p><\/p>\n<p>Prva od njih jeste NUMA. NUMA je sistem napravljen radi pobolj\u0161anja performansi. U zavisnosti od optere\u0107enja, razli\u010dite stvari se mogu optimizovati. U svom trenutnom obliku nije ba\u0161 najbolja za aplikacije kao \u0161to su baze podataka, koje intenzivno koriste page cache i deljene baferne resurse. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Linux optimizacija za izbolj\u0161anje performans PostgreSQL. Ilja Kosmodemjanskij\" src=\"\/wp-content\/uploads\/2020\/06\/8fcf2af82a96bd1ac52fb0a36bf0b0b5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>U nekoliko re\u010di. Kako znati da ne\u0161to nije u redu sa NUMA-om? Mo\u017eda imate neki neprijatan zvuk, iznenada jedan CPU postane preoptere\u0107en. Pri tome analizirate zahteve u PostgreSQL-u i ne vidite ni\u0161ta sli\u010dnog. Ti zahtevi ne bi trebali da konzumiraju CPU toliko intenzivno. Mo\u017ee potrajati dugo da to uhvatite. Lak\u0161e je odmah po\u0161tovati ispravnu preporuku kako konfigurisati NUMA za PostgreSQL.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Linux optimizacija za izbolj\u0161anje performans PostgreSQL. Ilja Kosmodemjanskij\" src=\"\/wp-content\/uploads\/2020\/06\/424b8677e5ae1382b9b49b288e045a3f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0160ta se zapravo de\u0161ava? NUMA je Non-Uniform Memory Access. U \u010demu je stvar? Imate CPU, pored njega je njegova lokalna memorija. Ta memorija mo\u017ee pristupiti memoriji drugih CPU-a putem interkonekcija.<\/p>\n<p><\/p>\n<p>Ako pokrenete <code>numactl --hardware<\/code>, dobi\u0107ete veliku stanicu. Me\u0111u ostalim, tu \u0107e biti polje razdaljina. Bi\u0107e cifara \u2013 10-20, ne\u0161to u tom smislu. Te cifre su ni\u0161ta drugo do broj hopova potrebnih da bi se ta udaljena memorija povezala i koristila lokalno. U osnovi, dobra ideja. To poma\u017ee u ubrzavanju performansi pod odre\u0111enim optere\u0107enjima.<\/p>\n<p><\/p>\n<p>Zdaj si predstavljajte, da ima\u0161 en CPU, ki najprej posku\u0161a uporabiti svojo lokalno pomnilnik, nato pa posku\u0161a po interconnectu pritegniti drugo pomnilnik za kaj. In na ta CPU pride celoten va\u0161 page cache PostgreSQL \u2013 vse, kar ima nekaj gigabajtov. Vedno dobite najslab\u0161i scenarij, ker na CPU-ju v tem modulu pomnilnika obi\u010dajno ni veliko. In vsa pomnilnika, ki se upravlja, prehaja skozi te interconnects. To je po\u010dasi in \u017ealostno. In imate procesor, ki nenehno obremenjuje ta vozel. In \u010das dostopa do tega pomnilnika je slab, po\u010dasen. To je situacija, ki je ne \u017eelite, \u010de to uporabljate za bazo podatkov. <\/p>\n<p><\/p>\n<p>Zato je bolj pravilna izbira za bazo podatkov, da operacijski sistem Linux sploh ne ve, kaj se dogaja. Da se obravnava pomnilnik, kot se obravnava. <\/p>\n<p><\/p>\n<p>Zakaj tako? Zdi se, da bi moralo biti obratno. Do tega prihaja iz enostavnega razloga, da potrebujemo veliko pomnilnika za page cache \u2013 desetine, sto gigabajtov. <\/p>\n<p><\/p>\n<p>In \u010de smo to vse dodelili in zakasnili na\u0161e podatke tam, bo pridobitev od uporabe cache-a bistveno ve\u010dja kot pridobitev od takega pametnega dostopa do pomnilnika. Tako bomo na ta na\u010din pridobili nesorazmerno v primerjavi s tem, da bomo u\u010dinkoviteje dostopali do pomnilnika z uporabo NUMA.<\/p>\n<p><\/p>\n<p>Zato sta do sedaj dva pristopa, dokler ne pride svetla prihodnost, ko baza podatkov ne more sama ugotoviti, na katerih CPU-jih deluje in od kje naj potegne. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Linux optimizacija za izbolj\u0161anje performans PostgreSQL. Ilja Kosmodemjanskij\" src=\"\/wp-content\/uploads\/2020\/06\/218513d407ea77320057d57b447c54d3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Zato je pravi pristop popolnoma onemogo\u010diti NUMA<\/strong>, na primer, ob ponovnem zagonu. V ve\u010dini primerov so prihranki tako veliki, da vpra\u0161anje, kaj je bolje, sploh ne nastane. <\/p>\n<p><\/p>\n<p>Obstaja \u0161e en na\u010din. Pogosteje ga uporabljamo kot prvega, ker ko nam stranka pride na podporo, je ponovno zagon stre\u017enika za njih velik dogodek. Imajo tam razpeto poslovanje. In te\u017eave zaradi NUMA do\u017eivljajo. Zato se trudimo onemogo\u010diti na manj invazivne na\u010dine kot ponovno zagon, vendar tukaj previdno preverite, da je onemogo\u010deno. Ker, kot ka\u017ee izku\u0161nja, onemogo\u010dimo NUMA star\u0161evskega procesa PostgreSQL, kar je dobro, vendar ni nujno, da deluje. Potrebno je preveriti in videti, da se dejansko onemogo\u010dilo. <\/p>\n<p><\/p>\n<p>Obstaja dober \u010dlanek Roberta Haasa. Je eden od razvijalcev PostgreSQL, eden od klju\u010dnih razvijalcev vseh nizkoro\u010dnih komponent. In \u010de sledite povezavam iz tega \u010dlanka, boste na\u0161li ve\u010d barvitih zgodb o tem, kako je ljudem NUMA ote\u017eila \u017eivljenje. Oglejte si in preu\u010dite seznam nastavitev za skrbnike, ki jih je treba konfigurirati na stre\u017eniku, da bo na\u0161a baza podatkov delovala dobro. Te nastavitve je treba zapisati in preverjati, sicer ne bo dobro. <\/p>\n<p><\/p>\n<p>Opa\u017eam, da to velja za vse nastavitve, o katerih bom govoril. Obi\u010dajno se baze podatkov postavijo v na\u010din master-slave za odpornost na napake. Ne pozabite uvesti teh nastavitev na slave, ker se bo v dolo\u010denem trenutku zgodila napaka, vi pa se boste preklopili na slave, ki bo postal master. <\/p>\n<p><\/p>\n<p>V izredni situaciji, ko je vse zelo slabo, bo va\u0161 telefon nenehno zvonil, direktor bo prihitel s palico, in takrat ne boste imeli \u010dasa razmi\u0161ljati o preverjanju. Rezultati so lahko zelo ob\u017ealovanja vredni.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Linux optimizacija za izbolj\u0161anje performans PostgreSQL. Ilja Kosmodemjanskij\" src=\"\/wp-content\/uploads\/2020\/06\/d2fdda7ad4570554b0e134758295f83e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Naslednja to\u010dka so huge pages. Huge pages je te\u017eko testirati lo\u010deno, niti ni pretiranega smisla za to, \u010deprav obstajajo benchmarki, ki to znajo storiti. Ti so enostavno dostopni preko iskalnika. <\/p>\n<p><\/p>\n<p>Kak\u0161en je smisel? Imate server, ki ni zelo drag, vendar ima veliko RAM-a, na primer ve\u010d kot 30 GB. Huge pages niso uporabljene. To pomeni, da zagotovo imate overhead pri uporabi pomnilnika. In ta overhead ni ravno prijeten. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Linux optimizacija za izbolj\u0161anje performans PostgreSQL. Ilja Kosmodemjanskij\" src=\"\/wp-content\/uploads\/2020\/06\/28c3c94390a6afef815f712ac9189c2d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zakaj tako? Kaj se dogaja? Operacijski sistem dodeljuje pomnilnik v majhnih kosih. To je priro\u010dno, tako je zgodovinsko postalo. \u010ce se poglobimo, mora OS pretvoriti virtualne naslove v fizi\u010dne. Ta proces ni najpreprostej\u0161i, zato OS rezultat te operacije predpomni v Translation Lookaside Buffer (TLB).<\/p>\n<p><\/p>\n<p>In ker je TLB predpomnilnik, se v tej situaciji pojavljajo vsi problemi, ki jih povzro\u010dajo predpomnilniki. Prvi\u010d, \u010de imate zelo veliko operativne pomnilnika in je ta dodeljena v majhnih kosih, potem ta predpomnilnik postane zelo velik. In \u010de je predpomnilnik velik, je iskanje po njem po\u010dasnej\u0161e. Overhead je zdrav in sam zavzema prostor, tj. operativna pomnilnik porabi nekaj, kar ni pravilno. To je ena stvar. <\/p>\n<p><\/p>\n<p>Dva \u2013 \u010dim se ke\u0161 u ovoj situaciji vi\u0161e \u0161iri, ve\u0107a je verovatno\u0107a da \u0107e vam se desiti cache misses. Efikasnost ovog ke\u0161a naglo opada sa pove\u0107anjem njegove veli\u010dine. Stoga su u operativnim sistemima smislili jednostavan pristup. U Linuxu se ve\u0107 dugo koristi. U FreeBSD-ju je nedavno uveden. No, govorimo o Linuxu. To su huge pages.<\/p>\n<p><\/p>\n<p>Ovde treba napomenuti da su huge pages, kao ideja, prvobitno podr\u017eali zajednice koje su obuhvatale Oracle i IBM, tj. proizvo\u0111a\u010di baza podataka su ozbiljno razmi\u0161ljali o tome kako \u0107e to biti korisno, uklju\u010duju\u0107i i baze podataka. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Linux optimizacija za izbolj\u0161anje performans PostgreSQL. Ilja Kosmodemjanskij\" src=\"\/wp-content\/uploads\/2020\/06\/39a24536929fbcf551d8ba1c8e7faf32.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kako to povezati sa PostgreSQL-om? Prvo, u Linux jezgru moraju biti uklju\u010dene huge pages.<\/p>\n<p><\/p>\n<p>Drugo, moraju biti eksplicitno navedene putem sysctl parametra \u2013 koliko ih ima. Brojevi ovde poti\u010du sa nekog starog servera. Mo\u017eete izra\u010dunati koliko otprilike imate shared buffers, da bi huge pages stali u njih. <\/p>\n<p><\/p>\n<p>Ako je ceo server dodeljen PostgreSQL-u, onda je dobra polazna ta\u010dka ili 25 % RAM-a odvojiti za shared buffers, ili 75 %, ako ste sigurni da va\u0161a baza podataka sigurno staje u tih 75 %. To je prva polazna ta\u010dka. I izra\u010dunajte, ako imate 256 GB RAM-a, tada \u0107ete imati 64 GB shared buffers. Izra\u010dunajte otprilike sa nekim rezervama \u2013 kolika bi ta cifra trebala da bude.<\/p>\n<p><\/p>\n<p>Do verzije 9.2 (ako se ne varam, od verzije 8.2) moglo je da se pomo\u0107u eksternih biblioteka pove\u017eu PostgreSQL i huge pages. To uvek treba u\u010diniti. Prvo, potrebno je da jezgro ume pravilno da alocira huge pages. A, drugo, aplikacija koja s njima radi mora mo\u0107i da ih iskoristi. Ne\u0107e to uraditi samo od sebe. Po\u0161to je PostgreSQL alocirao memoriju na na\u010din system 5, to se moglo uraditi pomo\u0107u libhugetlbfs \u2013 to je puno ime biblioteke.<\/p>\n<p><\/p>\n<p>V razli\u010dici 9.3 smo izbolj\u0161ali zmogljivost PostgreSQL pri delu z pomnilnikom in opustili metodo dodeljevanja pomnilnika system 5. Vsi smo bili zelo veseli, saj sicer, ko posku\u0161ate zagnati dva primerka PostgreSQL na eni napravi, re\u010de, da mi zmanjkuje deljenega pomnilnika. In pove, da je treba popraviti sysctl. In tam je tak sysctl, da je treba \u0161e ponovno zagnati itd. Na splo\u0161no smo bili vsi veseli. Vendar pa je dodeljevanje pomnilnika mmap pokvarilo uporabo ogromnih strani. Ve\u010dina na\u0161ih strank uporablja velike deljene buferje. Zelo priporo\u010damo, da ne prehajate na 9.3, saj se je tam overhead za\u010del meriti v ve\u010d odstotkih.<\/p>\n<p><\/p>\n<p>Toda skupnost se je osredoto\u010dila na ta problem in v 9.4 so zelo dobro prenovili to zadevo. V 9.4 se je pojavil parameter v postgresql.conf, s katerim lahko omogo\u010dite mo\u017enost try, on ali off.<\/p>\n<p><\/p>\n<p>Try je najbolj varna mo\u017enost. Ob zagonu PostgreSQL, ko dodeljuje deljen pomnilnik, posku\u0161a pobrati ta pomnilnik iz ogromnih strani. In \u010de mu ne uspe, se preklopi na obi\u010dajno dodelitev. \u010ce imate FreeBSD ali Solaris, lahko nastavite try, to je vedno varno. <\/p>\n<p><\/p>\n<p>\u010ce je nastavitev on, se preprosto ne za\u017eene, \u010de mu ne uspe pridobiti iz ogromnih strani. Tu je odvisno od va\u0161ih preferenc. Toda \u010de imate try, preverite, da se je res dodelil tisto, kar potrebujete, ker je tam veliko prostora za napake. Ta funkcionalnost trenutno deluje samo na Linuxu.<\/p>\n<p><\/p>\n<p>\u0160e ena majhna opomba, preden gremo naprej. Transparent huge pages trenutno niso povezane s PostgreSQL. Na normalno uporabo le-teh ne more. In pri Transparent huge pages za tak workload, ko potrebujete velik kos deljenega pomnilnika, so prednosti prisotne le pri zelo velikih koli\u010dinah. \u010ce imate terabajne pomnilnika, potem to lahko igra vlogo. \u010ce govorimo o bolj obi\u010dajnih uporabah, ko imate 32, 64, 128, 256 GB pomnilnika na napravi, so obi\u010dajne ogromne strani v redu, transparentne pa preprosto izklopimo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Linux optimizacija za izbolj\u0161anje performans PostgreSQL. Ilja Kosmodemjanskij\" src=\"\/wp-content\/uploads\/2020\/06\/18cf3ace8876e55b42e66f617a24f1bc.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In zadnja stvar, ki se nana\u0161a na pomnilnik in ni neposredno povezana s prepustnostjo, lahko mo\u010dno pokvari \u017eivljenje. Vsa prepustnost lahko mo\u010dno trpi, \u010de se stre\u017enik nenehno swap-a. <\/p>\n<p><\/p>\n<p>In this case, it can be quite unpleasant for various reasons. The main inconvenience lies in the fact that modern kernels behave slightly differently than older Linux kernels. This is a situation we want to avoid, because when we talk about working with swap, it often leads to an untimely arrival of the OOM-killer. An OOM-killer that comes too late and terminates PostgreSQL is certainly an inconvenience. Everyone will notice this, including end users. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Linux optimizacija za izbolj\u0161anje performans PostgreSQL. Ilja Kosmodemjanskij\" src=\"\/wp-content\/uploads\/2020\/06\/c7c46ff0f4cd8cfcfb21978dd1da4c08.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>What is happening? You have a large amount of RAM, everything is functioning well. But for some reason, the server hangs in swap and slows down because of this. It seems like there is plenty of memory, but that doesn\u2019t help. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Linux optimizacija za izbolj\u0161anje performans PostgreSQL. Ilja Kosmodemjanskij\" src=\"\/wp-content\/uploads\/2020\/06\/24d19929f1506cd9768a836095a24dfb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Previously, we recommended setting vm.swappiness to zero, meaning to disable swap. We once thought that having 32 GB of RAM and corresponding shared buffers was substantial. The main purpose of swap is to have a space where we can put pages when we run out of memory. And that purpose was no longer effectively fulfilled. And what do you do with those pages after? It becomes a task where it\u2019s not entirely clear why swap is needed, especially of such a large size. <\/p>\n<p><\/p>\n<p>However, in more modern, i.e., third versions of the kernel, the behavior has changed. If you set swap to zero, or disable it, sooner or later, even with some RAM left, the OOM-killer will arrive to terminate the most intensive consumers. Because it will assume that with this workload, we have just a bit left and we're going to run out of memory. The OOM-killer won\u2019t terminate system processes but will eliminate something less critical. This less critical process will usually be the intensive consumer of shared memory, namely postmaster. After this, we can only hope that the database won\u2019t need recovery. <\/p>\n<p><\/p>\n<p>Therefore, currently, by default, as far as I remember, most distributions set it around 6, which indicates when to start using swap depending on the remaining memory. <strong>We now recommend setting vm.swappiness to 1 because it practically disables swap but prevents the issues associated with an unexpectedly arriving OOM-killer that terminates processes.<\/strong> <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Linux optimizacija za izbolj\u0161anje performans PostgreSQL. Ilja Kosmodemjanskij\" src=\"\/wp-content\/uploads\/2020\/06\/20f01dca0aff819abcbb687cea69ac74.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kaj je naslednje? Ko govorimo o zmogljivosti podatkovnih baz in postopoma prehajamo k diskovom, se vsi za\u010dnejo prijemati za glavo. Kajti resnica, da so diski po\u010dasni in spomin hiter, je vsem znana \u017ee od otro\u0161tva. Vsi vedo, da se bodo v podatkovni bazi pojavili problemi z diskovno zmogljivostjo.<\/p>\n<p><\/p>\n<p>Glavni problem zmogljivosti PostgreSQL, povezan s sunkovom checkpoints, ne izhaja iz tega, da je disk po\u010dasen. Gre bolj zato, da propustnost spomina in diska nista uravnote\u017eeni. Hkrati sta lahko neuravnote\u017eeni na razli\u010dnih mestih. PostgreSQL ni nastavljena, operacijski sistem ni nastavljen, strojna oprema ni nastavljena in strojna oprema ni pravilna. Te te\u017eave se ne pojavijo le takrat, ko vse poteka, kot je treba, torej bodisi da ni obremenitve bodisi da so nastavitve in strojna oprema dobro izbrane. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Linux optimizacija za izbolj\u0161anje performans PostgreSQL. Ilja Kosmodemjanskij\" src=\"\/wp-content\/uploads\/2020\/06\/c4d841f9ed48bb5bb1b29bd9f189753f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kaj to je in kako izgleda? Obi\u010dajno ljudje, ki delajo s PostgreSQL, v to zadevo vstopajo ve\u010dkrat. Pojasnil bom. Kot sem rekel, PostgreSQL ob\u010dasno izvaja checkpoints, da 'umazane' strani iz deljenega spomina shranjuje na disk. \u010ce imamo velik obseg deljenega spomina, checkpoint za\u010dne intenzivno vplivati na disk, ker shranjuje te strani z fsync. Prihaja v jedrni pomnilnik in se zapisuje na diske z uporabo fsync. In \u010de je obseg tega velikega, lahko opazujemo neprijeten u\u010dinek, in sicer zelo veliko obremenitev diskov.<\/p>\n<p><\/p>\n<p>Tukaj imam dve sliki. Zdaj bom pojasnil, kaj to je. To sta dva s \u010dasovno koreliranimi grafi. Prvi graf je obremenitev diska. Tu dose\u017ee skoraj 90 % v tem trenutku. \u010ce imate podatkovno bazo s fizi\u010dnimi diski, z RAID kontrolerjem in obremenitev skoraj dose\u017ee 90 %, so to slabe novice. To pomeni, da \u0161e malo in bo dosegla 100 ter vhod-izhod se bo ustavil. <\/p>\n<p><\/p>\n<p>\u010ce imate diskovni niz, je tu nekoliko druga\u010dna zgodba. Odvisno je od tega, kako je nastavljen, kak\u0161en niz je itd. <\/p>\n<p><\/p>\n<p>In parallel, there is a graph configured here from the internal Postgres view, which shows how the checkpoint occurs. The green color indicates the amount of buffers, those dirty pages that arrived at this checkpoint for synchronization at that moment. This is the main thing to know here. We see that a lot of pages have arrived, and at some point, we hit a bottleneck, i.e., we were writing and clearly the disk system is very busy. The checkpoint has a significant impact on the disk. Ideally, the situation should look more like this, meaning we had less writing here. We can fix this with settings to ensure it remains so. That is, utilization is low, but we are still writing something here. <\/p>\n<p><\/p>\n<p>What needs to be done to overcome this problem? If your IO has stopped under the database, it means that all users who came to execute their queries will be waiting. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Linux optimizacija za izbolj\u0161anje performans PostgreSQL. Ilja Kosmodemjanskij\" src=\"\/wp-content\/uploads\/2020\/06\/3efac5fe79443c32f56ec8da2f418116.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>From a Linux perspective, if you have good hardware, set it up correctly, and configured PostgreSQL properly to perform these checkpoints less frequently, spreading them out over time, then you are complying with the default parameters of Debian. For most Linux distributions, the picture looks like this: vm.dirty_ratio=20, vm.dirty_background_ratio=10.<\/p>\n<p><\/p>\n<p>What does this mean? Since version 2.6, there has been a demon for flushing. Pgflush, depending on what is used, is responsible for background flushing of dirty pages from the kernel buffer and for forcibly flushing dirty pages when background flushing is no longer effective. <\/p>\n<p><\/p>\n<p>When does background occur? When 10% of the total RAM available on the server is occupied by dirty pages in the kernel buffer, a special background write function is triggered. Why is it called background? It takes as a parameter how many pages to flush. For example, it flushes N pages. For some time, this process sleeps and then comes back to flush another amount of pages. <\/p>\n<p><\/p>\n<p>This is a very simple story. It's like a pool where water flows in one pipe and out another. We have a checkpoint that arrived, and if it sent few dirty pages for flushing, then gradually, the pgflush will carefully disperse everything from the kernel buffer. <\/p>\n<p><\/p>\n<p>\u010ce se te umazane strani \u0161e naprej kopi\u010dijo, se naberejo do 20 %, nato pa operacijski sistem prednostno zapi\u0161e vse to na disk, ker se lahko izklopi napajanje, in imeli bomo te\u017eave. Tako bomo izgubili te podatke, na primer. <\/p>\n<p><\/p>\n<p>Kaj je trik? <strong>Trik je v tem, da so ti parametri v sodobnem svetu 20 in 10 % celotne operativne pomnilnosti, ki jo ima naprava, povsem obupni z vidika prepustnosti katere koli diskovne sisteme, ki jo imate.<\/strong> <\/p>\n<p><\/p>\n<p>Predstavljajte si, da imate 128 GB operativne pomnilnosti. 12,8 GB pride v va\u0161 diskovni sistem. In kakr\u0161na koli predpomnilni\u0161ka enota ali niz, ki ga imate tam, ne bo prenesla toliko. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Linux optimizacija za izbolj\u0161anje performans PostgreSQL. Ilja Kosmodemjanskij\" src=\"\/wp-content\/uploads\/2020\/06\/1e4bab2fad7d3a05dc76cdd9d153f46c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Zato priporo\u010damo, da te \u0161tevilke takoj nastavite glede na mo\u017enosti va\u0161ega RAID nadzornika.<\/strong> Tukaj imam takoj priporo\u010dilo za nadzornik, ki ima 512 MB predpomnilnika. <\/p>\n<p><\/p>\n<p>Vse to se \u0161teje zelo enostavno. Lahko nastavite vm.dirty_background v bajtih. Te nastavitve prekli\u010dejo prej\u0161nji dve. Ali je razmerje privzeto, ali so aktivirane tiste, ki so z bajti, delovale bodo tiste, ki so z bajti. Ampak ker sem DBA svetovalec in delam z razli\u010dnimi strankami, se trudim biti previden, zato, \u010de so v bajtih, potem v bajtih. Nih\u010de ni dal nobenih jamstev, da dober administrator ne bo dodal pomnilnika stre\u017eniku, ga znova zagnal in da bo \u0161tevilka ostala enaka. Preprosto izra\u010dunajte te \u0161tevilke, da se bo vse zanesljivo prilegalo. <\/p>\n<p><\/p>\n<p>Kaj se zgodi, \u010de se ne prilegate? Zapisano imam, da se u\u010dinkovito ustavi vsak flushing, ampak v resnici je to figura govora. Operacijski sistem ima velik problem \u2013 ima veliko umazanih strani, zato se u\u010dinkovito ustavi tisti IO, ki ga generirajo va\u0161i odjemalci, tj. aplikacija po\u0161lje sql poizvedbo bazi, ona \u010daka. Vsak vhod-izhod v to \u2013 ima najni\u017ejo prioriteto, ker je baza zasedena z checkpointom. In kdaj jo bo kon\u010dala, sploh ni jasno. In ko dose\u017eete ne ozadnjo, ne dokon\u010dno flushing, to pomeni, da je vse va\u0161e IO zasedeno z njim. In dokler se ne kon\u010da, ne morete ni\u010desar narediti. <\/p>\n<p><\/p>\n<p>Tu sta \u0161e dva pomembna vidika, ki presegata ta poro\u010dilo. Te nastavitve morajo ustrezati nastavitvam v postgresql.conf, tj. nastavitvam checkpointov. In va\u0161 diskovni sistem mora biti ustrezno nastavljen. <strong>\u010ce imate predpomnilnik na RAID-u, mora imeti baterijo.<\/strong> Ljudje kupujejo RAID z dobrim predpomnilnikom brez baterije. <strong>\u010ce imate SSD v RAID-u, morajo biti stre\u017eni\u0161ki, tam morajo biti kondenzatorji.<\/strong> Tukaj je obse\u017een kontrolni seznam. Na tej povezavi je moja predstavitev o tem, kako nastaviti zmogljivost diskov v PostgreSQL. Tam so vsi ti kontrolni seznami. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Linux optimizacija za izbolj\u0161anje performans PostgreSQL. Ilja Kosmodemjanskij\" src=\"\/wp-content\/uploads\/2020\/06\/0ca13d550cb9eec4163f886467b2b3ea.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kaj \u0161e lahko zelo ote\u017ei \u017eivljenje? To sta dva parametra. Oba sta razmeroma nova. Po privzetku sta lahko vklju\u010dena v razli\u010dne aplikacije. In lahko zapleteta \u017eivljenje prav tako, \u010de sta vklju\u010dena nepravilno. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Linux optimizacija za izbolj\u0161anje performans PostgreSQL. Ilja Kosmodemjanskij\" src=\"\/wp-content\/uploads\/2020\/06\/35aa98d67ff1f089a751a5fd808bd1b6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Obstajata dve razmeroma novi stvari. \u017de v tretjih jedrih sta se pojavili. To sta sched_migration_cost v nanosekundah in sched_autogroup_enabled, ki je po privzetku en. <\/p>\n<p><\/p>\n<p>In kako vplivata na kakovost \u017eivljenja? Kaj je sched_migration_cost? Linuxov na\u010drtovalnik lahko migrira proces z enega CPU na drugega. In za PostgreSQL, ki izvaja poizvedbe, migracija na drugi CPU ni povsem jasna. <strong>Za bazo podatkov je to zelo slabo.<\/strong> <strong>Zato je smiselna politika nastaviti migration_cost na neko veliko vrednost, vsaj nekaj tiso\u010d nanosekund.<\/strong> <\/p>\n<p><\/p>\n<p>Kaj to pomeni za na\u010drtovalnik? \u0160tel bo, da je ta proces \u0161e vedno aktiven v tem \u010dasu. To pomeni, da \u010de imate dolgo transakcijo, ki se ukvarja s \u010dim dolgotrajnim, bo na\u010drtovalnik to razumel. Menil bo, da dokler ne mine ta \u010das, migracija tega procesa ni potrebna. \u010ce proces kaj dela, ne bo nikamor migriran, temve\u010d bo mirno kon\u010dal na tistem CPU, ki mu je bil dodeljen. In rezultat je odli\u010den. <\/p>\n<p><\/p>\n<p>Druga stvar je autogroup. To je dobra ideja za specifi\u010dne delovne obremenitve, ki nimajo zveze z modernimi bazami podatkov \u2013 skupina procesov po tistem virtualnem terminalu, iz katerega so zagnani. To je priro\u010dno za nekatere naloge. <strong>V praksi je PostgreSQL ve\u010dprocesni sistem s preforkom, ki se za\u017eene iz enega terminala. Imate lock writer, checkpoint in vse va\u0161e odjemalske poizvedbe se zdru\u017eijo na en scheduler, na en CPU. Tam bodo mirno \u010dakali, da se osvobodi, da si lahko medsebojno prepre\u010dijo in ga zasedejo dlje. To je zgodba, ki ni potrebna pri takem obremenitvi in zato jo je treba izklopiti.<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Linux optimizacija za izbolj\u0161anje performans PostgreSQL. Ilja Kosmodemjanskij\" src=\"\/wp-content\/uploads\/2020\/06\/55e829d1c1b69b7f6eaf5fc89dad30d3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Moj kolega Aleksej Lesovski je izvajal teste s preprostim pgbenchom, kjer je pove\u010deval na reda migration_cost in izklapljal autogroup. <strong>Razlika na slabem strojni opremi je bila skoraj 10%.<\/strong>. Na postgresovi mailing listi poteka razprava, kjer ljudje poro\u010dajo o rezultatih, kako so tovrstne spremembe vplivale na hitrost poizvedb. <strong>na 50%.<\/strong>. Tak\u0161nih zgodb je kar nekaj.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Linux optimizacija za izbolj\u0161anje performans PostgreSQL. Ilja Kosmodemjanskij\" src=\"\/wp-content\/uploads\/2020\/06\/b3d1983ec2a37f8b85129c93f2373644.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In na koncu o politiki zmanj\u0161anja porabe energije. Dobro je, da lahko zdaj Linux uporabljamo na prenosniku. In naj bi prav tako dobro var\u010deval z baterijo. A nenadoma se izka\u017ee, da je to lahko tudi na stre\u017eniku. <\/p>\n<p><\/p>\n<p>Poleg tega, \u010de najemate stre\u017enike pri kak\u0161nem gostitelju, potem \"prijazni\" <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/sl\/\"   title=\"gostitelji\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"1200\">gostitelji<\/a> ne skrbijo, da bi imeli bolj\u0161o zmogljivost. Njihova naloga je, da optimizirajo izkori\u0161\u010denost strojne opreme. Zato lahko privzeto omogo\u010dijo na\u010din var\u010devanja z energijo operacijskega sistema.<\/p>\n<p><\/p>\n<p><strong>\u010ce na stre\u017eniku z bazo podatkov pod intenzivno obremenitvijo uporabljate to, potem je va\u0161 izbor acpi_cpufreq + performance. \u017de z ondemandom se lahko pojavijo te\u017eave.<\/strong> <\/p>\n<p><\/p>\n<p>Intel_pstate je \u017ee nekoliko druga\u010den gonilnik. In trenutno se daje prednost temu, saj je novej\u0161i in bolje deluje.<\/p>\n<p><\/p>\n<p>In seveda, governor samo performance. Ondemand, powersave in vse ostalo niso za vas. <\/p>\n<p><\/p>\n<p>Rezultati po explain analyze PostgreSQL se lahko razlikujejo za ve\u010d reda, \u010de omogo\u010dite powersave, saj bo va\u0161 CPU pod bazo deloval na povsem nepredictabilen na\u010din.<\/p>\n<p><\/p>\n<p>Te stvari so lahko privzeto vklju\u010dene. Pazljivo si oglejte \u2013 ali jih niso vklju\u010dili privzeto. To je lahko resna te\u017eava. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Linux optimizacija za izbolj\u0161anje performans PostgreSQL. Ilja Kosmodemjanskij\" src=\"\/wp-content\/uploads\/2020\/06\/ef32dafd9c8ea3403dc31c34ee2b5da8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Na koncu bi se rad zahvaliti ekipi iz na\u0161e DBA tima PosgreSQL-Consulting, posebno Maksu Boguku i Alekseju Lesovskom, koji se svakodnevno suo\u010davaju s izazovima ovog posla. Trudimo se da za na\u0161e klijente napravimo sve kako treba, da sve funkcioni\u0161e bez problema. Ovo je kao kod uputstava za avijacijsku sigurnost. Sve je ovde zapisano krvlju. Svaka od ovih matica je otkrivena tokom odre\u0111ene problema. Rado ih delimo s vama.<\/p>\n<p><\/p>\n<p>Vpra\u0161anja:<\/p>\n<p><\/p>\n<p><em>Hvala! Ako, na primer, kompanija \u017eeli da u\u0161tedi i postavi bazu podataka i aplikacionu logiku na istom serveru, ili ako kompanija prati modernu tendenciju mikroservisnih arhitektura u kojima se PostgreSQL pokre\u0107e u kontejneru. U \u010demu je caka? Sysctl globalno uti\u010de na celo jezgro. Nisam \u010duo da se sysctl kao nekako virtualizuje, da rade odvojeno u kontejneru. Ima samo cgroup i tu postoji kontrola samo za deo. Kako se mo\u017ee \u017eiveti s tim? Ili, ako \u017eelite performanse, pokrenite PostgreSQL na posebnom fizi\u010dkom serveru i optimizujte ga.<\/em><\/p>\n<p><\/p>\n<p>Odgovorili smo na va\u0161e pitanje na otprilike tri na\u010dina. Ako ne govorimo o fizi\u010dkom serveru koji se mo\u017ee optimizovati itd., onda se opustite, sve \u0107e raditi dobro bez tih pode\u0161avanja. Ako dobijete takvo optere\u0107enje da treba da uradite ta pode\u0161avanja, br\u017ee \u0107ete do\u0107i do fizi\u010dkog servera nego do ovih pode\u0161avanja.<\/p>\n<p><\/p>\n<p>U \u010demu je problem? Ako je to virtuelna ma\u0161ina, verovatno \u0107ete imati mnogo problema, na primer, zbog dosta neuskla\u0111enosti latencije diska na ve\u0107ini virtuelnih ma\u0161ina. \u010cak i ako je propusnost diskova dobra, jedna neuspela transakcija operacija ulaza-izlaza, koja ne uti\u010de zna\u010dajno na prose\u010dnu propusnost, a koja se dogodila tokom checkpoint-a ili tokom pisanja u WAL, mo\u017ee zna\u010dajno da na\u0161kodi bazi. To \u0107ete primetiti pre nego \u0161to se suo\u010dite s ovim problemima. <\/p>\n<p><\/p>\n<p>Ako imate NGINX na istom serveru, i dalje \u0107e biti isti problem. Borit \u0107e se za deljenu memoriju. Ne\u0107ete sti\u0107i do problema koji su ovde opisani.<\/p>\n<p><\/p>\n<p>Vendar pa so nekateri od teh parametrov \u0161e vedno pomembni za vas. Na primer, z uporabo sysctl nastavite dirty_ratio, da ne bo tako ekstremno \u2013 v vsakem primeru bo to pomagalo. Tako ali tako bo va\u0161e zanimanje za disk. In to bo potekalo po napa\u010dni shemi. To so dejansko privzete nastavitve, ki sem jih prikazal. In v vsakem primeru jih je bolje spremeniti. <\/p>\n<p><\/p>\n<p>Z NUMA se lahko pojavijo te\u017eave. VmWare, na primer, dobro deluje z NUMA pri natan\u010dno nasprotnih nastavitvah. In tukaj je treba izbrati \u2013 fizi\u010dni stre\u017enik ali ne. <\/p>\n<p><\/p>\n<p><em>Imam vpra\u0161anje v zvezi z Amazon AWS. Imajo vnaprej nastavljene slike. Ena izmed njih se imenuje Amazon RDS. Ali obstajajo kak\u0161ne prilagojene nastavitve za njihovo operacijski sistem?<\/em><\/p>\n<p><\/p>\n<p>Obstajajo nastavitve, vendar so to druge nastavitve. Tu nastavljamo operacijski sistem z vidika tega, kako bo baza podatkov to uporabljala. Obstajajo parametri, ki dolo\u010dajo, kam gremo sedaj, torej tak\u0161no oblikovanje. To pomeni, da potrebujemo toliko virov, ki jih bomo zdaj uporabili. Po tem Amazon RDS te vire povezuje, in takrat se zmogljivost zmanj\u0161a. Imajo lo\u010dene zgodbe, kako se ljudje na to lotijo uporabiti. V\u010dasih celo precej uspe\u0161no. Vendar to nima zveze z nastavitvami operacijskega sistema. To je nekak\u0161no hekanje oblakov. To je druga zgodba.<\/p>\n<p><\/p>\n<p><em>Zakaj Transparent huge pages ne dajejo u\u010dinka v primerjavi z Huge TLB?<\/em><\/p>\n<p><\/p>\n<p>Ne dajejo. To lahko pojasnimo na mnoge na\u010dine. Vendar dejansko ne dajejo u\u010dinka. Katera zgodba je s PostgreSQL? Ob zagonu dodeli velik kos deljene pomnilnika. Ne glede na to, ali so Transparent ali niso - to nima pomena. Dejstvo, da se dodelijo ob zagonu, pojasnjuje vse. In \u010de je pomnilnika zelo veliko in ga je treba prestrukturirati v segment deljenega pomnilnika, potem bo Transparent huge pages pomemben. Pri PostgreSQL je enostavno dodeljen velik kos ob zagonu in to je to, nadalje tam ne poteka ni\u010d posebnega. Seveda ga je mogo\u010de uporabljati, vendar obstaja mo\u017enost, da pride do po\u0161kodbe deljenega pomnilnika, ko bo ponovno dodeljeval kaj. PostgreSQL tega ne ve.<\/p>\n<p>Izvor: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/505108\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 2015 \u0433\u043e\u0434\u0430 \u0418\u043b\u044c\u0438 \u041a\u043e\u0441\u043c\u043e\u0434\u0435\u043c\u044c\u044f\u043d\u0441\u043a\u043e\u0433\u043e &quot;Linux tuning to improve PostgreSQL performance&quot; Disclaimer: \u0417\u0430\u043c\u0435\u0447\u0443 \u0447\u0442\u043e \u0434\u043e\u043a\u043b\u0430\u0434 \u044d\u0442\u043e\u0442 \u0434\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u043e\u044f\u0431\u0440\u0435\u043c 2015 \u0433\u043e\u0434\u0430 \u2014 \u043f\u0440\u043e\u0448\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u0435 4 \u043b\u0435\u0442 \u0438 \u043f\u0440\u043e\u0448\u043b\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0420\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u0430\u044f \u0432 \u0434\u043e\u043a\u043b\u0430\u0434\u0435 \u0432\u0435\u0440\u0441\u0438\u044f 9.4 \u0443\u0436\u0435 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u0417\u0430 \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0438\u0435 4 \u0433\u043e\u0434\u0430 \u0432\u044b\u0448\u043b\u043e 5 \u043d\u043e\u0432\u044b\u0445 \u0440\u0435\u043b\u0438\u0437\u043e\u0432 PostgreSQL \u0432\u044b\u0448\u043b\u043e \u0438 15 \u0432\u0435\u0440\u0441\u0438\u0439 \u044f\u0434\u0440\u0430 Linux. \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":84083,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-84082","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.4 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 2015 \u0433\u043e\u0434\u0430 \u0418\u043b\u044c\u0438 \u041a\u043e\u0441\u043c\u043e\u0434\u0435\u043c\u044c\u044f\u043d\u0441\u043a\u043e\u0433\u043e &quot;Linux tuning to improve PostgreSQL performance&quot; Disclaimer: \u0417\u0430\u043c\u0435\u0447\u0443 \u0447\u0442\u043e \u0434\u043e\u043a\u043b\u0430\u0434 \u044d\u0442\u043e\u0442 \u0434\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u043e\u044f\u0431\u0440\u0435\u043c 2015 \u0433\u043e\u0434\u0430 \u2014 \u043f\u0440\u043e\u0448\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u0435 4 \u043b\u0435\u0442 \u0438 \u043f\u0440\u043e\u0448\u043b\u043e \u043c\u043d\u043e\u0433\u043e.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/linux-tuning-to-improve-postgresql-performance-ilya-kosmodemyanskij\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sl_SI\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Linux tuning to improve PostgreSQL performance. \u0418\u043b\u044c\u044f \u041a\u043e\u0441\u043c\u043e\u0434\u0435\u043c\u044c\u044f\u043d\u0441\u043a\u0438\u0439 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 2015 \u0433\u043e\u0434\u0430 \u0418\u043b\u044c\u0438 \u041a\u043e\u0441\u043c\u043e\u0434\u0435\u043c\u044c\u044f\u043d\u0441\u043a\u043e\u0433\u043e &quot;Linux tuning to improve PostgreSQL performance&quot; Disclaimer: \u0417\u0430\u043c\u0435\u0447\u0443 \u0447\u0442\u043e \u0434\u043e\u043a\u043b\u0430\u0434 \u044d\u0442\u043e\u0442 \u0434\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u043e\u044f\u0431\u0440\u0435\u043c 2015 \u0433\u043e\u0434\u0430 \u2014 \u043f\u0440\u043e\u0448\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u0435 4 \u043b\u0435\u0442 \u0438 \u043f\u0440\u043e\u0448\u043b\u043e \u043c\u043d\u043e\u0433\u043e.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/linux-tuning-to-improve-postgresql-performance-ilya-kosmodemyanskij\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-06-05T05:42:28+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-06-05T05:42:28+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Prilagajanje Linuxa za izbolj\u0161anje zmogljivosti PostgreSQL. Ilya Kosmodemyanski | ProHoster","description":"Razkrinkavanje poro\u010dila Ilye Kosmodemyanskega iz leta 2015 \"Prilagajanje Linuxa za izbolj\u0161anje zmogljivosti PostgreSQL\" Odkritje: Opozarjam, da je to poro\u010dilo datirano z novembrom 2015 \u2014 minilo je ve\u010d kot 4 leta in veliko se je zgodilo.","canonical_url":"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/linux-tuning-to-improve-postgresql-performance-ilya-kosmodemyanskij","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sl_SI","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Linux tuning to improve PostgreSQL performance. \u0418\u043b\u044c\u044f \u041a\u043e\u0441\u043c\u043e\u0434\u0435\u043c\u044c\u044f\u043d\u0441\u043a\u0438\u0439 | ProHoster","og:description":"\u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 2015 \u0433\u043e\u0434\u0430 \u0418\u043b\u044c\u0438 \u041a\u043e\u0441\u043c\u043e\u0434\u0435\u043c\u044c\u044f\u043d\u0441\u043a\u043e\u0433\u043e &quot;Linux tuning to improve PostgreSQL performance&quot; Disclaimer: \u0417\u0430\u043c\u0435\u0447\u0443 \u0447\u0442\u043e \u0434\u043e\u043a\u043b\u0430\u0434 \u044d\u0442\u043e\u0442 \u0434\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u043e\u044f\u0431\u0440\u0435\u043c 2015 \u0433\u043e\u0434\u0430 \u2014 \u043f\u0440\u043e\u0448\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u0435 4 \u043b\u0435\u0442 \u0438 \u043f\u0440\u043e\u0448\u043b\u043e \u043c\u043d\u043e\u0433\u043e.","og:url":"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/linux-tuning-to-improve-postgresql-performance-ilya-kosmodemyanskij","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-06-05T05:42:28+00:00","article:modified_time":"2020-06-05T05:42:28+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"84082","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 15:05:32","updated":"2026-02-09 21:38:01","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts\/84082","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/comments?post=84082"}],"version-history":[{"count":2,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts\/84082\/revisions"}],"predecessor-version":[{"id":159869,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts\/84082\/revisions\/159869"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media\/84083"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media?parent=84082"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/categories?post=84082"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/tags?post=84082"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}