{"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\/pl\/blog\/administrirovanie\/promyshlennyj-podhod-k-tyuningu-postgresql-eksperimenty-nad-bazami-dannyh-nikolaj-samohvalov","title":{"rendered":"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty na bazach danych. Nikolay Samokhvalov","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><strong>Zach\u0119cam do zapoznania si\u0119 z transkrypcj\u0105 referatu Nikolaja Samochwa\u0142owa \"Przemys\u0142owe podej\u015bcie do tuningowania PostgreSQL: eksperymenty z bazami danych\"<\/strong><\/p>\n<p><\/p>\n<p>Shared_buffers = 25% \u2013 czy to du\u017co, czy ma\u0142o? A mo\u017ce w sam raz? Jak zrozumie\u0107, czy ta \u2013 do\u015b\u0107 przestarza\u0142a \u2013 rekomendacja pasuje do twojego konkretnego przypadku?<\/p>\n<p><\/p>\n<p>Nadszed\u0142 czas, aby profesjonalnie podej\u015b\u0107 do kwestii doboru parametr\u00f3w postgresql.conf. Nie za pomoc\u0105 \u015blepych \"autotuner\u00f3w\" czy przestarza\u0142ych porad z artyku\u0142\u00f3w i blog\u00f3w, ale na podstawie:<\/p>\n<p><\/p>\n<ol>\n<li>\u015bci\u015ble przemy\u015blanych eksperyment\u00f3w na bazach danych, przeprowadzanych automatycznie, w du\u017cych ilo\u015bciach i w warunkach maksymalnie zbli\u017conych do \"bojowych\",<\/li>\n<li>g\u0142\u0119bokiego zrozumienia specyfiki dzia\u0142ania system\u00f3w baz danych i systemu operacyjnego.<\/li>\n<\/ol>\n<p><\/p>\n<p>Korzystaj\u0105c z Nancy CLI (<noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/postgres.ai\/nancy\">https:\/\/gitlab.com\/postgres.ai\/nancy<\/a><\/noindex>), przyjrzymy si\u0119 konkretnemu przyk\u0142adzie \u2013 s\u0142ynne shared_buffers \u2013 w r\u00f3\u017cnych sytuacjach, w r\u00f3\u017cnych projektach, i spr\u00f3bujemy zrozumie\u0107, jak dobra\u0107 optymalne ustawienia dla naszej infrastruktury, baz danych i obci\u0105\u017cenia.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" 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>B\u0119dzie mowa o eksperymentach nad bazami danych. To historia, kt\u00f3ra trwa ju\u017c nieco ponad p\u00f3\u0142 roku. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/e77255c4abaa2a01ae37fe888fe67db7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kilka s\u0142\u00f3w o mnie. Do\u015bwiadczenie z Postgrem mam ju\u017c ponad 14 lat. Utworzy\u0142em kilka firm zajmuj\u0105cych si\u0119 sieciami spo\u0142eczno\u015bciowymi. Wsz\u0119dzie by\u0142 i jest wykorzystywany Postgres.<\/p>\n<p><\/p>\n<p>R\u00f3wnie\u017c grupa RuPostgres na Meetup zajmuje 2. miejsce na \u015bwiecie. Powoli zbli\u017camy si\u0119 do 2000 os\u00f3b. RuPostgres.org.<\/p>\n<p><\/p>\n<p>Na r\u00f3\u017cnych konferencjach, w tym Highload, odpowiadam za bazy danych, w szczeg\u00f3lno\u015bci za Postgres od samego pocz\u0105tku.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/fa009b50f1c0293eee80fc03fd2c05f0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>W ci\u0105gu ostatnich kilku lat wznowi\u0142em moj\u0105 praktyk\u0119 zwi\u0105zan\u0105 z konsultingiem w dziedzinie Postgresa w 11 strefach czasowych tutaj.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/550c3ddcd516adca14d2b3de9c34b7ff.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kiedy zrobi\u0142em to kilka lat temu, mia\u0142em pewn\u0105 przerw\u0119 w aktywnej pracy z Postgrem, prawdopodobnie od 2010 roku. By\u0142em zaskoczony, jak ma\u0142o zmieni\u0142y si\u0119 codzienne obowi\u0105zki DBA, wci\u0105\u017c wymaga si\u0119 du\u017co r\u0119cznej pracy. Od razu pomy\u015bla\u0142em, \u017ce co\u015b jest nie tak, trzeba zautomatyzowa\u0107 wi\u0119cej.<\/p>\n<p><\/p>\n<p>Poniewa\u017c wszystko dzia\u0142o si\u0119 w trybie zdalnym, wi\u0119kszo\u015b\u0107 klient\u00f3w znajdowa\u0142a si\u0119 w chmurze. Ju\u017c wiele zautomatyzowano, co by\u0142o oczywiste. O tym troch\u0119 p\u00f3\u017aniej. Tzn. wszystko to doprowadzi\u0142o do my\u015bli, \u017ce powinno by\u0107 kilka narz\u0119dzi, tzn. pewna platforma, kt\u00f3ra zautomatyzuje praktycznie wszystkie dzia\u0142ania DBA, aby mo\u017cna by\u0142o zarz\u0105dza\u0107 du\u017c\u0105 ilo\u015bci\u0105 baz.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/b02097f0bb23fa9d7c30e38ab9f3de7b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>W tym raporcie nie b\u0119dzie:<\/p>\n<p><\/p>\n<ul>\n<li>\u201eZ\u0142otych \u015brodk\u00f3w\u201d ani stwierdze\u0144 typu \u2013 postawcie 8 GB lub 25% shared_buffers, a b\u0119dziecie zadowoleni. O shared_buffers nie b\u0119dzie zbyt wiele. <\/li>\n<li>Czujne \"wn\u0119trzno\u015bci\". <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/ccea359ec78a967c150ddcedc3e50a88.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Co b\u0119dzie dalej?<\/p>\n<p><\/p>\n<ul>\n<li>B\u0119d\u0105 zasady optymalizacji, kt\u00f3re stosujemy i rozwijamy. Pojawi\u0105 si\u0119 r\u00f3\u017cne pomys\u0142y, kt\u00f3re b\u0119d\u0105 si\u0119 rodzi\u0107 na naszej drodze, oraz r\u00f3\u017cne narz\u0119dzia, kt\u00f3re tworzymy w wi\u0119kszo\u015bci jako Open Source, tzn. podstawy robimy w Open Source. Co wi\u0119cej, mamy zg\u0142oszenia, prawie ca\u0142e nasze komunikowanie si\u0119 odbywa w Open Source. Mo\u017cecie obserwowa\u0107, co aktualnie robimy, co b\u0119dzie w nast\u0119pnej wersji itp. <\/li>\n<li>B\u0119dzie te\u017c pewne do\u015bwiadczenie w stosowaniu tych zasad oraz narz\u0119dzi w r\u00f3\u017cnych firmach: od ma\u0142ych startup\u00f3w po du\u017ce korporacje. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/86e6f379726dec814aca616a30d36a2f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jak to wszystko si\u0119 rozwija?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/c1422d9f2945e717c6ebb31f5fef6329.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Przede wszystkim, g\u0142\u00f3wnym zadaniem DBA, opr\u00f3cz zapewnienia tworzenia instancji, wdra\u017cania kopii zapasowych itp., jest identyfikacja w\u0105skich garde\u0142 i optymalizacja wydajno\u015bci.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/8e682ca8666e94d6688348ebe4540327.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Obecnie wszystko dzia\u0142a w ten spos\u00f3b. Obserwujemy monitorowanie, widzimy co\u015b, czego\u015b brakuje. Zaczynamy dr\u0105\u017cy\u0107 g\u0142\u0119biej, zazwyczaj r\u0119cznie, aby zrozumie\u0107, co z tym zrobi\u0107 w taki czy inny spos\u00f3b.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/04599422ea6b6d57c79a4e48ba2db8b7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Istniej\u0105 dwa podej\u015bcia. Pg_stat_statements \u2013 standardowe rozwi\u0105zanie domy\u015blne do identyfikacji wolnych zapyta\u0144. I analiza log\u00f3w Postgres za pomoc\u0105 pgBadger.<\/p>\n<p><\/p>\n<p>Ka\u017cde z podej\u015b\u0107 ma powa\u017cne wady. W pierwszym podej\u015bciu wszystkie parametry s\u0105 zignorowane. Je\u015bli widzimy grupy SELECT * FROM table where kolumna r\u00f3wna si\u0119 znakowi \u201e?\u201d lub \u201e$\u201d od wersji Postgres 10. Nie wiemy \u2013 czy to skanowanie indeksu, czy skanowanie sekwencyjne. To bardzo mocno zale\u017cy od parametru. Podstawisz tam rzadko wyst\u0119puj\u0105c\u0105 warto\u015b\u0107, b\u0119dzie to skanowanie indeksu. Podstawisz warto\u015b\u0107, kt\u00f3ra zajmuje 90 % tabeli, b\u0119dzie to oczywi\u015bcie skanowanie sekwencyjne, poniewa\u017c Postgres zna statystyki. I to jest powa\u017cna wada pg_stat_statements, chocia\u017c prowadzone s\u0105 jakie\u015b prace.<\/p>\n<p><\/p>\n<p>G\u0142\u00f3wn\u0105 wad\u0105 analiz log\u00f3w jest to, \u017ce nie mo\u017cecie sobie pozwoli\u0107 na \u201elog_min_duration_statement = 0\u201d, w wi\u0119kszo\u015bci przypadk\u00f3w. O tym r\u00f3wnie\u017c porozmawiamy. W zwi\u0105zku z tym nie widzicie ca\u0142ego obrazu. Jakie\u015b zapytanie, kt\u00f3re jest bardzo szybkie, mo\u017ce wykorzystywa\u0107 ogromn\u0105 ilo\u015b\u0107 zasob\u00f3w, ale go nie zobaczycie, poniewa\u017c jest poni\u017cej waszego progu.<\/p>\n<p><\/p>\n<p><strong>Jak DBA rozwi\u0105zuj\u0105 zidentyfikowane problemy?<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/5e57fefdec6256f82045aaac037b516c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Na przyk\u0142ad, napotkali\u015bmy jaki\u015b problem. Co zazwyczaj si\u0119 robi? Je\u015bli jeste\u015b deweloperem, b\u0119dziesz pracowa\u0107 nad jakim\u015b instance, kt\u00f3ry nie jest zbyt du\u017cy. Je\u015bli jeste\u015b DBA, masz staging. I mo\u017ce by\u0107 tylko jeden. I on jest sp\u00f3\u017aniony o p\u00f3\u0142 roku. A ty my\u015blisz, \u017ce p\u00f3jdziesz na produkcj\u0119. Nawet do\u015bwiadczeni DBA sprawdzaj\u0105 potem na produkcji, na replikacji. Czasem tworz\u0105 tymczasowy indeks, upewniaj\u0105 si\u0119, \u017ce pomaga, usuwaj\u0105 go i oddaj\u0105 deweloperom, aby umie\u015bcili go w plikach migracyjnych. Taki absurd si\u0119 teraz dzieje. I to jest problem.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/402e80c7e5fbca6a054c0c9ec61e5fe3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Dostosowywa\u0107 konfiguracje.<\/li>\n<li>Optymalizowa\u0107 zestaw indeks\u00f3w. <\/li>\n<li>Zmienia\u0107 sam SQL (to najtrudniejszy spos\u00f3b).<\/li>\n<li>Dodawa\u0107 moc (najprostszy spos\u00f3b w wi\u0119kszo\u015bci przypadk\u00f3w).<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/8a6b3cd56e0df5c7908714926ba1eb05.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Z tymi rzeczami jest bardzo du\u017co. Jest wiele narz\u0119dzi w Postgresie. Trzeba du\u017co wiedzie\u0107. W Postgresie jest wiele indeks\u00f3w, mi\u0119dzy innymi dzi\u0119ki organizatorom tej konferencji. I wszystko to trzeba zna\u0107, i to w\u0142a\u015bnie wywo\u0142uje u nie-DBA wra\u017cenie, \u017ce DBA zajmuj\u0105 si\u0119 czarn\u0105 magi\u0105. Tzn. trzeba po\u015bwi\u0119ci\u0107 oko\u0142o 10 lat, aby zacz\u0105\u0107 to wszystko dobrze rozumie\u0107.<\/p>\n<p><\/p>\n<p>I ja jestem przeciwnikiem tej czarnej magii. Chc\u0119, aby by\u0142a technologia, a nie intuicja w tym wszystkim.<\/p>\n<p><\/p>\n<p><strong>Przyk\u0142ady z \u017cycia<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/70b11c3df9c41c66570635d5f309ed24.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Obserwowa\u0142em to przynajmniej w dw\u00f3ch projektach, w tym moim. Kolejny wpis na blogu informuje nas, \u017ce warto\u015b\u0107 1 000 dla default_statistict_target to dobrze. Dobrze, spr\u00f3bujmy w produkcji.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/0b4c2bd6f73df06967c94d5d78b07279.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I tutaj, u\u017cywaj\u0105c naszego narz\u0119dzia dwa lata p\u00f3\u017aniej w wyniku eksperyment\u00f3w nad bazami danych, o kt\u00f3rych dzisiaj m\u00f3wimy, mo\u017cemy por\u00f3wna\u0107 co by\u0142o i co si\u0119 zmieni\u0142o. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/3564eade6532003d2279c2736ab6d733.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I w tym celu musimy stworzy\u0107 eksperyment. Sk\u0142ada si\u0119 on z czterech cz\u0119\u015bci. <\/p>\n<p><\/p>\n<ul>\n<li>Pierwsza \u2013 to \u015brodowisko. Potrzebujemy sprz\u0119tu. I kiedy przychodz\u0119 do jakiej\u015b firmy i podpisuj\u0119 umow\u0119, m\u00f3wi\u0119, aby dawali mi taki sam sprz\u0119t jak na produkcji. Dla ka\u017cdego z waszych Mistrz\u00f3w potrzebuj\u0119 przynajmniej jeden taki sam sprz\u0119t. Mo\u017ce to by\u0107 wirtualna maszyna instance w Amazonie lub w Google, lub potrzebuj\u0119 dok\u0142adnie takiego samego sprz\u0119tu. Tzn. chc\u0119 odtworzy\u0107 \u015brodowisko. A w poj\u0119cie \u015brodowiska w\u0142\u0105czamy g\u0142\u00f3wn\u0105 wersj\u0119 Postgresa. <\/li>\n<li>Druga cz\u0119\u015b\u0107 \u2013 to obiekt naszych bada\u0144. To baza danych. Mo\u017cna j\u0105 stworzy\u0107 na kilka sposob\u00f3w. Poka\u017c\u0119 jak. <\/li>\n<li>Trzecia cz\u0119\u015b\u0107 \u2013 to obci\u0105\u017cenie. To najtrudniejszy moment. <\/li>\n<li>Czwarta cz\u0119\u015b\u0107 to to, co sprawdzamy, tzn. z czym b\u0119dziemy por\u00f3wnywa\u0107. Mo\u017cemy zmieni\u0107 jeden lub kilka parametr\u00f3w w konfiguracji lub mo\u017cemy utworzy\u0107 indeks. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/8ccd09ac4cdd336618413375617c10a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Rozpoczynamy eksperyment. Oto pg_stat_statements. Po lewej \u2013 to, co by\u0142o. Po prawej \u2013 co si\u0119 zmieni\u0142o.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/6f82d7e25a77b700f2ddb01f42a861a2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Po lewej default_statistics_target = 100, po prawej = 1 000. Widz\u0119, \u017ce to nam pomog\u0142o. Og\u00f3lnie wszystko poprawi\u0142o si\u0119 o 8 %.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/52dda8fb5fbcb9beecaa1eda8443a374.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ale je\u015bli przewiniemy w d\u00f3\u0142, zobaczymy grupy zapyta\u0144 z pgBadger lub pg_stat_statements. S\u0105 dwa scenariusze. Zobaczymy, \u017ce jakie\u015b zapytanie spad\u0142o o 88 %. I wtedy ju\u017c musimy podej\u015b\u0107 in\u017cynieryjnie. Mo\u017cemy zbada\u0107 spraw\u0119 dalej, bo interesuje nas, dlaczego spad\u0142o. Musimy zrozumie\u0107, co dzia\u0142o si\u0119 ze statystyk\u0105. Dlaczego wi\u0119ksza liczba koszyk\u00f3w w statystyce prowadzi do gorszego wyniku.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/4e6dfc04af4b3fc2b626dd46c08bdf66.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mo\u017cemy nie bada\u0107, a po prostu wykona\u0107 \u00abALTER TABLE\u2026 ALTER COLUMN\u00bb i przywr\u00f3ci\u0107 mu 100 koszyk\u00f3w w statystyce tej kolumny. Dalszym eksperymentem mo\u017cemy si\u0119 upewni\u0107, \u017ce ta poprawka pomog\u0142a. I to wszystko. To jest in\u017cynieryjne podej\u015bcie, kt\u00f3re pozwala nam widzie\u0107 ca\u0142o\u015b\u0107 i podejmowa\u0107 decyzje na podstawie danych, a nie intuicji.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/c87df172b994a4523478beebaf4a0275.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/9e766aa4348bd1a77b697e3179d84bbd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kilka przyk\u0142ad\u00f3w z innych obszar\u00f3w. W testach CI istniej\u0105 ju\u017c od wielu lat. \u017baden projekt w zdrowym rozs\u0105dku nie b\u0119dzie funkcjonowa\u0142 bez test\u00f3w automatycznych.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/b6c21981dc8b2b285973ae42199e2b4c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>W innych bran\u017cach: w lotnictwie, w motoryzacji, kiedy testujemy aerodynamik\u0119, r\u00f3wnie\u017c mamy mo\u017cliwo\u015b\u0107 przeprowadzania eksperyment\u00f3w. Nie b\u0119dziemy od razu wysy\u0142a\u0107 czego\u015b na orbit\u0119 na podstawie rysunku ani wprowadza\u0107 samochodu na tras\u0119. Na przyk\u0142ad, mamy tunel aerodynamiczny. <\/p>\n<p><\/p>\n<p>Na podstawie obserwacji w innych bran\u017cach mo\u017cemy wyci\u0105gn\u0105\u0107 wnioski. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/cef02ea9280e5795d1e593c600f0541b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Po pierwsze, mamy specjalne \u015brodowisko. Jest bliskie produkcji, ale nie jest tym samym. Jego g\u0142\u00f3wn\u0105 cech\u0105 jest to, \u017ce musi by\u0107 tanie, powtarzalne i maksymalnie zautomatyzowane. Dodatkowo musz\u0105 by\u0107 specjalne narz\u0119dzia do przeprowadzania szczeg\u00f3\u0142owej analizy.<\/p>\n<p><\/p>\n<p>Najprawdopodobniej, kiedy uruchamiamy samolot i latamy, mamy mniej mo\u017cliwo\u015bci badania ka\u017cdego milimetra powierzchni skrzyd\u0142a ni\u017c w tunelu aerodynamicznym. Dysponujemy wi\u0119kszymi \u015brodkami do diagnostyki. Mo\u017cemy sobie pozwoli\u0107 na dodatkowe ci\u0119\u017ckie sprz\u0119ty, kt\u00f3re nie mog\u0142yby zosta\u0107 umieszczone w samolocie w powietrzu. Podobnie jest z Postgresem. W niekt\u00f3rych przypadkach mo\u017cemy w\u0142\u0105czy\u0107 pe\u0142ne logowanie zapyta\u0144 podczas eksperyment\u00f3w. A tego na produkcji nie chcemy robi\u0107. Mo\u017cliwe, \u017ce nawet w planach w\u0142\u0105czymy to za pomoc\u0105 auto_explain.<\/p>\n<p><\/p>\n<p>I jak ju\u017c powiedzia\u0142em, wysoki poziom automatyzacji oznacza, \u017ce naci\u015bniesz przycisk i powt\u00f3rzysz. Tak to powinno wygl\u0105da\u0107, aby by\u0142o wiele eksperyment\u00f3w i aby to by\u0142o na bie\u017c\u0105co.<\/p>\n<p><\/p>\n<p>Nancy CLI \u2013 fundament \u201elaboratorium baz danych\u201d<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/f8303df21f309fb209929acec260b757.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I oto stworzyli\u015bmy co\u015b takiego. Tzn. o tych pomys\u0142ach m\u00f3wi\u0142em w czerwcu, prawie rok temu. I ju\u017c mamy w Open Source tzw. Nancy CLI. To fundament do budowania laboratorium baz danych.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" 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> \u2013 Jest to w Open Source, na Gitlab. Mo\u017cecie powiedzie\u0107, mo\u017cecie spr\u00f3bowa\u0107. Da\u0142em link w slajdach. Mo\u017cna w niego klikn\u0105\u0107 i tam b\u0119dzie <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/postgres-ai\/nancy\/-\/blob\/master\/help\/nancy_run.md\">help<\/a><\/noindex> we wszystkich parametrach.<\/p>\n<p><\/p>\n<p>Oczywi\u015bcie, wiele rzeczy jest jeszcze w fazie rozwoju. Jest wiele pomys\u0142\u00f3w. Ale to ju\u017c jest co\u015b, czego u\u017cywamy w\u0142a\u015bciwie codziennie. I kiedy mamy pomys\u0142 \u2013 co si\u0119 dzieje, gdy usuwamy 40 000 000 wierszy, gdzie wszystko utkn\u0119\u0142o w IO, mo\u017cemy przeprowadzi\u0107 eksperyment i przyjrze\u0107 si\u0119 bli\u017cej, aby zrozumie\u0107, co si\u0119 dzieje, a potem spr\u00f3bowa\u0107 to naprawi\u0107 w locie. Tzn. przeprowadzamy eksperyment. Na przyk\u0142ad, co\u015b zmieniamy i patrzymy, co z tego wynika. I robimy to nie na produkcji. To jest sedno idei.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/c22d332de4b45d604dfb9c5a95404fd6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Gdzie to mo\u017ce dzia\u0142a\u0107? Mo\u017ce to dzia\u0142a\u0107 lokalnie, tzn. mo\u017cna to robi\u0107 wsz\u0119dzie, mo\u017cna nawet uruchomi\u0107 to na MacBooku. Potrzebny jest Docker, jedziemy. I ju\u017c. Mo\u017cna uruchomi\u0107 na jakim\u015b instancie na sprz\u0119cie, albo w wirtualce, gdziekolwiek.<\/p>\n<p><\/p>\n<p>Istnieje r\u00f3wnie\u017c mo\u017cliwo\u015b\u0107 uruchamiania na Amazonie na instancji EC2, w spotach. To naprawd\u0119 \u015bwietna opcja. Na przyk\u0142ad, wczoraj przeprowadzili\u015bmy ponad 500 eksperyment\u00f3w na instancji i3, od najni\u017cszej do i3-16-xlarge. Kosztowa\u0142o nas to 500 eksperyment\u00f3w tylko 64 dolary. Ka\u017cdy trwa\u0142 15 minut. Dzi\u0119ki temu, \u017ce u\u017cywane s\u0105 spoty, to bardzo tanio \u2013 zni\u017cka 70%, rozliczanie na podstawie sekund przez Amazon. Mo\u017cna zrobi\u0107 naprawd\u0119 wiele. Mo\u017cna przeprowadza\u0107 rzeczywiste badania.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/64c61cc9dd7181296b2ef5b815a17493.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wspierane s\u0105 trzy g\u0142\u00f3wne wersje Postgresa. Nie jest tak trudno doda\u0107 jakie\u015b starsze oraz now\u0105 wersj\u0119 12.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/ee147c91014ab698cbd3c60e193bef23.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mo\u017cemy definiowa\u0107 obiekt na trzy sposoby. Oto one:<\/p>\n<p><\/p>\n<ul>\n<li>Dump \/ plik sql. <\/li>\n<li>G\u0142\u00f3wnym sposobem jest klonowanie katalogu PGDATA. Zazwyczaj pobiera si\u0119 go z serwera kopii zapasowej. Je\u015bli masz normalne kopie zapasowe binarne, mo\u017cesz stamt\u0105d robi\u0107 klony. Je\u015bli korzystasz z chmury, w\u00f3wczas taka chmurowa firma jak Amazon czy Google zrobi to za Ciebie. To jest g\u0142\u00f3wny spos\u00f3b na klonowanie rzeczywistego \u015brodowiska produkcyjnego. W ten spos\u00f3b w rzeczywisto\u015bci rozstawiamy. <\/li>\n<li>Ostatni spos\u00f3b nadaje si\u0119 do bada\u0144, gdy chcemy zrozumie\u0107, jak co\u015b dzia\u0142a w Postgresie. To jest pgbench. Mo\u017cesz go wygenerowa\u0107 za pomoc\u0105 pgbench. To po prostu jedna opcja \u201edb-pgbench\u201d. M\u00f3wisz mu, jaki zestaw danych. A wszystko b\u0119dzie wygenerowane w chmurze, jak to zosta\u0142o powiedziane.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/2bc3e30cb31a19f66c6b55480447126f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I obci\u0105\u017cenie:<\/p>\n<p><\/p>\n<ul>\n<li>Obci\u0105\u017cenie mo\u017cemy wykona\u0107 w jednym w\u0105tku SQL. To najprostszy spos\u00f3b. <\/li>\n<li>Mo\u017cemy r\u00f3wnie\u017c emulowa\u0107 obci\u0105\u017cenie. A emulacj\u0119 mo\u017cemy przede wszystkim przeprowadzi\u0107 w nast\u0119puj\u0105cy spos\u00f3b. Musimy zebra\u0107 wszystkie logi. I to jest bolesne. Poka\u017c\u0119, dlaczego. A nast\u0119pnie odtwarzamy je za pomoc\u0105 pgreplay, kt\u00f3ry jest wbudowany w Nancy. <\/li>\n<li>Lub inna opcja. Tzw. rzemie\u015blnicze obci\u0105\u017cenie, kt\u00f3re tworzymy z pewn\u0105 ilo\u015bci\u0105 wysi\u0142ku. Analizuj\u0105c nasze aktualne obci\u0105\u017cenie w systemie produkcyjnym, wybieramy najlepsze grupy zapyta\u0144. A przy pomocy pgbench mo\u017cemy emulowa\u0107 to obci\u0105\u017cenie w laboratorium. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/4adba12881faf9ad9d4f9e9f42c0f5c1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Albo musimy wykona\u0107 jakie\u015b SQL, tzn. sprawdzamy jak\u0105\u015b migracj\u0119, tworzymy indeks, wykonujemy ANALYZE. I patrzymy, co by\u0142o przed a po vacuums. Og\u00f3lnie, dowolny SQL.<\/li>\n<li>Mo\u017cemy zmieni\u0107 jeden lub kilka parametr\u00f3w w konfiguracji. Mo\u017cemy poprosi\u0107, aby sprawdzono na przyk\u0142ad 100 warto\u015bci na Amazonie dla naszej bazy danych terabajtowej. I po kilku godzinach otrzymasz wynik. Z regu\u0142y roz\u0142o\u017cenie terabajtowej bazy zajmuje kilka godzin. Ale w rozwoju jest poprawka, mamy mo\u017cliwo\u015b\u0107 serii, tzn. mo\u017cesz kolejno na tym samym serwerze u\u017cywa\u0107 tej samej pgdata i przeprowadza\u0107 kontrole. Postgres b\u0119dzie restartowany, cache b\u0119dzie czyszczony. I mo\u017cesz testowa\u0107 obci\u0105\u017cenie. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/02985b47bf0ab62e8f1c4cc3ea003f26.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Przyje\u017cd\u017ca katalog z wieloma r\u00f3\u017cnymi plikami, zaczynaj\u0105c od zrzut\u00f3w pg<em>stat<\/em>***. A tam najciekawsze \u2013 to pg_stat_statements, pg_stat_kcache. To dwa rozszerzenia, kt\u00f3re analizuj\u0105 zapytania. I pg_stat_bgwriter zawiera nie tylko statystyki pgwriter, ale r\u00f3wnie\u017c statystyki zwi\u0105zane z checkpointami i z tym, jak same backendy wypychaj\u0105 brudne bufory. I to wszystko jest ciekawe do obejrzenia. Na przyk\u0142ad, kiedy konfigurujemy shared_buffers, warto zobaczy\u0107, ile tam kto wypchn\u0105\u0142.<\/li>\n<li>Przyje\u017cd\u017caj\u0105 r\u00f3wnie\u017c logi Postgresa. Dwa logi \u2013 log przygotowania i log odtwarzania obci\u0105\u017cenia. <\/li>\n<li>Stosunkowo nowa funkcja \u2013 to FlameGraphs.<\/li>\n<li>Dodatkowo, je\u015bli korzysta\u0142e\u015b z pgreplay lub pgbench, aby odtwarza\u0107 obci\u0105\u017cenie, to pojawi si\u0119 ich rodzimy wynik. B\u0119dziesz m\u00f3g\u0142 zobaczy\u0107 op\u00f3\u017anienie i TPS. B\u0119dzie mo\u017cna zrozumie\u0107, jak to widzieli. <\/li>\n<li>Informacje o systemie. <\/li>\n<li>Podstawowe kontrole CPU i IO. To bardziej dla instancji EC2 w Amazonie, gdy chcesz uruchomi\u0107 100 identycznych instancji i przeprowadzi\u0107 na nich 100 r\u00f3\u017cnych test\u00f3w, b\u0119dziesz mie\u0107 10 000 eksperyment\u00f3w. Musisz upewni\u0107 si\u0119, \u017ce nie trafi\u0142e\u015b na wadliw\u0105 instancj\u0119, kt\u00f3ra jest ju\u017c t\u0142amszona przez kogo\u015b innego. Na tym sprz\u0119cie inni s\u0105 aktywni i masz ma\u0142o zasob\u00f3w. Takie wyniki lepiej odrzuci\u0107. I w\u0142a\u015bnie przy pomocy sysbench od Aleksieja Kopytowa robimy kilka kr\u00f3tkich test\u00f3w, kt\u00f3re przyb\u0119d\u0105 i mo\u017cna je por\u00f3wna\u0107 z innymi, tzn. zrozumiesz, jak zachowuje si\u0119 CPU i jak zachowuje si\u0119 IO. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/c4ddf5283c3c79e3d4c2c061e7dd9e7d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jakie s\u0105 techniczne trudno\u015bci w przyk\u0142adowych firmach?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/959690b464a01a4a3cb67ec497becff1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Za\u0142\u00f3\u017cmy, \u017ce chcemy powtarza\u0107 rzeczywiste obci\u0105\u017cenie za pomoc\u0105 log\u00f3w. Doskona\u0142y pomys\u0142, je\u015bli jest napisany w Open Source pgreplay. U\u017cywamy go. Ale aby dzia\u0142a\u0142 dobrze, musisz w\u0142\u0105czy\u0107 pe\u0142ne logowanie zapyta\u0144 z parametrami i czasem.<\/p>\n<p><\/p>\n<p>S\u0105 pewne trudno\u015bci zwi\u0105zane z duration i timestamp. Pomi\u0144my t\u0119 kwesti\u0119. G\u0142\u00f3wne pytanie brzmi \u2013 czy mo\u017cesz sobie na to pozwoli\u0107, czy nie? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" 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 polega na tym, \u017ce mo\u017ce to by\u0107 niedost\u0119pne. Przede wszystkim musisz zrozumie\u0107, jaki strumie\u0144 b\u0119dzie zapisywany w logu. Je\u015bli masz pg_stat_statements, mo\u017cesz takim zapytaniem (link b\u0119dzie dost\u0119pny w slajdach) okre\u015bli\u0107, ile mniej wi\u0119cej bajt\u00f3w b\u0119dzie zapisywanych na sekund\u0119.<\/p>\n<p><\/p>\n<p>Patrzymy na d\u0142ugo\u015b\u0107 zapytania. Ignorujemy fakt, \u017ce nie ma parametr\u00f3w, ale znamy d\u0142ugo\u015b\u0107 zapytania i wiemy, ile razy na sekund\u0119 jest wykonywane. W ten spos\u00f3b mo\u017cemy oszacowa\u0107, ile mniej wi\u0119cej bajt\u00f3w na sekund\u0119. Mo\u017cemy si\u0119 pomyli\u0107 o czynnik dwa, ale na pewno zrozumiemy to w ten spos\u00f3b.<\/p>\n<p><\/p>\n<p>Mo\u017cemy zobaczy\u0107, \u017ce to zapytanie jest wykonywane 802 razy na sekund\u0119. I widzimy, \u017ce bytes_per sec \u2013 300 kB\/s b\u0119dzie zapisywane plus minus. I zazwyczaj mo\u017cemy sobie pozwoli\u0107 na taki strumie\u0144. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/218f905073a8519115adf5c65825b74d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ale! Chodzi o to, \u017ce s\u0105 r\u00f3\u017cne systemy logowania. Domy\u015blnie ludzie maj\u0105 zazwyczaj \u201esyslog\u201d.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/66054682083ba2ada174afb5e7ee3973.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I je\u015bli masz syslog, to mo\u017cesz zobaczy\u0107 co\u015b takiego. We\u017amiemy pgbench, w\u0142\u0105czymy logowanie zapyta\u0144 i zobaczymy, co si\u0119 dzieje.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/a05723dcf10a7733f054ba108bb0f107.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Bez logowania \u2013 to lewy s\u0142upek. Osi\u0105gn\u0119li\u015bmy 161 000 TPS. Z syslog \u2013 to w Ubuntu 16.04 w Amazonie osi\u0105gamy 37 000 TPS. A je\u015bli zmienimy na dwa inne sposoby logowania, sytuacja b\u0119dzie znacznie lepsza. To znaczy, spodziewali\u015bmy si\u0119 spadku, ale nie a\u017c tak du\u017cego.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/a7d90af9d29761d3b80eb09bf050760f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A na CentOS 7, gdzie jeszcze uczestniczy journald, przekszta\u0142caj\u0105c logi w format binarny do \u0142atwego przeszukiwania itd., to jest zupe\u0142ny koszmar, spadamy o 44 razy w TPS.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/86d2af18a0e6364f297a62378b6ede56.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I to jest co\u015b, z czym \u017cyj\u0105 ludzie. I cz\u0119sto w firmach, szczeg\u00f3lnie du\u017cych, bardzo trudno to zmieni\u0107. Je\u015bli mo\u017cesz odej\u015b\u0107 od syslog, to prosz\u0119, odejd\u017a od niego.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/a167a6fac7f28c7541515f7eff30bdb4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Oce\u0144 IOPS i strumie\u0144 zapisu. <\/li>\n<li>Sprawd\u017a sw\u00f3j system logowania. <\/li>\n<li>Je\u015bli przewidywane obci\u0105\u017cenie jest zbyt du\u017ce, rozwa\u017c opcj\u0119 pr\u00f3bkowania. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/127fa1296578ba0ba6eac2b44c5c5398.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mamy pg_stat_statements. Jak powiedzia\u0142em, musi on by\u0107 obecny. Mo\u017cemy wzi\u0105\u0107 ka\u017cd\u0105 grup\u0119 zapyta\u0144 i specjalnie j\u0105 opisa\u0107 w pliku. Nast\u0119pnie mo\u017cemy wykorzysta\u0107 bardzo wygodn\u0105 funkcj\u0119 w pgbench \u2013 mo\u017cliwo\u015b\u0107 wprowadzenia kilku plik\u00f3w za pomoc\u0105 opcji \u201e-f\u201d.<\/p>\n<p><\/p>\n<p>Rozumie wiele opcji \u201e-f\u201d. Mo\u017cna te\u017c wskaza\u0107 za pomoc\u0105 \u201e@\u201d na ko\u0144cu, jaka cz\u0119\u015b\u0107 ka\u017cdego pliku powinna by\u0107. Tzn. mo\u017cemy powiedzie\u0107, \u017ce ten plik powinien by\u0107 uruchamiany w 10% przypadk\u00f3w, a ten w 20%. To przybli\u017ca nas do tego, co widzimy na produkcji.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/b91d18a9861abdc36bfda54cd72a142f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A jak zrozumiemy, co mamy na produkcji? Jaka jest proporcja i czego? Tutaj troch\u0119 odchodzimy od tematu. Mamy jeszcze jeden produkt. <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/postgres-ai\/postgres-checkup\">postgres-checkup<\/a><\/noindex>. To te\u017c baza w Open Source. Obecnie aktywnie nad nim pracujemy.<\/p>\n<p><\/p>\n<p>Powsta\u0142 z nieco innych powod\u00f3w. Z powod\u00f3w zwi\u0105zanych z tym, \u017ce monitoring jest niewystarczaj\u0105cy. Tzn. przychodzisz, przygl\u0105dasz si\u0119 bazie, patrzysz na problemy, kt\u00f3re wyst\u0119puj\u0105. I zazwyczaj wykonujesz health_check. Je\u015bli jeste\u015b do\u015bwiadczonym DBA, to wykonujesz health_check. Sprawdzasz wykorzystanie indeks\u00f3w itd. Je\u015bli masz OKmeter, to \u015bwietnie. To wspania\u0142y monitoring dla Postgresa. OKmeter.io \u2013 prosz\u0119, zainstalujcie to, wszystko jest tam bardzo dobrze zrobione. Jest p\u0142atny.<\/p>\n<p><\/p>\n<p>Je\u015bli go nie masz, zazwyczaj masz ma\u0142o informacji. W monitoringu zwykle mamy CPU, IO i to z zastrze\u017ceniami, i tyle. A potrzebujemy wi\u0119cej. Musimy widzie\u0107, jak dzia\u0142a autovakuum, jak dzia\u0142a checkpoint, w przypadku IO musimy oddzieli\u0107 checkpoint od bgwritera i backend\u00f3w itd.<\/p>\n<p><\/p>\n<p>Problem polega na tym, \u017ce gdy pomagasz jakiej\u015b du\u017cej firmie, nie mog\u0105 szybko wdro\u017cy\u0107 czego\u015b. Nie mog\u0105 szybko zakupi\u0107 OKmeter. Mo\u017ce kupi\u0105 to dopiero za p\u00f3\u0142 roku. Nie mog\u0105 szybko zainstalowa\u0107 \u017cadnych pakiet\u00f3w. <\/p>\n<p><\/p>\n<p>I pojawi\u0142 si\u0119 pomys\u0142, \u017ce potrzebujemy specjalnego narz\u0119dzia, kt\u00f3re nie wymaga \u017cadnej instalacji, tzn. nie musisz nic instalowa\u0107 na produkcji. Instalujesz je na swoim laptopie lub na serwerze monitoruj\u0105cym, z kt\u00f3rego b\u0119dziesz uruchamia\u0107. B\u0119dzie analizowa\u0107 wiele rzeczy: zar\u00f3wno system operacyjny, jak i system plik\u00f3w, jak i samego Postgresa, wykonuj\u0105c lekkie zapytania, kt\u00f3re mo\u017cna uruchamia\u0107 bezpo\u015brednio na produkcji i nic si\u0119 nie zawiesi.<\/p>\n<p><\/p>\n<p>Nazwali\u015bmy to Postgres-checkup. Je\u015bli m\u00f3wimy o medycynie, to jest to regularne badanie zdrowia. Je\u015bli o motoryzacji, to \u2013 to jak przegl\u0105d techniczny. Robisz przegl\u0105d co sze\u015b\u0107 miesi\u0119cy lub rok, w zale\u017cno\u015bci od marki. A czy robisz przegl\u0105d swojej bazy? Tzn. czy regularnie wykonujesz dok\u0142adne badania? To jest konieczne. Je\u015bli robisz kopie zapasowe, to r\u00f3b tak\u017ce checkup, to nie mniej wa\u017cne.<\/p>\n<p><\/p>\n<p>Mamy wi\u0119c takie narz\u0119dzie. Zacz\u0119\u0142o si\u0119 rozwija\u0107 intensywnie dopiero trzy miesi\u0105ce temu. Jest jeszcze m\u0142ode, ale ma ju\u017c wiele funkcji.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/514d00b5cb710a7997af0a5dde55b5a8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zbieramy najbardziej \u201ewp\u0142ywowe\u201d grupy zapyta\u0144 \u2013 raport K003 w Postgres-checkup<\/p>\n<p><\/p>\n<p>I tam jest grupa raport\u00f3w K. Na razie s\u0105 trzy raporty. I jest taki raport K003. Tam znajduje si\u0119 szczyt z pg_stat_statements, posortowany wed\u0142ug total_time.<\/p>\n<p><\/p>\n<p>Kiedy sortujemy grupy zapyta\u0144 wed\u0142ug total_time, na szczycie widzimy tak\u0105 grup\u0119, kt\u00f3ra obci\u0105\u017ca nasz system w najwi\u0119kszym stopniu, tzn. zu\u017cywa najwi\u0119cej zasob\u00f3w. Dlaczego nazywam to grupami zapyta\u0144? Poniewa\u017c wyeliminowali\u015bmy parametry. To ju\u017c nie s\u0105 zapytania, a grupy zapyta\u0144, tzn. s\u0105 one zabstractowane.<\/p>\n<p><\/p>\n<p>I je\u015bli b\u0119dziemy optymalizowa\u0107 od g\u00f3ry do do\u0142u, b\u0119dziemy odci\u0105\u017ca\u0107 nasze zasoby i odk\u0142ada\u0107 moment, w kt\u00f3rym b\u0119dziemy musieli dokona\u0107 uaktualnienia. To bardzo dobry spos\u00f3b na zaoszcz\u0119dzenie pieni\u0119dzy.<\/p>\n<p><\/p>\n<p>Mo\u017ce to nie jest najlepszy spos\u00f3b w kontek\u015bcie opieki nad u\u017cytkownikami, poniewa\u017c mo\u017ce nie dostrzegamy rzadkich, ale bardzo przykrych przypadk\u00f3w, gdy kto\u015b czeka\u0142 15 sekund. W sumie s\u0105 one tak rzadkie, \u017ce ich nie widzimy, ale mimo to zajmujemy si\u0119 zasobami.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/d16abc423573e4d923b0c03683c2efee.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Co si\u0119 sta\u0142o w tej tabeli? Zrobili\u015bmy dwa zrzuty. Postgres_checkup zrobi dla ciebie delt\u0119 dla ka\u017cdej metryki: total-time, calls, rows, shared_blks_read itd. Wszystko, delta obliczona. G\u0142\u00f3wnym problemem pg_stat_statements jest to, \u017ce nie pami\u0119ta, kiedy by\u0142 reset. Je\u015bli pg_stat_database pami\u0119ta, to pg_stat_statements nie pami\u0119ta. Widzisz tam liczb\u0119 1 000 000, ale nie wiemy, sk\u0105d to liczono.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/c370bf1237675e03c0a3d362c025ac24.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A tutaj wiemy, mamy dwa zrzuty. Wiemy, \u017ce delta w tym przypadku wynios\u0142a 56 sekund. Bardzo kr\u00f3tki okres. Posortowane po total_time. A dalej mo\u017cemy r\u00f3\u017cnicowa\u0107, tzn. dzielimy wszystkie metryki przez duration. Je\u015bli ka\u017cd\u0105 metryk\u0119 podzielimy przez duration, b\u0119dziemy mieli liczb\u0119 wywo\u0142a\u0144 na sekund\u0119.<\/p>\n<p><\/p>\n<p>Dalej total_time na sekund\u0119 \u2013 to moja ulubiona metryka. Mierzona jest w sekundach, na sekund\u0119, tzn. ile sekund nasz system potrzebowa\u0142 na wykonanie tej grupy zapyta\u0144 na sekund\u0119. Je\u015bli widzisz tam wi\u0119cej ni\u017c jedna sekunda na sekund\u0119, to oznacza, \u017ce potrzebowa\u0142e\u015b wi\u0119cej ni\u017c jednego rdzenia. To bardzo dobra metryka. Mo\u017cesz zrozumie\u0107, \u017ce temu \u201etowarzyszowi\u201d, na przyk\u0142ad, potrzeba minimum trzech rdzeni.<\/p>\n<p><\/p>\n<p>To nasze know-how, czego\u015b takiego nigdzie nie widzia\u0142em. Zauwa\u017c \u2013 to bardzo prosta rzecz \u2013 sekunda na sekund\u0119. Czasami, gdy masz 100 % CPU, to p\u00f3\u0142 godziny na sekund\u0119, tzn. przez p\u00f3\u0142 godziny zajmowa\u0142e\u015b si\u0119 tylko tym zapytaniem. <\/p>\n<p><\/p>\n<p>Nast\u0119pnie widzimy liczby wierszy na sekund\u0119. Wiemy, ile wierszy na sekund\u0119 zosta\u0142o zwr\u00f3conych.<\/p>\n<p><\/p>\n<p>I dalej jest te\u017c ciekawa rzecz. Ile razy odczytali\u015bmy shared_buffers z samego shared_buffers. Uderzenia by\u0142y ju\u017c tam, a wiersze pobrali\u015bmy z pami\u0119ci podr\u0119cznej systemu operacyjnego lub z dysku. Pierwsza opcja jest szybka, a druga mo\u017ce by\u0107 szybka, a mo\u017ce i nie, w zale\u017cno\u015bci od sytuacji. <\/p>\n<p><\/p>\n<p>A drugi spos\u00f3b r\u00f3\u017cnicowania \u2013 dzielimy liczb\u0119 zapyta\u0144 w tej grupie. W drugiej kolumnie zawsze b\u0119dzie jedno zapytanie podzielone przez zapytanie. A nast\u0119pnie interesuj\u0105ce \u2013 ile milisekund zajmowa\u0142o to zapytanie. Wiemy, jak przeci\u0119tnie zachowuje si\u0119 to zapytanie. Ka\u017cde zapytanie trwa\u0142o \u015brednio 101 milisekund. To tradycyjna metryka, kt\u00f3ra jest nam potrzebna do zrozumienia.<\/p>\n<p><\/p>\n<p>Ile wierszy ka\u017cde zapytanie zwr\u00f3ci\u0142o \u015brednio. Widzimy, grupa ta zwraca 8. Ile \u015brednio pobrano i odczytano z pami\u0119ci podr\u0119cznej. Widzimy, \u017ce wszystko jest \u015bwietnie zbuforowane. Same uderzenia dla pierwszej grupy. <\/p>\n<p><\/p>\n<p>A czwarty podtekst w ka\u017cdym wierszu \u2013 to ile procent od og\u00f3lnej liczby. Mamy calls. Na przyk\u0142ad, w 1 000 000. I mo\u017cemy zrozumie\u0107, jaki wk\u0142ad wnosi ta grupa. Widzimy, \u017ce w tym przypadku pierwsza grupa wnosi wk\u0142ad mniejszy ni\u017c 0,01%. To znaczy, \u017ce jest tak wolna, \u017ce nie widzimy jej w og\u00f3lnym obrazie. A druga grupa \u2013 5% w wywo\u0142aniach. To znaczy, 5% ze wszystkich wywo\u0142a\u0144 to druga grupa. <\/p>\n<p><\/p>\n<p>Po total_time r\u00f3wnie\u017c ciekawe. Na pierwsz\u0105 grup\u0119 zapyta\u0144 wydali\u015bmy 14% ca\u0142ego czasu pracy. A na drug\u0105 \u2013 11% itd. <\/p>\n<p><\/p>\n<p>Nie b\u0119d\u0119 wchodzi\u0142 w szczeg\u00f3\u0142y, ale s\u0105 tam niuanse. Wy\u017cej pokazujemy b\u0142\u0105d, poniewa\u017c, gdy por\u00f3wnujemy, zrzuty mog\u0105 si\u0119 zmienia\u0107, to znaczy, niekt\u00f3re zapytania mog\u0105 wypa\u015b\u0107 i w drugim ju\u017c mog\u0105 nie by\u0107 obecne, a inne mog\u0105 si\u0119 pojawi\u0107. I tam obliczamy b\u0142\u0105d. Je\u015bli widzisz 0, to dobrze. To oznacza, \u017ce nie ma b\u0142\u0119d\u00f3w. Je\u015bli wska\u017anik b\u0142\u0119du wynosi do 20%, to jest O.K. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/327bbf167bc21d37a3e1597b52528e6d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nast\u0119pnie wracamy do naszego tematu. Musimy zrealizowa\u0107 obci\u0105\u017cenie robocze. Bierzemy od g\u00f3ry do do\u0142u, a\u017c zbierzemy 80% lub 90%. Zazwyczaj jest to 10-20 grup. I tworzymy pliki do pgbench. Tam u\u017cywamy random. Czasami, niestety, si\u0119 to nie udaje. A w Postgres 12 b\u0119dzie wi\u0119cej mo\u017cliwo\u015bci zastosowania takiego podej\u015bcia. <\/p>\n<p><\/p>\n<p>A nast\u0119pnie w ten spos\u00f3b osi\u0105gamy 80-90% w total_time. Co dalej wpisa\u0107 po \"@\"? Przygl\u0105damy si\u0119 wywo\u0142aniom, patrzymy, ile procent i rozumiemy, \u017ce tutaj powinni\u015bmy mie\u0107 tyle procent. Na podstawie tych procent\u00f3w mo\u017cemy zrozumie\u0107, jak zr\u00f3wnowa\u017cy\u0107 ka\u017cdy z plik\u00f3w. Po tym u\u017cywamy pgbench i zaczynamy pracowa\u0107. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/53edf787f49dcabb5e4731510839332d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mamy te\u017c K001 i K002. <\/p>\n<p><\/p>\n<p>K001 \u2013 to jeden du\u017cy ci\u0105g z czterema podci\u0105gami. To charakterystyka ca\u0142ego naszego obci\u0105\u017cenia. Zobaczcie drug\u0105 kolumn\u0119 i drugi podci\u0105g. Widzimy, \u017ce to oko\u0142o p\u00f3\u0142torej sekundy na sekund\u0119, tzn. je\u015bli b\u0119dzie dwa rdzenie, to b\u0119dzie dobrze. Oko\u0142o 75% obci\u0105\u017cenia. I tak b\u0119dzie to dzia\u0142a\u0107. Je\u015bli b\u0119dziemy mieli 10 rdzeni, to b\u0119dziemy ca\u0142kowicie spokojni. Tak mo\u017cemy ocenia\u0107 zasoby.<\/p>\n<p><\/p>\n<p>K002 \u2013 to, co nazywam klasami zapyta\u0144, tzn. SELECT, INSERT, UPDATE, DELETE. Osobno SELECT FOR UPDATE, poniewa\u017c blokuje. <\/p>\n<p><\/p>\n<p>I tutaj mo\u017cemy wyci\u0105gn\u0105\u0107 wniosek, \u017ce zwyk\u0142e czytaj\u0105ce SELECT \u2013 to 82% wszystkich wywo\u0142a\u0144, ale jednocze\u015bnie \u2013 74% w total_time. Tzn. s\u0105 cz\u0119sto wywo\u0142ywane, ale zu\u017cywaj\u0105 mniej zasob\u00f3w. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/0e0234e696ffe1c80f8b5acccc602dbd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I wracamy do pytania: \"Jak prawid\u0142owo dobra\u0107 shared_buffers?\". Obserwuj\u0119, \u017ce wi\u0119kszo\u015b\u0107 benchmark\u00f3w opiera si\u0119 na idei \u2013 sp\u00f3jrzmy, jaka b\u0119dzie przepustowo\u015b\u0107, tzn. jaka b\u0119dzie zdolno\u015b\u0107 do przetwarzania. Mierzy si\u0119 to zazwyczaj w TPS lub QPS.<\/p>\n<p><\/p>\n<p>I staramy si\u0119 wycisn\u0105\u0107 z maszyny jak najwi\u0119cej transakcji na sekund\u0119 za pomoc\u0105 ustawie\u0144 tuningu. Tutaj mamy dok\u0142adnie 311 na sekund\u0119 dla select.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/d5e73f2672d94bb92eed921ef3dfe0b7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ale nikt nie je\u017adzi do pracy i z powrotem do domu po drodze na pe\u0142nej pr\u0119dko\u015bci. To g\u0142upie. Tak samo z bazami danych. Nie powinni\u015bmy je\u017adzi\u0107 na pe\u0142nej pr\u0119dko\u015bci, nikt tego nie robi. Nikt nie \u017cyje w produkcji, gdzie CPU ma 100%. Cho\u0107 by\u0107 mo\u017ce kto\u015b tak \u017cyje, ale to niezdrowe. <\/p>\n<p><\/p>\n<p>Idea jest taka, \u017ce zazwyczaj je\u017adzimy na oko\u0142o 20% mo\u017cliwo\u015bci, najlepiej nie wi\u0119cej ni\u017c 50%. I staramy si\u0119 optymalizowa\u0107 czas odpowiedzi dla naszych u\u017cytkownik\u00f3w przede wszystkim. Tzn. musimy kr\u0119ci\u0107 naszymi r\u0119kami tak, aby by\u0142o minimalne op\u00f3\u017anienie przy 20% pr\u0119dko\u015bci, umownie. To taka idea, kt\u00f3r\u0105 r\u00f3wnie\u017c staramy si\u0119 wykorzystywa\u0107 w naszych eksperymentach.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/c32c2cfb76dce0ce6b50e929bbf914ac.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I na zako\u0144czenie rekomendacje: <\/p>\n<p><\/p>\n<ul>\n<li>Koniecznie zr\u00f3bcie Database Lab.<\/li>\n<li>Je\u017celi to mo\u017cliwe, zr\u00f3bcie on demand, aby rozwija\u0107 si\u0119 na jaki\u015b czas \u2013 pobawili\u015bcie si\u0119 i usun\u0119li. Je\u017celi macie chmury, to oczywi\u015bcie, tzn. miejcie sporo standing. <\/li>\n<li>B\u0105d\u017acie ciekawi. I je\u015bli co\u015b jest nie tak, sprawdzajcie eksperymentami, jak to dzia\u0142a. Nancy mo\u017cna wykorzysta\u0107 do nauki i sprawdzania, jak dzia\u0142a baza.<\/li>\n<li>Skupcie si\u0119 na minimalnym czasie odpowiedzi. <\/li>\n<li>I nie obawiajcie si\u0119 \u017ar\u00f3de\u0142 Postgres. Gdy pracujecie z kodem \u017ar\u00f3d\u0142owym, musicie zna\u0107 angielski. Jest tam wiele komentarzy, wszystko jest wyja\u015bnione. <\/li>\n<li>I regularnie sprawdzajcie stan bazy, przynajmniej raz na trzy miesi\u0105ce r\u0119cznie lub za pomoc\u0105 Postgres-checkup. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/8d2ac05f44bd245b879799862ce9e233.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pytania<\/p>\n<p><\/p>\n<p><em>Dzi\u0119kuj\u0119 bardzo! Bardzo interesuj\u0105ca sprawa.<\/em> <\/p>\n<p><\/p>\n<p>Dwie rzeczy.<\/p>\n<p><\/p>\n<p><em>Tak, dwie rzeczy. Tylko nie do ko\u0144ca zrozumia\u0142em. Kiedy pracujemy z Nancy, mo\u017cemy regulowa\u0107 tylko jeden parametr czy ca\u0142\u0105 grup\u0119?<\/em><\/p>\n<p><\/p>\n<p>Mamy parametr delta-configuration. Mo\u017cecie tam regulowa\u0107 tyle, ile chcecie. Ale musicie rozumie\u0107, \u017ce gdy zmieniacie wiele rzeczy, mo\u017cecie wyci\u0105ga\u0107 b\u0142\u0119dne wnioski. <\/p>\n<p><\/p>\n<p><em>Tak. Dlaczego pytam? Poniewa\u017c trudno przeprowadza\u0107 eksperymenty, gdy masz tylko jeden parametr. Regulujesz go, patrzysz, jak dzia\u0142a. Ustawiasz go. Potem zaczynasz od nast\u0119pnego.<\/em><\/p>\n<p><\/p>\n<p>Mo\u017cna regulowa\u0107 jednocze\u015bnie, ale to oczywi\u015bcie zale\u017cy od sytuacji. Lepiej jednak sprawdza\u0107 jedn\u0105 ide\u0119. Wczoraj mieli\u015bmy pomys\u0142. Mieli\u015bmy bardzo podobn\u0105 sytuacj\u0119. By\u0142y dwa configi. I nie mogli\u015bmy zrozumie\u0107, dlaczego by\u0142a taka du\u017ca r\u00f3\u017cnica. Pojawi\u0142 si\u0119 pomys\u0142, \u017ce trzeba zastosowa\u0107 dychotomi\u0119, aby stopniowo zrozumie\u0107 i znale\u017a\u0107 r\u00f3\u017cnic\u0119. Mo\u017cna od razu ustawi\u0107 po\u0142ow\u0119 parametr\u00f3w na identyczne, potem \u0107wier\u0107 itd. Wszystko elastyczne.<\/p>\n<p><\/p>\n<p><em>I mam jeszcze pytanie. Projekt jest m\u0142ody, rozwija si\u0119. Czy dokumentacja ju\u017c jest gotowa, jest szczeg\u00f3\u0142owy opis?<\/em><\/p>\n<p><\/p>\n<p>Tam specjalnie doda\u0142em link do opisu parametr\u00f3w. To istnieje. Ale wiele rzeczy wci\u0105\u017c brakuje. Szukam ludzi my\u015bl\u0105cych podobnie. I odnajduj\u0119 ich, kiedy wyst\u0119puj\u0119. To jest super. Kto\u015b ju\u017c ze mn\u0105 pracuje, kto\u015b pom\u00f3g\u0142 i co\u015b zrobi\u0142. Je\u015bli interesuje Was ten temat, dajcie zna\u0107 \u2013 co jest potrzebne. <\/p>\n<p><\/p>\n<p><em>Kiedy zrobimy laboratorium, mo\u017ce pojawi\u0105 si\u0119 opinie. Zobaczymy. Dzi\u0119kuj\u0119!<\/em><\/p>\n<p><\/p>\n<p><em>Witam! Dzi\u0119kuj\u0119 za wyst\u0105pienie! Zauwa\u017cy\u0142em, \u017ce jest wsparcie dla Amazona. Czy planowane jest wsparcie dla GSP?<\/em><\/p>\n<p><\/p>\n<p>Dobre pytanie. Rozpocz\u0119li\u015bmy prac\u0119 nad tym. Na razie to zatrzymali\u015bmy, poniewa\u017c chcemy oszcz\u0119dza\u0107. Tzn. jest wsparcie za pomoc\u0105 run on localhost. Mo\u017cesz samodzielnie stworzy\u0107 instancj\u0119 i pracowa\u0107 lokalnie. Swoj\u0105 drog\u0105, tak robimy. W Getlab tak dzia\u0142am, tam na GSP. Ale nie widzimy sensu w takiej orkiestracji, poniewa\u017c Google nie ma tanich spot\u00f3w. Tam s\u0105 ??? instancje, ale maj\u0105 ograniczenia. Po pierwsze, zawsze maj\u0105 tylko 70% zni\u017cki i nie mo\u017cna bawi\u0107 si\u0119 cen\u0105. Spoty podnosimy o 5-10% ceny, aby zmniejszy\u0107 ryzyko, \u017ce ci\u0119 ukarz\u0105. Tzn. na spotach oszcz\u0119dzasz, ale mog\u0105 ci je w ka\u017cdej chwili odebra\u0107. Je\u015bli ustalasz cen\u0119 troch\u0119 wy\u017csz\u0105 ni\u017c u innych, p\u00f3\u017aniej zostaniesz zabity. W Google jest zupe\u0142nie inna specyfika. I jest jeszcze jedno bardzo niekorzystne ograniczenie \u2013 dzia\u0142aj\u0105 tylko przez 24 godziny. A czasami chcemy przeprowadza\u0107 eksperyment przez 5 dni. Ale na spotach mo\u017cna to robi\u0107, spoty czasami \u017cyj\u0105 przez miesi\u0105ce. <\/p>\n<p><\/p>\n<p><em>Witaj! Dzi\u0119kuj\u0119 za prezentacj\u0119! Wspomnia\u0142e\u015b o checkupie. Jak obliczasz b\u0142\u0119dy stat_statements?<\/em><\/p>\n<p><\/p>\n<p>Bardzo dobre pytanie. Mog\u0119 to dok\u0142adnie pokaza\u0107 i wyja\u015bni\u0107. Kr\u00f3tko \u2013 sprawdzamy, jak zmieni\u0142 si\u0119 zestaw grup zapyta\u0144: ile zosta\u0142o z nich usuni\u0119tych i ile nowych si\u0119 pojawi\u0142o. Nast\u0119pnie przygl\u0105damy si\u0119 dw\u00f3m metrykom: total_time i calls, dlatego s\u0105 tam dwie b\u0142\u0119dy. I patrzymy, jaki wk\u0142ad maj\u0105 zmieniaj\u0105ce si\u0119 grupy. S\u0105 tam dwie podgrupy: te, kt\u00f3re odesz\u0142y i te, kt\u00f3re przyby\u0142y. Sprawdzamy, jaki maj\u0105 wk\u0142ad w ca\u0142o\u015b\u0107. <\/p>\n<p><\/p>\n<p><em>Czy nie obawiasz si\u0119, \u017ce ona obr\u00f3ci si\u0119 tam dwa lub trzy razy w czasie mi\u0119dzy snapshotami?<\/em><\/p>\n<p><\/p>\n<p>Tzn. zarejestrowali si\u0119 ponownie czy jak?<\/p>\n<p><\/p>\n<p><em>Na przyk\u0142ad, to zapytanie raz ju\u017c zosta\u0142o wypchni\u0119te, potem zn\u00f3w nadesz\u0142o i ponownie zosta\u0142o wypchni\u0119te, a nast\u0119pnie jeszcze raz nadesz\u0142o i ponownie zosta\u0142o wypchni\u0119te. I ty tu co\u015b policzy\u0142e\u015b, a gdzie to wszystko?<\/em><\/p>\n<p><\/p>\n<p>Dobre pytanie, trzeba si\u0119 temu przyjrze\u0107. <\/p>\n<p><\/p>\n<p><em>Zrobi\u0142em co\u015b podobnego. Oczywi\u015bcie, zrobi\u0142em to sam. Ale musia\u0142em zresetowa\u0107 stat_statements i orientowa\u0107 si\u0119 w momencie snapshotu, \u017ce tam jest mniej okre\u015blonej cz\u0119\u015bci, \u017ce i tak nie dotar\u0142o do sufitu, ile stat_statements mo\u017ce si\u0119 zebra\u0107. I orientuj\u0119 si\u0119, \u017ce prawdopodobnie nic nie zosta\u0142o wypchni\u0119te.<\/em> <\/p>\n<p><\/p>\n<p>Tak, tak. <\/p>\n<p><\/p>\n<p><em>Ale nie rozumiem, jak mo\u017cna to zrobi\u0107 inaczej wiarygodnie.<\/em><\/p>\n<p><\/p>\n<p>Niestety, dok\u0142adnie nie pami\u0119tam \u2013 czy u\u017cywamy tam tekstu zapytania czy queryid z pg_stat_statements i na tym si\u0119 opieramy. Je\u015bli opieramy si\u0119 na queryid, to teoretycznie por\u00f3wnujemy por\u00f3wnywalne rzeczy. <\/p>\n<p><\/p>\n<p><em>Nie, mo\u017ce on by\u0107 usuni\u0119ty kilka razy mi\u0119dzy snapshotami i wr\u00f3ci\u0107 ponownie.<\/em><\/p>\n<p><\/p>\n<p>Z tym samym id?<\/p>\n<p><\/p>\n<p><em>Tak.<\/em> <\/p>\n<p><\/p>\n<p>Przyjrzymy si\u0119 temu. Dobre pytanie. Musimy to zbada\u0107. Ale na razie to, co widzimy, to po prostu 0...<\/p>\n<p><\/p>\n<p><em>To oczywi\u015bcie rzadki przypadek, ale by\u0142em zszokowany, gdy dowiedzia\u0142em si\u0119, \u017ce stat_statements mo\u017ce by\u0107 usuni\u0119ty.<\/em> <\/p>\n<p><\/p>\n<p>W Pg_stat_statements mo\u017ce by\u0107 du\u017co rzeczy. Spotkali\u015bmy si\u0119 z tym, \u017ce je\u015bli masz track_utility = on, to zestawy r\u00f3wnie\u017c s\u0105 \u015bledzone. <\/p>\n<p><\/p>\n<p><em>Tak, oczywi\u015bcie.<\/em><\/p>\n<p><\/p>\n<p>I je\u015bli masz losowy Java Hibernate, to tam zaczyna si\u0119 blokowa\u0107 tabela haszowa. I jak tylko wy\u0142\u0105czysz bardzo obci\u0105\u017con\u0105 aplikacj\u0119, masz 50-100 grup. I wszystko jest mniej wi\u0119cej stabilne. Jednym ze sposob\u00f3w walki z tym jest zwi\u0119kszenie pg_stat_statements.max. <\/p>\n<p><\/p>\n<p><em>Tak, ale musisz wiedzie\u0107, o ile. I musisz jako\u015b to monitorowa\u0107. Tak w\u0142a\u015bnie robi\u0119. Tzn. mam pg_stat_statements.max. I patrz\u0119, \u017ce w momencie snapshotu nie osi\u0105gn\u0105\u0142em 70%. Dobrze, wi\u0119c nic nie stracili\u015bmy. Robimy reset. I zbieramy ponownie. Je\u015bli w nast\u0119pnym snapshotie jest mniej ni\u017c 70, to prawdopodobnie znowu nic nie stracili\u015bmy.<\/em><\/p>\n<p><\/p>\n<p>Tak. Domy\u015blnie teraz 5000. I dla wielu os\u00f3b to wystarcza. <\/p>\n<p><\/p>\n<p><em>Zazwyczaj \u2013 tak.<\/em> <\/p>\n<p><\/p>\n<p>Wideo:<\/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=\"Odtwarzaj wideo\" 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. Dodam, \u017ce je\u015bli w Postgresie znajduj\u0105 si\u0119 dane poufne, kt\u00f3re nie mog\u0105 trafi\u0107 do \u015brodowiska testowego, mo\u017cna skorzysta\u0107 z <noindex><a rel=\"nofollow\" href=\"https:\/\/labs.dalibo.com\/postgresql_anonymizer\">PostgreSQL Anonymizer<\/a><\/noindex>. Schemat jest mniej wi\u0119cej taki:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych&quot;. Nikolaj Samochwa\u0142ow\" src=\"\/wp-content\/uploads\/2020\/04\/cf9a2052364e09a20e68d2347dd0c25b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u0179r\u00f3d\u0142o: <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.1.1 - 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\/pl\/blog\/administrirovanie\/promyshlennyj-podhod-k-tyuningu-postgresql-eksperimenty-nad-bazami-dannyh-nikolaj-samohvalov\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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\udd47Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych\u00bb. Nikolaj Samochwa\u0142ow | ProHoster","description":"Zach\u0119cam do zapoznania si\u0119 z transkrypcj\u0105 wyk\u0142adu Nikolaja Samochwa\u0142owa \"Przemys\u0142owe podej\u015bcie do strojenia PostgreSQL: eksperymenty z bazami danych\" Shared_buffers = 25% \u2013 to du\u017co czy ma\u0142o?","canonical_url":"https:\/\/prohoster.info\/pl\/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":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/78742","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=78742"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/78742\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/78743"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=78742"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=78742"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=78742"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}