{"id":78742,"date":"2020-04-21T19:42:46","date_gmt":"2020-04-21T17:42:46","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/promyshlennyj-podhod-k-tyuningu-postgresql-eksperimenty-nad-bazami-dannyh-nikolaj-samohvalov"},"modified":"2020-04-21T19:42:46","modified_gmt":"2020-04-21T17:42:46","slug":"promyshlennyj-podhod-k-tyuningu-postgresql-eksperimenty-nad-bazami-dannyh-nikolaj-samohvalov","status":"publish","type":"post","link":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/promyshlennyj-podhod-k-tyuningu-postgresql-eksperimenty-nad-bazami-dannyh-nikolaj-samohvalov","title":{"rendered":"Industrijski pristup tuning-u PostgreSQL: eksperimenti s bazama podataka\u00bb. Nikolaj Samohvalov","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><strong>Predla\u017eem da se upoznate s transkripcijom izvje\u0161taja Nikolaja Samohvalova \"Industrijski pristup pode\u0161avanju PostgreSQL: eksperimenti na bazama podataka\"<\/strong><\/p>\n<p><\/p>\n<p>Shared_buffers = 25% \u2013 je li to mnogo ili malo? Ili taman kako treba? Kako shvatiti je li ova \u2013 prili\u010dno zastarjela \u2013 preporuka prikladna za va\u0161 konkretan slu\u010daj?<\/p>\n<p><\/p>\n<p>Do\u0161lo je vrijeme da ozbiljno pristupimo pitanju odabira parametara postgresql.conf. Ne putem slijepih \"autotunera\" ili zastarjelih savjeta iz \u010dlanaka i blogova, ve\u0107 na temelju:<\/p>\n<p><\/p>\n<ol>\n<li>strogo izvedenih eksperimenata na BDP-ima, provedenih automatizirano, u velikim koli\u010dinama i u uvjetima \u0161to bli\u017eim \"borbenim\",<\/li>\n<li>dubokog razumijevanja karakteristika rada SGBD-a i OS-a.<\/li>\n<\/ol>\n<p><\/p>\n<p>Koriste\u0107i Nancy CLI (<noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/postgres.ai\/nancy\">https:\/\/gitlab.com\/postgres.ai\/nancy<\/a><\/noindex>), razmotrit \u0107emo konkretan primjer \u2013 poznate shared_buffers \u2013 u raznim situacijama, u raznim projektima i poku\u0161ati shvatiti kako odabrati optimalnu postavku za na\u0161u infrastrukturu, bazu podataka i optere\u0107enje.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/a15b93734b6563abaec4a713c975732a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Rije\u010d je o eksperimentima s bazama podataka. Ovo je pri\u010da koja traje ne\u0161to vi\u0161e od \u0161est mjeseci. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/e77255c4abaa2a01ae37fe888fe67db7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Malo o meni. Iskustvo s Postgresom traje vi\u0161e od 14 godina. Osnovao sam nekoliko kompanija koje se bave dru\u0161tvenim mre\u017eama. Svuda je kori\u0161ten Postgres i koristi se.<\/p>\n<p><\/p>\n<p>Tako\u0111er, grupa RuPostgres na Meetupu, 2. mjesto u svijetu. Polako se pribli\u017eavamo brojci od 2 000 \u010dlanova. RuPostgres.org.<\/p>\n<p><\/p>\n<p>Na brojnim konferencijama, uklju\u010duju\u0107i Highload, zadu\u017een sam za baze podataka, posebno Postgres, od samog po\u010detka.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/fa009b50f1c0293eee80fc03fd2c05f0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I posljednjih nekoliko godina ponovo sam pokrenuo svoju praksu vezanu uz Postgres konzultacije u 11 vremenskih zona odavde.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/550c3ddcd516adca14d2b3de9c34b7ff.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kad sam to u\u010dinio prije nekoliko godina, imao sam odre\u0111eni prekid aktivnog rada s Postgresom, vjerojatno od 2010. godine. Bio sam iznena\u0111en koliko se malo promijenilo u svakodnevnom radu DBA, koliko je i dalje potrebno \u0440\u0443\u0447nog rada. Odmah sam pomislio da tu ne\u0161to nije u redu, da treba automatizirati vi\u0161e stvari.<\/p>\n<p><\/p>\n<p>I budu\u0107i da je sve to bilo u udaljenosti, ve\u0107ina klijenata bila je u oblaku. I ve\u0107 je mnogo automatizirano, to je o\u010digledno. O tome malo kasnije. Dakle, sve ovo je dovelo do ideje da bi trebao postojati niz alata, tj. neka platforma koja bi automatizirala gotovo sve radnje DBA, kako bi se moglo upravljati velikim brojem baza.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/b02097f0bb23fa9d7c30e38ab9f3de7b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>U ovom izlaganju ne\u0107e biti:<\/p>\n<p><\/p>\n<ul>\n<li>\u201eSrebrnih metaka\u201c i izjava poput \u2013 stavite 8 GB ili 25 % shared_buffers i bit \u0107ete zadovoljni. O shared_buffers-u ne\u0107e biti previ\u0161e rije\u010di. <\/li>\n<li>Hardverski \u201eunutarnji\u201c dijelovi. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/ccea359ec78a967c150ddcedc3e50a88.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0160to \u0107e se dogoditi?<\/p>\n<p><\/p>\n<ul>\n<li>Bit \u0107e principa optimizacije koje primjenjujemo i razvijamo. Bit \u0107e razli\u010ditih ideja koje nam padaju na pamet na putu i raznih alata koje ve\u0107inom stvaramo u Open Source-u, tj. osnovu radimo u Open Source-u. \u0160tovi\u0161e, imamo tikete, gotovo sva komunikacija je u Open Source-u. Mo\u017eete pratiti \u0161to radimo, \u0161to \u0107e biti u sljede\u0107em izdanju itd. <\/li>\n<li>Bit \u0107e i nekih iskustava kori\u0161tenja tih principa, tih alata u nizu tvrtki: od malih startupa do velikih poduze\u0107a. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/86e6f379726dec814aca616a30d36a2f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kako se sve to razvija?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c1422d9f2945e717c6ebb31f5fef6329.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Prvo, osnovni zadatak DBA-a, osim osiguravanja stvaranja instanci, postavljanja sigurnosnih kopija itd., je tra\u017eenje uskih grla i optimizacija performansi.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/8e682ca8666e94d6688348ebe4540327.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Trenutno je to organizirano na sljede\u0107i na\u010din. Gledamo monitoring, vidimo ne\u0161to, nedostaje nam nekih detalja. Po\u010dinje detaljnije istra\u017eivanje, obi\u010dno rukama, i shva\u0107amo \u0161to u\u010diniti s tim.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/04599422ea6b6d57c79a4e48ba2db8b7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Postoje dva pristupa. Pg_stat_statements - standardno rje\u0161enje za otkrivanje sporih upita. I analiza logova Postgres-a uz pomo\u0107 pgBadger-a.<\/p>\n<p><\/p>\n<p>Svaki od pristupa ima ozbiljne nedostatke. Prvi pristup eliminira sve parametre. Ako vidimo grupe SELECT * FROM table where kolona je jednaka znaku \u201e?\u201c ili \u201e$\u201c po\u010dev\u0161i od verzije Postgres 10. Ne znamo - je li to index scan ili seq scan. Uvelike ovisi o parametru. Ako tamo stavite rijetko pojavljivanu vrijednost, bit \u0107e index scan. Ako stavite vrijednost koja \u010dini 90% tablice, bit \u0107e seq scan o\u010dito, jer Postgres poznaje statistiku. I to je velika mana pg_stat_statements, premda se rade neki radovi.<\/p>\n<p><\/p>\n<p>Najve\u0107a mana analiza logova je ta \u0161to si obi\u010dno ne mo\u017eete priu\u0161titi \u201elog_min_duration_statement = 0\u201c. O tome \u0107emo tako\u0111er razgovarati. Prema tome, ne vidite cijelu sliku. I neki upit koji je vrlo brz, mo\u017ee tro\u0161iti ogromnu koli\u010dinu resursa, ali ga ne\u0107ete vidjeti, jer je ispod va\u0161eg praga.<\/p>\n<p><\/p>\n<p><strong>Kako DBA rje\u0161avaju prona\u0111ene probleme?<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/5e57fefdec6256f82045aaac037b516c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Na primjer, otkrili smo neku problematiku. \u0160to se obi\u010dno radi? Ako ste programer, radit \u0107ete ne\u0161to na nekom instance koji nije te veli\u010dine. Ako ste DBA, imate staging. A on mo\u017ee biti samo jedan. I on kasni pola godine. I mislite da idete u produkciju. I \u010dak i iskusni DBA provjeravaju kasnije u produkciji, na replici. Ponekad kreiraju privremeni indeks, uvjeravaju se da poma\u017ee, bri\u0161u ga i predaju programerima da ga uklju\u010de u migracijske datoteke. Takve gluposti se sada doga\u0111aju. I to je problem.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/402e80c7e5fbca6a054c0c9ec61e5fe3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Tuning konfiguracija.<\/li>\n<li>Optimizacija skupa indeksa. <\/li>\n<li>Promjena samog SQL upita (to je najte\u017ei na\u010din).<\/li>\n<li>Dodavanje resursa (najlak\u0161i na\u010din u ve\u0107ini slu\u010dajeva).<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/8a6b3cd56e0df5c7908714926ba1eb05.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ima tu puno stvari. Postoji puno opcija u Postgresu. Treba puno znati. Mnogo indeksa u Postgresu, zahvaljuju\u0107i, izme\u0111u ostalog, organizatorima ove konferencije. Sve to treba znati, i to upravo izaziva osje\u0107aj kod ne DBA da se DBA bave crnom magijom. To jest, potrebno je deset godina rada da biste sve to po\u010deli normalno razumjeti.<\/p>\n<p><\/p>\n<p>A ja sam borac protiv te crne magije. \u017delim sve postaviti tako da imamo tehnologiju, a ne intuiciju u svemu tome.<\/p>\n<p><\/p>\n<p><strong>Primjeri iz \u017eivota<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/70b11c3df9c41c66570635d5f309ed24.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>To sam primijetio najmanje na dva projekta, uklju\u010duju\u0107i i svoj. Jo\u0161 jedan post na blogu javlja nam da je vrijednost 1 000 za default_statistict_target dobra. Dobro, hajde da probamo u produkciji.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/0b4c2bd6f73df06967c94d5d78b07279.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I tu smo, koriste\u0107i na\u0161 alat dvije godine kasnije uz pomo\u0107 eksperimenata s bazama podataka o kojima se danas radi, mo\u017eemo usporediti \u0161to je bilo i \u0161to je postalo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/3564eade6532003d2279c2736ab6d733.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I za to trebamo stvoriti eksperiment. Sastoji se od \u010detiri dijela. <\/p>\n<p><\/p>\n<ul>\n<li>Prvi dio \u2013 okru\u017eenje. Trebaju nam hardverski resursi. Kada dolazim u neku kompaniju i zaklju\u010dujem ugovor, ka\u017eem da mi daju isti hardver kakav je u produkciji. Za svakog od va\u0161ih majstora mi treba barem jedan takav hardver. Bilo to virtualna masina instance na Amazonu ili Googleu, ili mi treba identi\u010dan hardver. To jest, \u017eelim reprodukovati okru\u017eenje. U pojam okru\u017eenje uklju\u010dujemo glavnu verziju Postgresa. <\/li>\n<li>Drugi dio \u2013 objekat na\u0161eg istra\u017eivanja. To je baza podataka. Mo\u017ee se stvoriti na nekoliko na\u010dina. Pokazat \u0107u kako. <\/li>\n<li>Tre\u0107i dio \u2013 optere\u0107enje. To je najte\u017ei trenutak. <\/li>\n<li>A \u010detvrti dio je ono \u0161to provjeravamo, tj. s \u010dim \u0107emo uspore\u0111ivati. Recimo, mo\u017eemo promijeniti jedan ili vi\u0161e parametara u konfiguraciji, ili mo\u017eemo stvoriti indeks i sl. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/8ccd09ac4cdd336618413375617c10a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pokre\u0107emo eksperiment. Evo pg_stat_statements. Lijevo \u2013 ono \u0161to je bilo. Desno \u2013 \u0161to je postalo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/6f82d7e25a77b700f2ddb01f42a861a2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lijevo default_statistics_target = 100, desno = 1 000. Vidimo da nam to poma\u017ee. Sveukupno pobolj\u0161anje od 8%.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/52dda8fb5fbcb9beecaa1eda8443a374.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>No, ako se spustimo dolje, vidjet \u0107emo grupe upita iz pgBadger ili iz pg_stat_statements. Tu imamo dvije opcije. Vidjet \u0107emo da je neki upit pao za 88%. I tu ve\u0107 dolazi in\u017eenjerski pristup. Mo\u017eemo nastaviti s istra\u017eivanjem unutra, jer nas zanima za\u0161to je pao. Moramo razumjeti \u0161to je bilo sa statistikama. Za\u0161to vi\u0161e ko\u0161ara u statistikama dovodi do lo\u0161ijih rezultata.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/4e6dfc04af4b3fc2b626dd46c08bdf66.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mo\u017eemo ne istra\u017eivati i napraviti \"ALTER TABLE ... ALTER COLUMN\" i vratiti mu natrag 100 ko\u0161ara u statistiku te kolone. I zatim, jo\u0161 jednim eksperimentom, mo\u017eemo se uvjeriti da je ova ispravka pomogla. To je to. Ovo je in\u017eenjerski pristup koji nam poma\u017ee vidjeti sliku i donositi odluke na temelju podataka, a ne na temelju intuicije.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c87df172b994a4523478beebaf4a0275.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/9e766aa4348bd1a77b697e3179d84bbd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Par primjera iz drugih podru\u010dja. U testovima imamo CI testove ve\u0107 dugi niz godina. I nijedan projekt u zdravom razumu ne mo\u017ee postojati bez automatiziranih testova.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/b6c21981dc8b2b285973ae42199e2b4c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>U drugim industrijama: u avijaciji, u automobilskoj industriji, kada testiramo aerodinamiku, tako\u0111er imamo mogu\u0107nost provoditi eksperimente. Ne\u0107emo odmah lansirati ne\u0161to iz crte\u017ea u svemir niti \u0107emo odmah staviti neki automobil na cestu. Na primjer, imamo aerodinami\u010dku cijev. <\/p>\n<p><\/p>\n<p>Iz promatranja drugih industrija mo\u017eemo donijeti zaklju\u010dke. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/cef02ea9280e5795d1e593c600f0541b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Prvo, imamo posebno okru\u017eenje. Ono je blizu produkciji, ali nije isto. Njegova glavna karakteristika je ta da mora biti jeftino, ponovljivo i maksimalno automatizirano. Tako\u0111er, trebaju biti posebna sredstva za provo\u0111enje detaljne analize.<\/p>\n<p><\/p>\n<p>Vjerojatno imamo manje mogu\u0107nosti prou\u010davati svaki milimetar povr\u0161ine krila kada avion leti nego \u0161to to mo\u017eemo u\u010diniti u aerodinami\u010dkoj tunelu. Imamo vi\u0161e sredstava za dijagnostiku. Mo\u017eemo si priu\u0161titi da dodamo vi\u0161e te\u0161kih stvari koje ne mo\u017eemo imati na avionu dok je u zraku. Tako\u0111er je i s Postgresom. U nekim slu\u010dajevima mo\u017eemo uklju\u010diti potpuno logiranje zahtjeva tijekom eksperimentiranja. I to ne \u017eelimo raditi na produkciji. Mo\u017eda bismo to \u010dak uklju\u010dili s planovima pomo\u0107u auto_explain.<\/p>\n<p><\/p>\n<p>I kao \u0161to sam ve\u0107 spomenuo, visoka razina automatizacije zna\u010di da smo pritisnuli gumb i ponovili. Tako bi to trebalo biti, da imamo mnogo eksperimenata, da to bude u toku.<\/p>\n<p><\/p>\n<p>Nancy CLI \u2013 temelj \"laboratorija baza podataka\"<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/f8303df21f309fb209929acec260b757.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I evo, napravili smo takvu stvar. Odnosno, o tim idejama sam govorio u lipnju, gotovo prije godinu dana. Ve\u0107 imamo u otvorenom kodu takozvanu Nancy CLI. To je temelj za izgradnju laboratorija baza podataka.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/0ed3c72461123745be4fa9e58455baa0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/postgres-ai\/nancy\">Nancy<\/a><\/noindex> \u2014 To je u otvorenom kodu, na Gitlabu. Mo\u017eete re\u0107i, mo\u017eete probati. Ostavio sam link u slajdovima. Mo\u017eete kliknuti na njega i tamo \u0107e biti <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/postgres-ai\/nancy\/-\/blob\/master\/help\/nancy_run.md\">help<\/a><\/noindex> o svim parametrima.<\/p>\n<p><\/p>\n<p>Naravno, mnogo toga je jo\u0161 u fazi razvoja. Ima mnogo ideja. No, to je ve\u0107 ono \u0161to svakodnevno primjenjujemo. Kada imamo ideju \u2013 a \u0161to se doga\u0111a kada bri\u0161emo 40 000 000 redaka, sve se zaustavlja na IO, mo\u017eemo provesti eksperiment i bolje prou\u010diti, kako bismo razumjeli \u0161to se doga\u0111a i poku\u0161ali to ispraviti usput. Odnosno, provodimo eksperiment. Na primjer, ne\u0161to pode\u0161avamo i gledamo \u0161to na kraju dobivamo. A to ne radimo na produkciji. To je sr\u017e ideje.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c22d332de4b45d604dfb9c5a95404fd6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Gdje to mo\u017ee raditi? Mo\u017ee raditi lokalno, tj. mo\u017ee se to raditi bilo gdje, mo\u017eete \u010dak pokrenuti na MacBooku. Treba vam Docker, idemo. I to je to. Mo\u017ee se pokrenuti u nekom instance na hardveru, ili u virtualkoj ma\u0161ini, bilo gdje.<\/p>\n<p><\/p>\n<p>Postoji i mogu\u0107nost pokretanja na daljinu u Amazonu putem EC2 Instance, na spot cijene. To je zaista sjajna prilika. Na primjer, ju\u010der smo proveli vi\u0161e od 500 eksperimenata na i3 instanci, po\u010dev\u0161i od najmanje do i3-16-xlarge. I tih 500 eksperimenata nas je ko\u0161talo 64 dolara. Svaki je trajao 15 minuta. To zna\u010di da, zahvaljuju\u0107i spot cijenama, to je vrlo jeftino \u2013 70% popusta, pla\u0107anje po sekundi kao kod Amazona. Mo\u017eete raditi zaista puno. Mo\u017eete provoditi stvarna istra\u017eivanja.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/64c61cc9dd7181296b2ef5b815a17493.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Podr\u017eane su tri glavne verzije Postgresa. Nije toliko te\u0161ko doraditi neke stare, a i nova 12. verzija tako\u0111er.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/ee147c91014ab698cbd3c60e193bef23.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Objekt mo\u017eemo definirati na tri na\u010dina. To su:<\/p>\n<p><\/p>\n<ul>\n<li>Dump\/sql datoteka. <\/li>\n<li>Glavni na\u010din je kloniranje PGDATA direktorija. Obi\u010dno se uzima iz backup servera. Ako imate normalne binarne backupove, odande mo\u017eete raditi klonove. Ako imate oblake, tada \u0107e vam to oblak kompanija poput Amazona ili Googlea raditi automatski. Ovo je najva\u017eniji na\u010din za klonove stvarne produkcije. Na taj na\u010din ga razvijamo. <\/li>\n<li>A zadnji na\u010din je prikladan za istra\u017eivanje, kada \u017eelite prona\u0107i kako u Postgresu ne\u0161to funkcionira. To je pgbench. Mo\u017eete generirati s pomo\u0107u pgbencha. To je samo jedna opcija \u201edb-pgbench\u201c. Ka\u017eete mu koji je scale. I sve \u0107e biti generirano u oblaku, kako je navedeno.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/2bc3e30cb31a19f66c6b55480447126f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I optere\u0107enje:<\/p>\n<p><\/p>\n<ul>\n<li>Optere\u0107enje mo\u017eemo izvr\u0161avati u jednom SQL toku. To je najprimitivniji na\u010din. <\/li>\n<li>A mo\u017eemo emulirati optere\u0107enje. I emulirati ga mo\u017eemo prvenstveno na sljede\u0107i na\u010din. Moramo prikupiti sve logove. I to je bolno. Pokazat \u0107u vam za\u0161to. I s pomo\u0107u pgreplaya, koji je ugra\u0111en u Nancy, reproduciramo. <\/li>\n<li>Ili druga opcija. Takozvano 'craft' optere\u0107enje, koje radimo s odre\u0111enom koli\u010dinom truda. Analiziraju\u0107i na\u0161e trenutno optere\u0107enje na bojnoj stanici, izvu\u010demo najbolje grupe upita. I s pomo\u0107u pgbencha mo\u017eemo emulirati to optere\u0107enje u laboratoriju. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/4adba12881faf9ad9d4f9e9f42c0f5c1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Ili trebamo izvr\u0161iti neki SQL, tj. provjeravamo migraciju, stvaramo indeks, izvr\u0161avamo ANALAZE. I gledamo \u0161to je bilo prije vakuuma i nakon vakuuma. Ukratko, bilo koji SQL.<\/li>\n<li>Ili u konfiguraciji mijenjamo jednu ili vi\u0161e postavki. Mo\u017eemo zatra\u017eiti da provjere, na primjer, 100 vrijednosti na Amazonu za na\u0161 terabajtni bazu. I za nekoliko sati imate rezultat. Kao pravilo, terabajtna baza \u0107e vam se razvijati nekoliko sati. No, u razvoju imamo zakrpu, mogu\u0107e je serijsko kori\u0161tenje, tj. mo\u017eete kontinuirano koristiti istu pgdata na istom serveru i provjeravati. Postgres \u0107e se restartati, predmemorije \u0107e se brisati. I mo\u017eete provoditi optere\u0107enje. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/02985b47bf0ab62e8f1c4cc3ea003f26.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Dolazi direktorij s brojnim datotekama, po\u010dev\u0161i od snimaka pg.<em>stat<\/em>***. A tu je najzanimljivije \u2013 pg_stat_statements, pg_stat_kcacke. To su dvije ekstenzije koje analiziraju upite. A pg_stat_bgwriter sadr\u017ei ne samo statistiku pgwriter-a, ve\u0107 i podatke o checkpoint-u i o tome kako sami backend-i istiskuju prljave baferi. I sve to je zanimljivo pogledati. Na primjer, kada pode\u0161avamo shared_buffers, vrlo je zanimljivo pogledati koliko je tko istisnuo.<\/li>\n<li>Tako\u0111er dolaze Postgres logovi. Dva loga \u2013 log pripreme i log reproduciranja optere\u0107enja. <\/li>\n<li>Relativno nova funkcija \u2013 to su FlameGraphs.<\/li>\n<li>Tako\u0111er, ako ste koristili pgreplay ili pgbench opcije reproduciranja optere\u0107enja, imate njihov izvorni prikaz. I vidjet \u0107ete latenciju i TPS. Mo\u017eete razumjeti kako su to vidjeli. <\/li>\n<li>Informacije o sustavu. <\/li>\n<li>Osnovne provjere CPU-a i IO-a. To je vi\u0161e za EC2 instance na Amazonu, kada \u017eelite pokrenuti 100 identi\u010dnih instanci u toku i izvesti po 100 razli\u010ditih proba, onda imate 10.000 experimenata. I morate se uvjeriti da vam nije ispao lo\u0161 instanca, koji je ve\u0107 nekoga potisnuo. Na toj opremi se drugi aktiviraju i ostaje vam malo resursa. Takve rezultate je bolje odbaciti. I ba\u0161 uz pomo\u0107 sysbench-a od Alekseja Kopytova radimo nekoliko kratkih provjera koje dolaze i mo\u017eete ih usporediti s drugima, tj. shvatit \u0107ete kako se CPU pona\u0161a i kako se IO pona\u0161a. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c4ddf5283c3c79e3d4c2c061e7dd9e7d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Koje su tehni\u010dke slo\u017eenosti na primjeru razli\u010ditih kompanija?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/959690b464a01a4a3cb67ec497becff1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Recimo, \u017eelimo ponavljati stvarno optere\u0107enje uz pomo\u0107 logova. Izvrsna ideja, ako je to napisano na Open Source pgreplay-u. Koristimo ga. No, da bi dobro radio, morate uklju\u010diti potpuno logiranje upita s parametrima i vremenom.<\/p>\n<p><\/p>\n<p>Postoje odre\u0111ene pote\u0161ko\u0107e s duration i timestamp. Ovu temu \u0107emo potpuno izostaviti. Glavno pitanje je \u2013 mo\u017eete li si to priu\u0161titi ili ne? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/5d08fadbaf67b8a137212302b6adf48a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/gist.github.com\/NikolayS\/08d9b7b4845371d03e195a8d8df43408\">https:\/\/gist.github.com\/NikolayS\/08d9b7b4845371d03e195a8d8df43408<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Problem je u tome \u0161to to mo\u017eda ne\u0107e biti dostupno. Prvo morate razumjeti koji \u0107e se tok zapisivati u log. Ako imate pg_stat_statements, mo\u017eete s ovakvim upitom (link \u0107e biti dostupan u slajdovima) shvatiti koliko otprilike bajtova \u0107e se zapisivati u sekundi.<\/p>\n<p><\/p>\n<p>Gledamo na du\u017einu upita. Previ\u0111amo \u010dinjenicu da nema parametara, ali znamo du\u017einu upita i koliko puta se izvr\u0161avao u sekundi. Tako mo\u017eemo procijeniti koliko pribli\u017eno bajtova u sekundi. Mo\u017eda \u0107emo pogrije\u0161iti nekih dva puta, ali redoslijed \u0107emo sigurno razumjeti na ovaj na\u010din.<\/p>\n<p><\/p>\n<p>Mo\u017eemo vidjeti da se ovaj upit izvr\u0161ava 802 puta u sekundi. I vidimo da \u0107e se bytes_per sec \u2013 300 kB\/s zapisivati plus minus. I, obi\u010dno, takav tok si mo\u017eemo priu\u0161titi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/218f905073a8519115adf5c65825b74d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ali! Postoje razli\u010diti sustavi za logiranje. I po defaultu, obi\u010dno ljudi imaju 'syslog'.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/66054682083ba2ada174afb5e7ee3973.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I ako imate syslog, mo\u017ee izgledati ovako. Uzet \u0107emo pgbench, uklju\u010diti logiranje upita i vidjeti \u0161to se doga\u0111a.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/a05723dcf10a7733f054ba108bb0f107.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Bez logiranja \u2013 to je lijevi stupac. Imali smo 161 000 TPS. Sa syslog \u2013 na Ubuntu 16.04 na Amazonu dobijamo 37 000 TPS. A ako promijenimo na druge dva na\u010dina logiranja, situacija je daleko bolja. To jest, o\u010dekivali smo pad, ali ne toliko.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/a7d90af9d29761d3b80eb09bf050760f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A na CentOS 7, gdje journald sudjeluje, pretvaraju\u0107i logove u binarni format za lak\u0161e pretra\u017eivanje itd., situacija je u\u017easna, do\u017eivljavamo 44 puta pada u TPS.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/86d2af18a0e6364f297a62378b6ede56.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I to je ono s \u010dime se ljudi suo\u010davaju. A \u010desto u kompanijama, osobito u velikima, to je vrlo te\u0161ko promijeniti. Ako mo\u017eete oti\u0107i od syslog, slobodno to u\u010dinite.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/a167a6fac7f28c7541515f7eff30bdb4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Procijenite IOPS i zapisni tok. <\/li>\n<li>Provjerite svoj sustav logiranja. <\/li>\n<li>Ako je predvi\u0111eno optere\u0107enje preveliko, razmislite o mogu\u0107nosti uzorkovanja. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/127fa1296578ba0ba6eac2b44c5c5398.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Imamo pg_stat_statements. Kao \u0161to sam rekao, on mora biti uklju\u010den. I mo\u017eemo uzeti i svaku grupu upita posebno opisati u datoteci. Zatim mo\u017eemo iskoristiti vrlo korisnu funkciju u pgbench \u2013 mogu\u0107nost u\u010ditavanja vi\u0161e datoteka uz pomo\u0107 opcije '-f'.<\/p>\n<p><\/p>\n<p>On razumije mnogo \u201e-f\u201c. I mo\u017ee se re\u0107i s pomo\u0107u \u201e@\u201c na kraju, koja bi kvota trebala biti za svaku datoteku. Odnosno, mo\u017eemo re\u0107i da ovo izvr\u0161ava u 10% slu\u010dajeva, a ono u 20%. I to \u0107e nas pribli\u017eiti onome \u0161to vidimo na produkciji.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/b91d18a9861abdc36bfda54cd72a142f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A kako \u0107emo znati \u0161to imamo na produkciji? Koja je kvota i \u010dega kako? Ovdje malo odlazimo u stranu. Imamo jo\u0161 jedan proizvod. <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/postgres-ai\/postgres-checkup\">postgres-checkup<\/a><\/noindex>. Tako\u0111er baza u Open Source. I trenutno ga aktivno razvijamo.<\/p>\n<p><\/p>\n<p>Ro\u0111en je iz malo drugih razloga. Razloga da monitore nije dovoljno. Odnosno, dolazite, gledate bazu, gledate probleme koji postoje. I, obi\u010dno, radite health_check. Ako ste iskusni DBA, tada radite health_check. Pogledali ste kori\u0161tenje indeksa itd. Ako imate OKmeter, odli\u010dno. To je sjajan monitoring za Postgres. OKmeter.io \u2013 molimo, instalirajte ga, sve je jako dobro napravljeno. Pla\u0107en je.<\/p>\n<p><\/p>\n<p>Ako ga nemate, obi\u010dno imate vrlo malo. U monitoringu su obi\u010dno dostupni CPU, IO i to sa ograni\u010denjima, i sve. A nama treba vi\u0161e. Trebamo vidjeti kako radi avakovum, kako radi checkpoint, u io trebamo odvojiti checkpoint od bgwriter i od backendova itd.<\/p>\n<p><\/p>\n<p>Problem je u tome \u0161to, kada poma\u017eete nekome velikom poduze\u0107u, oni ne mogu brzo implementirati ne\u0161to. Ne mogu brzo kupiti OKmeter. Mo\u017eda \u0107e ga kupiti za pola godine. Ne mogu brzo instalirati neke pakete. <\/p>\n<p><\/p>\n<p>I do\u0161li smo na ideju da nam treba poseban alat koji ne zahtijeva nikakvu instalaciju, tj. ne trebate ni\u0161ta postavljati na produkciji. Instalirate ga na svoj laptop, ili na poslu\u017eitelj za promatranje, s kojeg \u0107ete ga pokretati. I on \u0107e analizirati mnogo toga: i operativni sustav, i datote\u010dni sustav, i sam Postgres, rade\u0107i neke lagane upite koje mo\u017eete provoditi izravno na produkciji i ni\u0161ta ne\u0107e pasti.<\/p>\n<p><\/p>\n<p>Nazvali smo ga Postgres-checkup. Ako govorimo medicinski, to je redovita provjera zdravlja. Ako govorimo o automobilima, to je kao redovni servis. Redovni servis radite za auto svake pola godine ili godine, ovisno o marki. A radite li redovni servis za svoju bazu? Odnosno, radite li temeljito istra\u017eivanje redovito? Treba to raditi. Ako radite backup, radite i checkup, to nije manje va\u017eno.<\/p>\n<p><\/p>\n<p>I imamo takav alat. Po\u010deo se aktivno razvijati tek prije tri mjeseca. Jo\u0161 je mlad, ali ima mnogo toga.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/514d00b5cb710a7997af0a5dde55b5a8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Prikupljamo najsna\u017enije grupe upita \u2013 izvje\u0161\u0107e K003 u Postgres-checkupu<\/p>\n<p><\/p>\n<p>I tamo postoji grupa izvje\u0161\u0107a K. Trenutno imamo tri izvje\u0161\u0107a. I postoji to izvje\u0161\u0107e K003. Tamo je vrh od pg_stat_statements, sortiran po total_time.<\/p>\n<p><\/p>\n<p>Kada sortiramo grupe upita prema total_time, vidimo grupu koja najvi\u0161e optere\u0107uje na\u0161 sustav, tj. tro\u0161i vi\u0161e resursa. Za\u0161to nazivam grupe upita? Zato \u0161to smo izbacili parametre. To vi\u0161e nisu upiti, ve\u0107 grupe upita, tj. one su apstraktne.<\/p>\n<p><\/p>\n<p>Ako optimiziramo od vrha prema dnu, olak\u0161avamo na\u0161e resurse i odga\u0111amo trenutak kada \u0107emo morati napraviti nadogradnju. To je vrlo dobar na\u010din da u\u0161tedimo novac.<\/p>\n<p><\/p>\n<p>Mo\u017eda to nije najbolji na\u010din za brigu o korisnicima, jer mo\u017eda ne primje\u0107ujemo rijetke, ali vrlo nezgodne slu\u010dajeve kada je osoba \u010dekala 15 sekundi. U zbiru su to tako rijetki slu\u010dajevi da ih ne vidimo, ali se bavimo resursima.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/d16abc423573e4d923b0c03683c2efee.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0160to se dogodilo u ovoj tablici? Napravili smo dva snimka. Postgres_checkup \u0107e vam dati razliku za svaku metrik\u0443: po total-time, calls, rows, shared_blks_read itd. Sve, razlika je izra\u010dunata. Veliki problem pg_stat_statements je taj \u0161to ne pamti kada je bio resetiran. Dok pg_stat_database pamti, pg_stat_statements ne pamti. Vidite broj 1.000.000, ali ne znamo odakle smo to izra\u010dunali.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c370bf1237675e03c0a3d362c025ac24.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A ovdje znamo, ovdje imamo dva snimka. Znamo da je razlika u ovom slu\u010daju bila 56 sekundi. Vrlo kratak period. Sortirali smo po total_time. I dalje mo\u017eemo diferencirati, tj. sve metrike dijelimo s duration. Ako svaku metriku podijelimo s duration, dobit \u0107emo broj poziva u sekundi.<\/p>\n<p><\/p>\n<p>Zatim, total_time po sekundi \u2013 to je moja omiljena metr\u0430. Mjeri se u sekundama, po sekundi, tj. koliko je sekundi na\u0161 sustav trebalo za izvr\u0161enje te grupe upita u sekundi. Ako vidite vi\u0161e od sekunde po sekundi, to zna\u010di da vam je potrebno vi\u0161e od jednog jezgra. To je vrlo dobra metr\u0430. Mo\u017eete shvatiti da tom tipu, na primjer, treba najmanje tri jezgra.<\/p>\n<p><\/p>\n<p>Eto, ovo je na\u0161e inovativno rje\u0161enje, ne\u0161to \u0161to nisam nigdje vidio. Obratite pa\u017enju \u2013 to je vrlo jednostavna stvar \u2013 sekunda po sekundi. Ponekad, kada imate CPU na 100 %, to je pola sata po sekundi, tj. proveli ste pola sata samo na tim upitima. <\/p>\n<p><\/p>\n<p>Dalje, vidimo koliko redaka po sekundi. Znamo koliko je redaka po sekundi vra\u0107eno.<\/p>\n<p><\/p>\n<p>I dalje postoji zanimljiva stvar. Koliko smo shared_buffers pro\u010ditali po sekundi iz samog shared_buffers. Hitovi su ve\u0107 bili tu, a redovi su uzeti iz ke\u0161a operativnog sustava, ili s diska. Prva opcija je brza, dok druga mo\u017ee biti brza, ali i ne mora, ovisno o situaciji. <\/p>\n<p><\/p>\n<p>Drugi na\u010din diferencijacije je da dijelimo broj zahtjeva unutar ove grupe. U drugoj koloni uvijek \u0107e biti jedan zahtjev podijeljen s drugim zahtjevom. A zatim je zanimljivo \u2013 koliko je milisekundi bilo u ovom zahtjevu. Znamo kako se taj zahtjev pona\u0161a u prosjeku. Trebalo je 101 milisekunda za svaki zahtjev. To je tradicionalna metrika koja nam je potrebna za razumijevanje.<\/p>\n<p><\/p>\n<p>Koliko je redaka svaki zahtjev vra\u0107ao u prosjeku. Vidimo da prva grupa vra\u0107a 8. Koliko prosje\u010dno uzeto i pro\u010ditano iz ke\u0161a. Vidimo da je sve odli\u010dno ke\u0161irano. Samo hitovi za prvu grupu. <\/p>\n<p><\/p>\n<p>\u010cetvrta podstavek u svakoj liniji je koliko posto od ukupnog broja. Imamo pozive. Recimo, 1.000.000. I mo\u017eemo shvatiti koji doprinos ova grupa daje. Vidimo da prva grupa doprinosi manje od 0,01 %. To jest, toliko je spora da je ne vidimo u cjelokupnom slikama. Druga grupa \u2013 5 % po pozivima. To jest, 5 % od svih poziva je druga grupa. <\/p>\n<p><\/p>\n<p>Na total_time tako\u0111er je zanimljivo. Na prvu grupu zahtjeva potro\u0161ili smo 14 % ukupnog vremena rada. A na drugu \u2013 11 % i tako dalje. <\/p>\n<p><\/p>\n<p>Ne\u0107u se previ\u0161e zadr\u017eavati na detaljima, ali postoje finese. Prikazujemo gre\u0161ku na vrhu, jer kada uspore\u0111ujemo, snimci se mogu pomaknut, to jest, neki zahtjevi mogu ispasti i u drugom ve\u0107 ne moraju biti prisutni, dok neki mogu novi nastati. I tu izra\u010dunavamo gre\u0161ku. Ako vidite 0, to je dobro. Nema gre\u0161aka. Ako je pokazatelj gre\u0161ke do 20 %, to je u redu. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/327bbf167bc21d37a3e1597b52528e6d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dalje se vra\u0107amo na na\u0161u temu. Moramo izraditi workload. Idemo odozgo prema dolje, dok ne skupimo 80 % ili 90 %. Obi\u010dno je to 10-20 grupa. I pravimo datoteke za pgbench. Tamo koristimo random. Ponekad, na\u017ealost, to ne uspije. A u Postgres 12 bit \u0107e vi\u0161e mogu\u0107nosti za kori\u0161tenje ovog pristupa. <\/p>\n<p><\/p>\n<p>I tako dolazimo do 80-90 % ukupnog vremena. \u0160to staviti nakon \u00ab@\u00bb? Gledamo na pozive, provjeravamo koliko posto i shva\u0107amo da ovdje trebamo imati toliko posto. Iz tih postotaka mo\u017eemo razumjeti kako balansirati svaku od datoteka. Nakon toga koristimo pgbench i kre\u0107emo raditi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/53edf787f49dcabb5e4731510839332d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Imamo jo\u0161 K001 i K002. <\/p>\n<p><\/p>\n<p>K001 \u2013 to je jedan veliki red s \u010detiri podniza. To je karakteristika cijelog na\u0161eg optere\u0107enja. Pogledajte drugu kolumnu i drugi podniz. Vidimo da je to otprilike jedan i pol sekundi po sekundi, tj. ako imamo dva jezgra, bit \u0107e dobro. Bit \u0107e otprilike 75 % optere\u0107enja. I to \u0107e tako raditi. Ako imamo 10 jezgri, bit \u0107emo potpuno smireni. Tako mo\u017eemo procijeniti resurse.<\/p>\n<p><\/p>\n<p>K002 \u2013 to nazivam klasama upita, tj. SELECT, INSERT, UPDATE, DELETE. I odvojeno SELECT FOR UPDATE, jer on zaklju\u010dava. <\/p>\n<p><\/p>\n<p>I ovdje mo\u017eemo zaklju\u010diti da su obi\u010dni \u010ditaju\u0107i SELECT \u2013 82 % od svih poziva, ali pritom \u2013 74 % ukupnog vremena. To jest, \u010desto se pozivaju, ali tro\u0161e manje resursa. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/0e0234e696ffe1c80f8b5acccc602dbd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I vra\u0107amo se na pitanje: \u00abKako pravilno odabrati shared_buffers?\u00bb. Primijetio sam da se ve\u0107ina benchmarkova gradi na ideji \u2013 pogledajmo kakav \u0107e biti throughput, tj. kakva \u0107e biti propusnost. Obi\u010dno se mjeri u TPS ili QPS.<\/p>\n<p><\/p>\n<p>I poku\u0161avamo izvu\u0107i od stroja maksimalan broj transakcija u sekundi kroz parametre tuning-a. Ovdje imamo 311 po sekundi za select.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/d5e73f2672d94bb92eed921ef3dfe0b7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>No nitko ne vozi na posao i natrag ku\u0107i autom na punoj brzini. To je glupo. Tako je i s bazama podataka. Ne bismo trebali voziti na punoj brzini, nitko to i ne radi. Nitko ne \u017eivi u produkciji s 100 % CPU. Iako, mo\u017eda netko i \u017eivi, ali to nije dobro. <\/p>\n<p><\/p>\n<p>Ideja je da obi\u010dno vozimo oko 20 % od mogu\u0107nosti, po\u017eeljno ne vi\u0161e od 50 %. I trudimo se optimizirati vrijeme odziva za na\u0161e korisnike prije svega. To jest, na\u0161e ruke treba okretati tako da imamo minimalnu latenciju pri 20 % brzine, uvjetno. To je takva ideja koju tako\u0111er poku\u0161avamo primijeniti u na\u0161im eksperimentima.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c32c2cfb76dce0ce6b50e929bbf914ac.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I na kraju preporuke: <\/p>\n<p><\/p>\n<ul>\n<li>Obavezno napravite Database Lab.<\/li>\n<li>Ako je mogu\u0107e, napravite on demand, tako da se mo\u017ee razviti na neko vrijeme \u2013 igrate se i odbacite. Ako imate oblake, to je samo po sebi razumljivo, tj. imajte mnogo standing. <\/li>\n<li>Budite radoznali. Ako ne\u0161to nije u redu, testirajte eksperimentima kako se pona\u0161a. Nancy se mo\u017ee koristiti za vlastito u\u010denje, da provjerite kako baza radi.<\/li>\n<li>I ciljate na minimalno vrijeme odziva. <\/li>\n<li>I ne bojte se izvornih kodova Postgres. Kada radite s izvorima, morate znati engleski. Ima puno komentara, sve je obja\u0161njeno. <\/li>\n<li>I redovito provjeravajte zdravlje baze, barem svaka tri mjeseca ru\u010dno ili koriste\u0107i Postgres-checkup. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/8d2ac05f44bd245b879799862ce9e233.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pitanja<\/p>\n<p><\/p>\n<p><em>Hvala puno! Vrlo zanimljiva stvar.<\/em> <\/p>\n<p><\/p>\n<p>Dvije stvari.<\/p>\n<p><\/p>\n<p><em>Da, dvije stvari. Samo nisam ba\u0161 shvatio. Kada radimo s Nancy, mo\u017eemo prilago\u0111avati samo jedan parametar ili cijelu grupu?<\/em><\/p>\n<p><\/p>\n<p>Imamo delta-config parametar. Mo\u017eete odmah prilago\u0111avati koliko god \u017eelite. Ali trebate razumjeti, kada mijenjate mnogo stvari, mo\u017eete donijeti pogre\u0161ne zaklju\u010dke. <\/p>\n<p><\/p>\n<p><em>Da. Za\u0161to pitam? Zato \u0161to je te\u0161ko provoditi eksperimente kada imate samo jedan parametar. Prilagodite ga, pogledate kako radi. Postavite ga. Onda po\u010dinjete s sljede\u0107im.<\/em><\/p>\n<p><\/p>\n<p>Mo\u017eete prilago\u0111avati istovremeno, ali naravno ovisi o situaciji. Ali bolje je provjeriti jednu ideju. Ju\u010der je kod nas nastala ideja. Imali smo vrlo sli\u010dnu situaciju. Bilo je dvije konfiguracije. I nismo mogli shvatiti za\u0161to je razlika velika. I pojavila se ideja da koristi dihotomiju kako bismo postupno razumjeli i prona\u0161li u \u010demu je razlika. Mo\u017eete odmah u\u010diniti polovicu parametara istima, zatim \u010detvrtinu itd. Sve je fleksibilno.<\/p>\n<p><\/p>\n<p><em>I jo\u0161 jedno pitanje. Projekt je mlad, razvija se. Je li dokumentacija ve\u0107 spremna, postoji li detaljan opis?<\/em><\/p>\n<p><\/p>\n<p>Imao sam namjeru staviti link na opis parametara. To postoji. Ali jo\u0161 uvijek puno toga nema. Tra\u017eim istomi\u0161ljenike. I nalazim ih kada nastupam. To je jako cool. Neki ve\u0107 rade sa mnom, neki su pomogli i ne\u0161to napravili. Ako vas zanima ova tema, javite mi \u2013 \u0161to nedostaje. <\/p>\n<p><\/p>\n<p><em>Kada napravimo laboratorij, mo\u017eda \u0107e biti povratnih informacija. Vidjet \u0107emo. Hvala!<\/em><\/p>\n<p><\/p>\n<p><em>Pozdrav! Hvala na prezentaciji! Vidio sam da postoji podr\u0161ka za Amazon. Planira li se podr\u0161ka za GSP?<\/em><\/p>\n<p><\/p>\n<p>Dobar pitanje. Po\u010deli smo raditi. I trenutno smo stali, jer \u017eelimo \u0161tedjeti. To jest, postoji podr\u0161ka putem pokretanja na localhostu. Mo\u017eete sami kreirati instancu i raditi lokalno. Ina\u010de, tako radimo. U Getlabu radim to, tamo na GSP-u. Ali ne vidimo smisao u takvoj orkestraciji, jer Google nema jeftinih spotova. Postoje ??? instance, ali imaju ograni\u010denja. Prvo, uvijek imaju samo 70% popusta i ne mo\u017eete igrati s cijenom. Spotovi pove\u0107avamo cijenu za 5-10% kako bismo smanjili vjerojatnost da vas isklju\u010de. To jest, \u0161tedite na spotovima, ali vas mogu u bilo kojem trenutku oduzeti. Ako malo pove\u0107ate cijenu u odnosu na druge, bit \u0107ete eliminirani kasnije. Google ima potpuno druga\u010diju specifikaciju. I postoji jo\u0161 jedno vrlo lo\u0161e ograni\u010denje \u2013 oni \u017eive samo 24 sata. A ponekad \u017eelimo provoditi eksperiment 5 dana. Ali to se mo\u017ee raditi sa spotovima, spotovi ponekad \u017eive mjesecima. <\/p>\n<p><\/p>\n<p><em>Pozdrav! Hvala na izlaganju! Spomenuli ste checkup. Kako izra\u010dunavate gre\u0161ke stat_statements?<\/em><\/p>\n<p><\/p>\n<p>Vrlo dobro pitanje. Mogu vrlo detaljno pokazati i ispri\u010dati. Ukratko \u2013 gledamo kako su se promijenile grupe upita: koliko ih je otpalo i koliko je novih pojavilo. I dalje gledamo dvije metrike: total_time i calls, pa imamo dvije gre\u0161ke. I gledamo koji je doprinos grupa koje su se promijenile. Imaju dvije podgrupe: one koje su otpale i one koje su se pojavile. Gledamo njihov doprinos ukupnoj slici. <\/p>\n<p><\/p>\n<p><em>Ne bojite li se da \u0107e se ponovno pojaviti dva do tri puta izme\u0111u snimanja?<\/em><\/p>\n<p><\/p>\n<p>To jest, ponovno su se registrirali ili kako?<\/p>\n<p><\/p>\n<p><em>Na primjer, taj upit je jednom ve\u0107 bio izba\u010den, zatim se vratio i ponovno bio izba\u010den, a zatim se opet vratio i ponovno bio izba\u010den. I ne\u0161to ste ovdje izra\u010dunali, gdje je to sve?<\/em><\/p>\n<p><\/p>\n<p>Dobar pitanje, potrebno je pogledati. <\/p>\n<p><\/p>\n<p><em>Radio sam sli\u010dnu stvar. Naravno, radio sam to jednostavnije, sam. Ali morao sam resetirati stat_statements i orijentirati se u trenutku snimanja, gdje je bio ispod odre\u0111ene razine, da nije postigao plafon koliko mo\u017ee akumulirati stat_statements. I orijentiram se da, najvjerojatnije, ni\u0161ta nije izba\u010deno.<\/em> <\/p>\n<p><\/p>\n<p>Da-da. <\/p>\n<p><\/p>\n<p><em>Ali ne razumijem kako to druga\u010dije u\u010diniti pouzdano.<\/em><\/p>\n<p><\/p>\n<p>Na\u017ealost, ne sje\u0107am se to\u010dno \u2013 koristimo li tekst upita ili queryid s pg_stat_statements i na temelju toga se orijentiramo. Ako se orijentiramo na queryid, tada uspore\u0111ujemo usporedive stvari. <\/p>\n<p><\/p>\n<p><em>Ne, mo\u017ee se nekoliko puta zamijeniti izme\u0111u snapshotova i opet se vratiti.<\/em><\/p>\n<p><\/p>\n<p>S istim id-om?<\/p>\n<p><\/p>\n<p><em>Da.<\/em> <\/p>\n<p><\/p>\n<p>Istra\u017eit \u0107emo to. Dobro pitanje. Trebamo se pozabaviti time. Ali trenutno, ono \u0161to vidimo je da imamo ili 0 zapisa...<\/p>\n<p><\/p>\n<p><em>To je, naravno, rijetka situacija, ali bio sam iznena\u0111en kada sam saznao da stat_statements mo\u017ee zamijeniti ne\u0161to.<\/em> <\/p>\n<p><\/p>\n<p>U Pg_stat_statements mo\u017ee biti mnogo toga. Susreli smo se s tim da ako imate track_utility = on, onda se i setovi prate. <\/p>\n<p><\/p>\n<p><em>Da, naravno.<\/em><\/p>\n<p><\/p>\n<p>I ako imate Java Hibernate, koji je nasumi\u010dan, tada po\u010dinje zaklju\u010davanje hash-tablice. \u010cim isklju\u010dite jako optere\u0107enu aplikaciju, imate 50-100 grupica. I sve je tamo vi\u0161e-manje stabilno. Jedan od na\u010dina da se to rije\u0161i je pove\u0107ati pg_stat_statements.max. <\/p>\n<p><\/p>\n<p><em>Da, ali trebate znati koliko. I kako to pratiti. Tako radim. To jest, imam pg_stat_statements.max. I gledam, u trenutku snapshot-a nisam dostigao 70%. Dobro, zna\u010di nismo ni\u0161ta izgubili. Radimo reset. I ponovo skupljamo. Ako u sljede\u0107em snapshot-u bude manje od 70%, to zna\u010di da vjerojatno opet nismo ni\u0161ta izgubili.<\/em><\/p>\n<p><\/p>\n<p>Da. Prema zadanom, sada je 5000. I mnogima je to dovoljno. <\/p>\n<p><\/p>\n<p><em>Obi\u010dno - da.<\/em> <\/p>\n<p><\/p>\n<p>Video:<\/p>\n<p>\n<center><div class=\"youtube-placeholder\" data-id=\"yvO1jjG-tDI\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/yvO1jjG-tDI\/hqdefault.jpg\" alt=\"Pogledajte 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>P.S. Dodajem da ako u Postgresu postoje povjerljivi podaci koje ne smiju dospjeti u testno okru\u017eenje, mo\u017eete iskoristiti <noindex><a rel=\"nofollow\" href=\"https:\/\/labs.dalibo.com\/postgresql_anonymizer\">PostgreSQL Anonymizer<\/a><\/noindex>. Ovdje je pribli\u017eno shema:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka&quot;. Nikolaj Samohvalov\" src=\"\/wp-content\/uploads\/2020\/04\/cf9a2052364e09a20e68d2347dd0c25b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Izvor: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/498060\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u041d\u0438\u043a\u043e\u043b\u0430\u044f \u0421\u0430\u043c\u043e\u0445\u0432\u0430\u043b\u043e\u0432\u0430 &quot;\u041f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0442\u044e\u043d\u0438\u043d\u0433\u0443 PostgreSQL: \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043d\u0430\u0434 \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445&quot; Shared_buffers = 25% \u2013 \u044d\u0442\u043e \u043c\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u043c\u0430\u043b\u043e? \u0418\u043b\u0438 \u0432 \u0441\u0430\u043c\u044b\u0439 \u0440\u0430\u0437? \u041a\u0430\u043a \u043f\u043e\u043d\u044f\u0442\u044c, \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043b\u0438 \u044d\u0442\u0430 \u2013 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0430\u044f \u2013 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u044f \u0432 \u0432\u0430\u0448\u0435\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435? \u041f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0434\u043e\u0439\u0442\u0438 \u043a \u0432\u043e\u043f\u0440\u043e\u0441\u0443 \u043f\u043e\u0434\u0431\u043e\u0440\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 postgresql.conf &quot;\u043f\u043e-\u0432\u0437\u0440\u043e\u0441\u043b\u043e\u043c\u0443&quot;. \u041d\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043b\u0435\u043f\u044b\u0445 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":78743,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-78742","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=\"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u041d\u0438\u043a\u043e\u043b\u0430\u044f \u0421\u0430\u043c\u043e\u0445\u0432\u0430\u043b\u043e\u0432\u0430 &quot;\u041f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0442\u044e\u043d\u0438\u043d\u0433\u0443 PostgreSQL: \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043d\u0430\u0434 \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445&quot; Shared_buffers = 25% \u2013 \u044d\u0442\u043e \u043c\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u043c\u0430\u043b\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\/hr\/blog\/administrirovanie\/promyshlennyj-podhod-k-tyuningu-postgresql-eksperimenty-nad-bazami-dannyh-nikolaj-samohvalov\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"hr_HR\" \/>\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\udd47\u041f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0442\u044e\u043d\u0438\u043d\u0433\u0443 PostgreSQL: \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043d\u0430\u0434 \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\u00bb. \u041d\u0438\u043a\u043e\u043b\u0430\u0439 \u0421\u0430\u043c\u043e\u0445\u0432\u0430\u043b\u043e\u0432 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u041d\u0438\u043a\u043e\u043b\u0430\u044f \u0421\u0430\u043c\u043e\u0445\u0432\u0430\u043b\u043e\u0432\u0430 &quot;\u041f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0442\u044e\u043d\u0438\u043d\u0433\u0443 PostgreSQL: \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043d\u0430\u0434 \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445&quot; Shared_buffers = 25% \u2013 \u044d\u0442\u043e \u043c\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u043c\u0430\u043b\u043e?\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/promyshlennyj-podhod-k-tyuningu-postgresql-eksperimenty-nad-bazami-dannyh-nikolaj-samohvalov\" \/>\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-04-21T17:42:46+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-04-21T17:42:46+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\udd47\"Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka\". Nikolaj Samohvalov | ProHoster","description":"Predla\u017eem da se upoznate sa transkriptom izlaganja Nikolaja Samohvalova \"Industrijski pristup optimizaciji PostgreSQL: eksperimenti nad bazama podataka\" Shared_buffers = 25% \u2013 je li to mnogo ili malo?","canonical_url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/promyshlennyj-podhod-k-tyuningu-postgresql-eksperimenty-nad-bazami-dannyh-nikolaj-samohvalov","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hr_HR","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\udd47\u041f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0442\u044e\u043d\u0438\u043d\u0433\u0443 PostgreSQL: \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043d\u0430\u0434 \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\u00bb. \u041d\u0438\u043a\u043e\u043b\u0430\u0439 \u0421\u0430\u043c\u043e\u0445\u0432\u0430\u043b\u043e\u0432 | ProHoster","og:description":"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u041d\u0438\u043a\u043e\u043b\u0430\u044f \u0421\u0430\u043c\u043e\u0445\u0432\u0430\u043b\u043e\u0432\u0430 &quot;\u041f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0442\u044e\u043d\u0438\u043d\u0433\u0443 PostgreSQL: \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043d\u0430\u0434 \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445&quot; Shared_buffers = 25% \u2013 \u044d\u0442\u043e \u043c\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u043c\u0430\u043b\u043e?","og:url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/promyshlennyj-podhod-k-tyuningu-postgresql-eksperimenty-nad-bazami-dannyh-nikolaj-samohvalov","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-04-21T17:42:46+00:00","article:modified_time":"2020-04-21T17:42:46+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"78742","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 16:51:38","updated":"2022-09-28 02:51:26","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/78742","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=78742"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/78742\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media\/78743"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=78742"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=78742"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=78742"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}