Olen valmis tutvustama Nikolai Samohvalovi ettekande "Tööstuslik lÀhenemine PostgreSQL tuunimisele: katsetused andmebaasidega" kokkuvÔtet.
Shared_buffers = 25% â kas see on palju vĂ”i vĂ€he? VĂ”i just paras? Kuidas mĂ”ista, kas see â pigem vananenud â soovitus sobib teie konkreetsesse olukorda?
NĂŒĂŒd on aeg lĂ€heneda postgresql.conf parameetrite seadmiseks "tĂ€iskasvanulikult". Mitte pime "autotuunimine" vĂ”i vanad soovitused artikkelidest ja blogidest, vaid pĂ”hinevalt:
- rangelt mÔÔdetud katsetele andmebaasidel, teostatud automatiseeritult, suuremahulistes kogustes ja tingimustes, mis on vÔimalikult lÀhedased "lahinguoludele",
- sĂŒgavale arusaamale andmebaasisĂŒsteemi ja operatsioonisĂŒsteemi töö eripĂ€radest.
Kasutades Nancy CLI (), vaatleme konkreetset nĂ€idet â sĂ”davargad shared_buffers â erinevates olukordades, erinevates projektides ja pĂŒĂŒame vĂ€lja selgitada, kuidas leida meie infrastruktuuri, andmebaasi ja koormuse jaoks optimaalne seadistus.

RÀÀgime katsetustest andmebaasidega. See on lugu, mis on kestnud ĂŒle kuue kuu.

Natuke minust. Kogemus postgresega on juba ĂŒle 14 aasta. Olen loonud mitmeid sotsiaalvĂ”rgustikku kuuluvaid ettevĂ”tteid. Igas neist on kasutatud ja kasutatakse postgressi.
Samuti on RuPostgres grupp Meetup'is, saavutades 2. koha maailmas. JÔuame aeglaselt 2000 inimeseni. RuPostgres.org.
Ja erinevate konverentside ĐĐ, sealhulgas Highload, vastutan andmebaaside eest, eelkĂ”ige Postgresi eest alates selle loomisest.

Viimastel aastatel olen taas alustanud oma Postgresi konsultatsiooni praktikat 11 ajavööndis siit.

Ja kui ma seda paar aastat tagasi tegin, olin ma teinud natuke pausi aktiivsest kĂ€sitsi töö tegemisest Postgresiga, ilmselt alates 2010. aastast. Olin ĂŒllatunud, kui vĂ€he on DBA tööde igapĂ€evaselt muutunud, kui palju kĂ€sitsi ĂŒtlemist on endiselt vajalik. Ja ma mĂ”tlesin kohe, et siit on midagi valesti, vajame rohkem automatiseerimist.
Kuna kÔik toimus eemal, olid enamik kliente pilvemaailmas. Ja palju on juba silmaga nÀhtavalt automatiseeritud. Sellest rÀÀgin veidi hiljem. T. e. kÔik see tÔi mind ideeni, et peaks olema rida tööriistu, st mitte mingi platvorm, mis automatiseerib praktiliselt kÔik DBA tegevused, et saaks hallata suurt hulka andmebaase.

Selles ettekandes ei tule olema:
- âHĂ”bedasi kuulikesiâ ja vĂ€iteid nagu â seadke 8 GB vĂ”i 25 % shared_buffers, ja kĂ”ik on hĂ€sti. Shared_buffersist ei tule palju juttu.
- Hulku "sĂŒgavamaid kihte".

Mis juhtub?
- On olemas optimeerimisprintsiibid, mida me rakendame ja arendame. Olemas on ideed, mis meie teel tekkivad, ja erinevad tööriistad, mille me enamikul juhtudel loome avatud allika (Open Source) pĂ”himĂ”tetel. Lisaks sellele on meie pileti sĂŒsteem ja praktiliselt kogu suhtlus avatud allikas. Saate jĂ€lgida, mida me praegu teeme, milline on jĂ€rgmine versioon jne.
- Samuti jagame kogemusi nende printsiipide ja tööriistade kasutamisest erinevates ettevÔtetes: alates vÀikestest idufirmadest kuni suurte organisatsioonideni.

Kuidas see kÔik areneb?

Esiteks, DBA peamine ĂŒlesanne, peale instantside loomise ja varukoopiate haldamise, on kitsaskohade otsimine ja jĂ”udluse optimeerimine.

Praegu nĂ€eb see vĂ€lja nii. Me jĂ€lgime statistikat, nĂ€eme teatud asju, kuid meil puuduvad mĂ”ned detailid. Alustame sĂŒvitsi uurimist, tavaliselt kĂ€sitsi, ja mĂ”istame, mida sellega edasi teha.

Ja on kaks lĂ€henemist. Pg_stat_statements â standardlahendus aeglaste pĂ€ringute tuvastamiseks. Ja Postgresse logide analĂŒĂŒs pgBadgeri abil.
Igal lÀhenemisel on tÔsised puudused. Esimese lÀhenemisega viskame vÀlja kÔik parameetrid. Ja kui me nÀeme gruppe SELECT * FROM table where veerg on vÔrdne mÀrgiga «?» vÔi «$» alates Postgres 10 versioonist. Me ei tea, kas tegemist on index scan'i vÔi seq scan'iga. See sÔltub suuresti parameetrist. Kui sisestataks harva esinev vÀÀrtus, toimub index scan. Kui sisestataks vÀÀrtus, mis hÔlmab 90% tabelist, toimub ilmselt seq scan, sest Postgres teab statistikat. See on suur puudus pg_stat_statements, kuigi mingid tööd on kÀimas.
LogianalĂŒĂŒsides on peamine puudus see, et te ei saa endale lubada «log_min_duration_statement = 0», nagu tavaliselt. Ja sellest rÀÀgime ka. Seega ei nĂ€e te kogu pilti. Ja mingi pĂ€ring, mis on vĂ€ga kiire, vĂ”ib tarbida tohutult ressursse, kuid te ei nĂ€e seda, sest see jÀÀb teie lĂ€vendist madalamale.
Kuidas DBA-d lahendavad leitud probleeme?

NĂ€iteks leidsime mingi probleemi. Mida tavaliselt tehakse? Kui olete arendaja, siis teete midagi mĂ”nes instance'is, mis ei ole sellise suurusega. Kui olete DBA, siis on teil staging. Ja see vĂ”ib olla ainult ĂŒks. Ja see on olnud pool aastat maas. Ja te mĂ”tleksite, et lĂ€hete productioni. Ja isegi kogenud DBA-d kontrollivad hiljem productionis, koopia peal. Ja juhtuvad juhtumid, kus luuakse ajutine indeks, veendutakse, et see aitab, kustutatakse see ja antakse arendajatele, et nad saaksid selle migreerimisfailidesse lisada. Nii et selline jama toimub praegu. Ja see on probleem.

- Konfigureerimist timmida.
- Indeksite kogumit optimeerida.
- Muutke SQL-pÀringut (see on kÔige keerulisem meetod).
- Lisage ressursse (keb kÔige lihtsam meetod enamikul juhtudel).

Nende asjadega on palju. Postgresis on palju nuppe. Tuleb palju teada. Postgresis on palju indekseid, tÀnu ka sellele konverentsi korraldajatele. Ja kÔike seda tuleb teada, ja just see tekitab mitte DBA-de seas tunde, et DBA-d tegelevad musta maagia ja asjadega. See tÀhendab, et tuleb umbes 10 aastat tegeleda, et hakata seda tÔeliselt mÔistma.
Ja olen selle musta maagia vastu. Soovin, et kÔik oleks tehnoloogial, mitte intuitsioonil.
Elulised nÀited

Olen seda nĂ€inud vĂ€hemalt kahes projektis, sealhulgas oma omas. JĂ€rjekordne blogipostitus ĂŒtleb meile, et vÀÀrtus 1 000 default_statistict_target jaoks on hea. Hea, proovime seda tootmises.

Ja nĂŒĂŒd, kasutades oma tööriista kaks aastat hiljem ning tehes katseid andmebaasidega, millest tĂ€na rÀÀgime, saame vĂ”rrelda, mis oli ja mis on muutunud.

Ja selleks peame looma eksperimendi. See koosneb neljast osast.
- Esimene on keskkond. Meil on vaja riistvara. Ja kui ma tulen mĂ”nda ettevĂ”ttesse ja sĂ”lmime lepingu, siis ĂŒtlen, et nad annaksid mulle sama riistvara nagu tootmises. Iga teie Meister jaoks vajame vĂ€hemalt ĂŒhte sellist riistvara. Olgu see virtuaalne masin Amazonis vĂ”i Googleâis, vĂ”i mul on just selline riistvara vajalik. TĂ”epoolest, soovin keskkonda taastada. Keskkonna mĂ”istesse kuulub ka Postgressi pĂ”hiversioon.
- Teine osa on meie teadusuuringute objekt. See on andmebaas. Selle saab luua mitmel viisil. NĂ€itan, kuidas.
- Kolmas osa on koormus. See on kÔige keerulisem hetk.
- Ja neljas osa on see, mida me kontrollime, st millega me vĂ”rreldes töötame. Oletame, et saame konfiguratsioonis muuta ĂŒhte vĂ”i mitut parameetrit, vĂ”i saame luua indeksi jne.

Me alustame eksperimenti. Siin on pg_stat_statements. Vasakul on see, mis oli. Paremal on see, mis on nĂŒĂŒd.

Vasakul default_statistics_target = 100, paremal = 1 000. Me nĂ€eme, et see aitas meid. Ăldiselt on kĂ”ik 8 % paremaks muutunud.

Kuid kui me scrollime allapoole, siis seal on pgBadger vĂ”i pg_stat_statements-i pĂ€ringugrupid. Siin on kaks varianti. Me nĂ€eme, et mĂ”ni pĂ€ring on langenud 88 %. Ja siin tuleb inseneri lĂ€henemine. Saame sĂŒgavamale kaevuda, sest on huvitav, miks see langes. Tuleb mĂ”ista, mis statistika oli. Miks suuremad buketid statistikas toovad halvemad tulemused.

VÔi me ei kaevu, vaid teeme 'ALTER TABLE ⊠ALTER COLUMN' ja toome tagasi 100 buketti selle veeru statistikas. Ja edasi saame veel eksperimendi kÀigus veenduda, et see lahendus aitas. KÔik. See on inseneri lÀhenemine, mis aitab meil nÀha pilti ja teha otsuseid andmete, mitte intuitsiooni pÔhjal.


MĂ”ned nĂ€ited teistest valdkondadest. Testides on CI-testid olnud juba aastaid. Ăkski projekt ei suuda enam mĂ”istlikult eksisteerida ilma automaatsete testideta.

Teistes tööstusharudes: lennunduses, autotööstuses, kui testime aerodĂŒnaamikat, on meil ka vĂ”imalus eksperimente teha. Me ei hakka kohe jooniste jĂ€rgi midagi kosmosesse saatma ega tooma autot kohe teele. NĂ€iteks on olemas aerodĂŒnaamiline tunnel.
Teiste valdkondade vaatluste pÔhjal saame teha jÀreldusi.

Esiteks, meil on spetsiaalne keskkond. See on tootmisprotsessile lĂ€hedane, kuid mitte tĂ€iesti sama. Selle peamine omadus on, et see peaks olema odav, korduv ja vĂ”imalikult automatiseeritud. Lisaks peavad olema erivahendid detailseks analĂŒĂŒsiks.
TĂ”enĂ€oliselt, kui me lennuki kĂ€ivitame ja lendame, on meil vĂ€hem vĂ”imalusi uurida iga millimeetrit tiiva pinnast kui aerodĂŒnaamilises tunnelis. Meil on rohkem vahendeid diagnostikaks. Saame endale lubada rohkem kĂ”ike rasket, mida me ei saa lennuki Ă”hus olles kaasas kanda. Sama kehtib ka Postgresi puhul. Me saame mĂ”nes olukorras katsetuse kĂ€igus aktiveerida otsese pĂ€ringute logimise. Ja me ei soovi seda tootmises teha. VĂ”ib-olla aktiveerime selle plaanide puhul auto_explaini kaudu.
Ja nagu ma juba ĂŒtlesin, kĂ”rge automatiseerituse tase tĂ€hendab, et me vajutasime nuppu ja kordasime. Nii peab see olema, et katsetusi oleks palju ja et see oleks pidev protsess.
Nancy CLI â andmebaasikatsetuste alussamm.

Ja nii me sellise asja tegime. T. e. ma rÀÀkisin nendest ideedest juunis, peaaegu aasta tagasi. Ja meil on juba Open Source'is nii nimetatud Nancy CLI. See on alus andmebaasalaste laborite ehitamiseks.

- See on Open Source'is, Gitlabis. VÔite vaadata, vÔite proovida. Olen slaidides lingi jÀtnud. Saate sellele klikkida ja seal ongi. kÔigi parameetrite kohta.
Muidugi, seal on veel palju arendustööd. Ideid on palju. Kuid see, mida me juba praktiliselt igapĂ€evaselt kasutame, on juba olemas. Ja kui meil tekib mĂ”te â mis juhtub, kui kustutame 40 000 000 rida, kui kĂ”ik takerdub IO-sse, siis saame katsetada ja vaadata lĂ€hemalt, et mĂ”ista, mis toimub, ning seejĂ€rel proovida seda jooksvalt parandada. Ehk teeme katse. NĂ€iteks kohandame midagi ja vaatame, mis lĂ”pptulemus on. Ja seda me teeme mitte produktsioonis. See on idee sisu.

Kus see vÔiks töötada? See vÔib töötada kohalikult, st seda saab teha kuskil, isegi MacBookil. Vajalik on Docker, lÀhme. Ja kÔik. Saame kÀivitada mingisuguses instance'is riistvara peal vÔi virtuaalkeskkonnas, kus iganes.
Ja on ka vĂ”imalus kaugjuhtida Amazonis EC2 instantsul, spottides. See on vĂ€ga hea vĂ”imalus. NĂ€iteks tegime eile rohkem kui 500 katset i3 instantsil, alustades kĂ”ige vĂ€iksemast ja lĂ”petades i3-16-xlarge'iga. Ja need 500 katset maksid meile 64 dollarit. IgaĂŒhe kestus oli 15 minutit. Seega, tĂ€nu sellele, et kasutatakse spotte, on see vĂ€ga odav â 70% allahindlus, Amazon peab tasu sekundite kaupa. Saate teha palju. Saate teha tĂ”elist uurimistööd.

Ja kolm peamist Postgresi versiooni on toetatud. Pole nii keeruline viia ellu mÔnda vana ja ka uut 12. versiooni.

Objekti saame mÀÀrata kolme viisi. Need on:
- Dump/sql-fail.
- Peamine viis on PGDATA katalooge kloonida. Ăldjuhul vĂ”etakse see varundusserverist. Kui teil on normaalsed binaarsed varukoopiad, saate sealt kloone teha. Kui teil on pilveteenused, siis hoolitseb selle eest teie eest pilveteenus nagu Amazon ja Google. See on kĂ”ige olulisem viis tĂ”elise tootmisprotsessi kloonide jaoks. Me just selle meetodi kaudu kĂ€ivitame.
- Ja viimane meetod sobib teaduslikeks uuringuteks, kui on soov aru saada, kuidas Postgres mingit funktsiooni töötab. See on pgbench. Sa saad genereerida pgbenchiga. See on lihtsalt ĂŒks valik «db-pgbench». Sa ĂŒtled, milline on skaala. Ja kĂ”ik genereeritakse pilves, nagu on öeldud.

Ja koormus:
- Koormust saame tĂ€ita ĂŒhes SQL voos. See on kĂ”ige primitiivsem meetod.
- VÔi vÔime koormust emuleerida. Ja me saame emuleerida seda eelkÔige jÀrgmiselt. Me peame koguma kÔik logid. Ja see on valus. Ma nÀitan, miks. Ja pgreplay abil, mis on integreeritud Nancy'sse, esitame need.
- VĂ”i teine variant. Nii öeldud kĂ€sitöökoormus, mida me teeme teatud pingutusega. AnalĂŒĂŒsides meie praegust koormust tootmissĂŒsteemis, tĂ”mbame vĂ€lja kĂ”ige olulisemad pĂ€ringugrupid. Ja pgbench abil saame emuleerida seda koormust laboris.

- VĂ”i peame tĂ€itma mĂ”ne SQL pĂ€ringu, st kontrollime mingit migratsiooni, loome indeksi, teeme ANALYZE. Ja vaatame, mis oli enne ja pĂ€rast vaakumit. ĂhesĂ”naga, ĂŒkskĂ”ik milline SQL.
- VĂ”i muudame konfiguratsioonis ĂŒhte vĂ”i mitut parameetrit. Saame paluda, et kontrollitaks nĂ€iteks 100 vÀÀrtust Amazonis meie terabaidi andmebaasi jaoks. Ja mĂ”ne tunni pĂ€rast on teil tulemus. TĂŒĂŒpiliselt kulub terabaidi andmebaasi kĂ€ivitamiseks mitmeid tunde. Kuid arenduses on meil patch, mille kaudu on vĂ”imalik seeria, st saate jĂ€rjestikuselt samal serveril sama pgdata kasutada ja testida. Postgres restardib, vahemĂ€lu tĂŒhjendatakse. Ja saate koormust testida.

- Saabub kataloog, kus on palju erinevaid faile, alustades pg snapshottidest.stat***. Ja seal on kĂ”ige huvitavam â pg_stat_statements ja pg_stat_kcacke. Need on kaks laiendust, mis analĂŒĂŒsivad pĂ€ringute tegemist. Ja pg_stat_bgwriter sisaldab mitte ainult pgwriteri statistikat, vaid ka checkpoint'i statistikat ja teavet selle kohta, kuidas taustprotsessid puhtaid puhvrisid nimetavad. Seda kĂ”ike on huvitav uurida. NĂ€iteks, kui seadistame shared_buffers, siis on vĂ€ga huvitav vaadata, kui palju seal kedagi vĂ€lja tĂ”rjutakse.
- Saabuvad ka Postgresi logid. Kaks logi â ettevalmistuslogi ja koormuse mĂ€ngimise logi.
- Suhteliselt uus funktsioon â FlameGraphs.
- Kui olete kasutanud pgreplay vÔi pgbench koormuse simuleerimise valikuid, siis on see nende loomulik vÀljund. NÀete latency ja TPS-i. Saate aru, kuidas nad seda nÀgid.
- SĂŒsteemi teave.
- PĂ”hijĂ”udluse ja IO kontrollid. See on rohkem mĂ”eldud EC2 instantside jaoks Amazoni teenuses, kui soovite voolus kĂ€ivitada 100 identset instantsi ja seal lĂ€bi viia 100 erinevat testimist, siis on teil 10 000 eksperimenti. Peate veenduma, et te ei saa vigast instantsi, keda keegi teine juba piirab. Sellel riistvaral tegutsevad teised kasutajad ning teile jÀÀb vĂ€he ressursse. Sellised tulemused oleks parem kĂ”rvaldada. Ja just Alexey Kopytovi sysbenchi abil teeme mĂ”ned lĂŒhikesed kontrollid, mida saab hiljem vĂ”rrelda teistega, st saate aru, kuidas CPU ja IO end kĂ€itavad.

Millised on tehnilised raskused erinevate ettevÔtete nÀitel?

Oletame, et soovime reaalset koormust logide abil korrata. SuurepÀrane idee, kui see on kirjutatud Open Source pgreplay'i abil. Kasutame seda. Kuid et see korralikult töötaks, peate lubama tÀieliku pÀringute logimise koos parameetrite ja ajastusega.
Seal on mĂ”ned raskused seoses duration ja timestampiga. Me jĂ€tame selle teema kĂ”rvale. Peamine kĂŒsimus on â kas te saate endale seda lubada vĂ”i mitte?

Probleem on selles, et see vÔib olla kergesti kÀttesaamatu. Te peate enne kÔike mÔistma, milline voog logisse kirjutatakse. Kui teil on pg_stat_statements, saate sellise pÀringuga (link on slaididel olemas) aru saada, kui palju baite kirjutatakse sekundis.
Me vaatame pÀringu pikkust. Me ignoreerime, et seal ei ole parameetreid, kuid me teame pÀringu pikkust ja teame, mitu korda sekundis see tÀidetakse. Nii saame hinnata, kui palju baite sekundis kirjutatakse. Me vÔime eksida kahes kahekordse vÔrra, kuid mÀÀrame tÀpselt selle jÀrjekorra.
Me nĂ€eme, et 802 korda sekundis seda pĂ€ringut tĂ€idetakse. Ja me nĂ€eme, et bytes_per sec â 300 kB/s kirjutatakse pluss miinus. Ja tavaliselt suudame sellist voogu endale lubada.

Aga! Asi on selles, et on erinevaid logimissĂŒsteeme. Ja vaikimisi on inimestel tavaliselt "syslog".

Ja kui teil on syslog, siis vĂ”ib teil olla selline pilt. Me vĂ”tame pgbench'i, lĂŒlitame sisse pĂ€ringute logimise ja vaatame, mis juhtub.

Ilma logimiseta on see vasakul kĂŒlg. Me saavutasime 161 000 TPS. Syslogiga â Ubuntu 16.04 Amazonis saavutasime 37 000 TPS. Ja kui me muudame kahel muul moel logimist, on olukord oluliselt parem. Ehkki me ootasime, et see vĂ€heneb, ei olnuks see siiski nii drastiline.

Ja CentOS 7 puhul, kus osaleb ka journald, muutes logid binaarsesse formaati mugavaks otsimiseks jne, on olukord isegi hullem, TPS kukub 44 korda.

Ja see on see, millega inimesed elavad. Ja sageli on ettevÔtetes, eriti suurtes, seda vÀga raske muuta. Kui saate syslogist lahkuda, siis lahkuge sellest kindlasti.

- Hinnake IOPS-i ja kirjutusvoogu.
- Kontrollige oma sĂŒsteemi logimist.
- Kui prognoositav koormus on liiga suur, kaaluge proovide vÔtmise vÔimalust.

Meil on pg_stat_statements. Nagu ma ĂŒtlesin, peab see kindlasti olemas olema. Ja me saame iga pĂ€ringugrupi spetsiaalselt failis kirjeldada. SeejĂ€rel saame kasutada pgbenchis vĂ€ga mugavat funktsiooni â vĂ”imalust sisestada mitu faili valiku â-fâ kaudu.
Ta mĂ”istab palju «-f». Ja saab öelda «@» lĂ”pus, milline osa igast failist peaks olema. St me saame öelda, et nĂŒĂŒd teosta seda 10% juhtudest, ja seda 20%. Ja see tuletab meid lĂ€hemale sellele, mida me nĂ€eme tootmises.

Kuidas me saame aru, mis meil tootmises on? Milline osa ja mis? Siin on natuke kĂ”rvalekaldumine. Meil on veel ĂŒks toode. . Samuti on see pĂ”hineb Open Source'il. Ja me arendame seda aktiivselt praegu.
See sĂŒndis veidi muudel pĂ”hjustel. PĂ”hjustel, et jĂ€lgimine on ebapiisav. St sa tuled, vaatad baasi, vaatad probleeme, mis on. Ja tavaliselt teed health_checkâi. Kui oled kogenud DBA, siis teed health_checkâi. Vaatasid indeksite kasutust jne. Kui sul on OKmeter, siis on kĂ”ik suurepĂ€rane. See on suurepĂ€rane jĂ€lgimine Postgresâi jaoks. OKmeter.io â palun installige see, seal on kĂ”ik vĂ€ga hĂ€sti tehtud. See on tasuline.
Kui sul seda ei ole, siis tavaliselt sul pole palju, mida on. JĂ€lgimises on tavaliselt olemas CPU, IO ja seda ka tingimustega, ja kĂ”ik. Aga meil on vaja rohkem. Me peame nĂ€gema, kuidas töötab automaatne vakuum, kuidas töötab kontrollpunkt, IO-s peame eraldama kontrollpunkti bgwriterâist ja taustprotsessidest jne.
Probleem on see, et kui sa aitad mÔnda suurt ettevÔtet, ei saa nad midagi kiiresti rakendada. Nad ei saa kiiresti osta OKmeteri. VÔib-olla ostavad nad selle kuue kuu pÀrast. Nad ei saa kiiresti installida mingisuguseid pakette.
Ja meil tekkis mĂ”te, et vajame sellist spetsiaalset tööriista, mis ei nĂ”ua mingit installimist, st te ei pea tootmisse midagi paigaldama. Installige see oma sĂŒlearvutisse vĂ”i jĂ€lgimisserverisse, kust selle kĂ€ivitada. Ja see analĂŒĂŒsib palju asju: operatsioonisĂŒsteemi, failisĂŒsteemi ja ise Postgres'i, tehes kergeid pĂ€ringuid, mida saab otse tootmises kasutada ja mis ei too kaasa purunemist.
Me nimetame seda Postgres-checkup'iks. Kui meditsiiniliselt, siis see on regulaarne heaolu kontroll. Kui autotemaatika kontekstis, siis â see on nagu hooldus. Sa teed autole hooldust iga kuue kuu vĂ”i aasta tagant, sĂ”ltuvalt markist. Kas sa teed oma andmebaasile hooldust? St kas sa teed regulaarselt sĂŒvitsi minevat uurimist? Seda on vaja teha. Kui sa teed varukoopiaid, siis tee ka checkup, see on sama oluline.
Ja meil on selline tööriist. See hakkas aktiivselt arenema alles kolm kuud tagasi. See on veel noor, kuid seal on palju kasulikku.

Koondame kĂ”ige "mĂ”jukamad" pĂ€ringugrupid â raport K003 Postgres-checkup-is
Ja seal on raportite grupp K. Praegu on kolm raportit. Ja seal on ka raport K003. Seal on pg_stat_statements-i tipp, sorteeritud total_time jÀrgi.
Kui sorteerime pĂ€ringugruppe total_time jĂ€rgi, nĂ€eme tipus gruppi, mis koormab meie sĂŒsteemi kĂ”ige rohkem, st tarbib rohkem ressursse. Miks ma rÀÀgin pĂ€ringugruppidest? Kuna me eemaldame parameetrid. Need ei ole enam pĂ€ringud, vaid pĂ€ringugrupid, st need on abstraktsed.
Ja kui optimeerime ĂŒlevalt alla, kergendame oma ressursse ja lĂŒkkame edasi aega, millal peame uuendama. See on vĂ€ga hea viis raha sÀÀsta.
VÔib-olla ei ole see vÀga hea viis kasutajakogemuse osas, kuna me ei pruugi nÀha haruldasi, kuid vÀga ebameeldivaid juhtumeid, kus inimene ootas 15 sekundit. KokkuvÔttes on need nii haruldased, et me ei nÀe neid, kuid samas tegeleme ressurssidega.

Mis toimus selles tabelis? Me tegime kaks lÔikesalvestust. Postgres_checkup arvutab iga mÔÔtme, nagu total-time, calls, rows, shared_blks_read jne, erinevuse. KÔik on arvutatud. Pg_stat_statementsil on suur probleem, et ta ei mÀleta, millal seda lÀhtestati. Kui pg_stat_database mÀletab, siis pg_stat_statements ei mÀleta. Te nÀete seal 1 000 000 numbrit, aga kust me selle saime, pole teada.

Siin me teame, et meil on kaks lĂ”ikesalvestust. Me teame, et selles olukorras oli erinevus 56 sekundit. VĂ€ga vĂ€ike aeg. Total_timeâi jĂ€rgi sorteeritud. Edasi saame me diferentseerida, st jagame kĂ”ik mÔÔtmed durationiga. Kui me iga mÔÔtme jagame durationiga, saame kutsungite arvu sekundis.
Edasi on total_time per second â see on minu lemmik mÔÔde. See mÔÔdetakse sekundites, st kui palju sekundeid kulus meie sĂŒsteemil selle pĂ€ringugrupi tĂ€itmiseks sekundis. Kui te nĂ€ete seal rohkem kui ĂŒks sekund sekundis, tĂ€hendab see, et vajadusi on rohkem kui ĂŒks tuum. See on vĂ€ga hea mÔÔde. Te saate aru, et sellele isikule on nĂ€iteks vajalik vĂ€hemalt kolm tuuma.
See, this is our know-how; I haven't seen anything like it before. Notice â it's very simple â second by second. Sometimes, when your CPU is at 100%, it's half an hour per second, meaning you've spent half an hour on just this request.
Next, we see rows per second. We know how many rows were returned per second.
And another interesting aspect. How many shared_buffers we read per second from the shared_buffers itself. The hits were already there, while the rows we took from the operating system's cache or from the disk. The first option is fast, while the second might be fast or might not, depending on the situation.
The second method of differentiation â we divide the number of requests in this group. In the second column, you will always have one request divided by the request. And then it gets interesting â how many milliseconds it took for this request. We know the average behavior of this request. It required 101 milliseconds for each request. This is a traditional metric we need for understanding.
Kui palju ridu iga pÀring keskmiselt tagastas. NÀeme, et see grupp tagastab 8. Kui palju keskmiselt vahemÀlust tuli ja loeti. NÀeme, et kÔik on suurepÀraselt vahemÀlus. Ainult hitid esimese grupi jaoks.
Ja iga rea neljas alamrida â see on protsent kogu koguarvust. Meil on calls. Ătleme, et 1 000 000. Ja me saame aru, kui suur on selle grupi panus. NĂ€eme, et antud juhul on esimese grupi panus vĂ€iksem kui 0,01%. See tĂ€hendab, et see on nii aeglane, et me ei nĂ€e seda ĂŒldpildis. Teine grupp aga â 5% kĂ”igist kutsumistest. See tĂ€hendab, et 5% kĂ”igist kutsumistest on teine grupp.
Ka total_time on huvitav. Esimese grupi pĂ€ringutele kulutasime 14% kogu tööajast. Teisele grupile â 11% jne.
Ma ei hakka detailidesse sĂŒvenema, kuid seal on nĂŒansse. Me nĂ€itame ĂŒlal viga, sest kui me vĂ”rdleme, vĂ”ivad snapshotid muutuda, st mĂ”ned pĂ€ringud vĂ”ivad kaduda ja teises ei pruugi neid enam olla, aga mĂ”ned vĂ”ivad uued ilmuda. Ja me seal arvutame vea. Kui nĂ€ete 0, siis on see hea. Vigu ei ole. Kui veaprotsent on kuni 20%, on see OK.

Edasi liikudes, naaseme meie teema juurde. Peame koostama töökoormuse. Alustame ĂŒlevalt alla, kuni jĂ”uame 80% vĂ”i 90% -ni. TĂŒĂŒpiliselt on see 10-20 gruppi. Ja teeme failid pgbench'i jaoks. Seal kasutame juhuslikku (random) lĂ€henemist. Kahjuks ei toimi see alati. Postgres 12-s on selle lĂ€henemise rakendamiseks rohkem vĂ”imalusi.
Nii kogume 80-90% kokku total_time-st. Mis jÀrgmiseks panna «@»-le? Vaatame kÔnesid, jÀlgime protsente ja saame aru, et siin peaks olema teatud protsent. Nendest protsentidest saame aru, kuidas igat faili tasakaalustada. PÀrast seda kasutame pgbench'i ja alustame tööd.

Meil on veel K001 ja K002.
K001 â see on ĂŒks suur rida koos nelja alarĂŒhmaga. See iseloomustab kogu meie koormust. Vaadake teist veergu ja teist alarĂŒhma. NĂ€eme, et see on umbes 1,5 sekundit sekundis, st kui on kaks tuuma, siis on see hea. Koormus on umbes 75%. Ja see töötab nii. Kui meil on 10 tuuma, siis oleme tĂ€iesti rahulikud. Nii saame ressursse hinnata.
K002 â seda nimetame pĂ€ringute klassideks, st SELECT, INSERT, UPDATE, DELETE. Ja eraldi SELECT FOR UPDATE, kuna see lukustab.
Siit vÔime jÀreldada, et SELECT'i tavalised lugemised moodustavad 82% kÔigist kutsumistest, kuid tarbivad ainult 74% total_time'ist. See tÀhendab, et neid kutsutakse palju, kuid nad tarbivad vÀhem ressursse.

Ja naaseme kĂŒsimuse juurde: «Kuidas valida Ă”igesti shared_buffers?». Olen mĂ€rganud, et enamikki benchmark'e ehitatakse idee pĂ”hjal â vaatame, milline on lĂ€bilaskevĂ”ime. Seda mÔÔdetakse tavaliselt TPS vĂ”i QPS'iga.
Ja me pĂŒĂŒame, kasutades seadistusi, autolt pigistada vĂ”imalikult palju tehinguid sekundis. Siin on just 311 sekundis SELECT'i jaoks.

Kuid keegi ei sÔida tööle ja tagasi koju autoga tÀis speeds. See on rumal. Nii on ka andmebaasidega. Me ei tohiks sÔita maksimaalsel kiirusel, keegi ei tee seda. Keegi ei ela tootmises, kus CPU on 100%. Kuigi vÔib-olla on keegi, kes elab, kuid see ei ole hea.
Idee on selline, et tavaliselt kasutame me umbes 20% oma vĂ”imalustest, soovitatavalt mitte ĂŒle 50%. PĂŒĂŒame optimeerida reageerimisaega meie kasutajate jaoks eelkĂ”ige. St. me peame oma kĂ€si keerama nii, et 20% kiirusel oleks minimaalne latentsus, tinglikult. See on idee, mida pĂŒĂŒame ka oma katsetes rakendada.

Ja lÔpetuseks soovitused:
- Kohustuslikult tehke Database Lab.
- VÔimaluse korral tehke see nÔudmise alusel, et see tööle vajutada teatud ajaks - proovige ja siis visake minema. Kui teil on pilved, siis see on iseenesest mÔistetav, s.t. omage palju seismist.
- Olge uudishimulikud. Ja kui midagi ei klapi, kontrollige katsetega, kuidas see kÀitub. Nancy't saab kasutada, et end harida ja kontrollida, kuidas andmebaas töötab.
- Ja sihtige minimaalset reageerimisaega.
- Ărge kartke Postgresi lĂ€htekoodide ees. Kui töötate lĂ€htekoodidega, peate oskama inglise keelt. Seal on palju kommentaare, kĂ”ik on selgitatud.
- Ja kontrollige andmebaasi tervist regulaarselt, vÀhemalt kord kolme kuu jooksul kÀsitsi vÔi Postgres-checkupiga.

KĂŒsimused
AitÀh vÀga palju! VÀga huvitav asi.
Kaks asja.
Jah, kaks tĂŒkki. Ainult et ma ei saanud tĂ€ielikult aru. Kui me Nancy'ga töötame, saame me reguleerida ainult ĂŒhte parameetrit vĂ”i terve grupi korraga?
Meil on delta-konfiguratsiooniparameeter. Sinna saad keerata nii palju kui soovid. Kuid tuleb mÔista, et kui muudatusi on palju, vÔid teha valeid jÀreldusi.
Jah. Miks ma kĂŒsisin? Sest eksperimente on keeruline teha, kui sul on ainult ĂŒks parameeter. Sa reguleerid seda, vaatad, kuidas see töötab. HÀÀlestad selle. Siis hakkad jĂ€rgmist muutma.
Samas saab korraga reguleerida, kuid see sĂ”ltub olukorrast, muidugi. Siiski on parem testida ĂŒhte idee. Meil tekkis eile idee. Olime vĂ€ga sarnases olukorras. Kaks konfiguratsiooni. Ja me ei saanud aru, miks oli suur erinevus. Ja tekkis idee, et peaksime kasutama dikotoomiat, et jĂ€rjestikku mĂ”ista ja leida, mis vahe on. Saame kohe poole parameetritest muuta sama sarnaseks, siis veerandi jne. KĂ”ik on paindlik.
Ja on veel kĂŒsimus. Projekt on noor, areneb. Dokumentatsioon on juba valmis, kas on olemas detailne kirjeldus?
Ma tegin sinna spetsiaalselt lingi parameetrite kirjeldusele. See on olemas. Kuid palju on veel puudu. Otsin kaasamĂ”tlejaid. Ja ma leian neid, kui esindan. See on vĂ€ga Ă€ge. Keegi töötab juba minuga, keegi aitas ja tegi midagi. Ja kui see teema teid huvitab, andke mulle kindlasti tagasisidet â mida on puudu.
Kui labori Àra teeme, vÔib-olla tuleb tagasiside. NÀeme. AitÀh!
Tere! AitÀh ettekande eest! MÀrkasin, et Amazoni tugi on olemas. Kas plaanitakse ka GSP tuge?
Hea kĂŒsimus. Oleme alustanud. Ja oleme hetkeks peatunud, sest soovime raha sÀÀsta. Toetust pakutakse localhost'is töötamise kaudu. Saate ise luua instantsi ja töötada kohalikult. Muide, just nii me teeme. Getlabs jagan, seal GSP peal. Kuid me ei nĂ€e praegu mĂ”tet sellise orkestreerimise tegemiseks, kuna Google'il ei ole odavaid spot'ide pakkumisi. Seal on ??? instantsid, kuid nendele kehtivad piirangud. Esiteks on alati ainult 70% allahindlus ja seal ei saa hinna osas mĂ€ngida. Spot'ide puhul tĂ”stame hinda 5-10% vĂ”rra, et vĂ€hendada tĂ”enĂ€osust, et teid ĂŒmber lĂŒkatakse. See tĂ€hendab, et spot'ide puhul sÀÀstate raha, kuid need vĂ”ivad igal ajal Ă€ra vĂ”tta. Kui teie hind on veidi kĂ”rgem kui teistel, surete hiljem. Google'il on tĂ€ielikult erinev spetsiifika. Ja veel on ĂŒks vĂ€ga halb piirang â nad elavad ainult 24 tundi. Ja mĂ”nikord tahame katset teha 5 pĂ€eva. Kuid spot'ide puhul on see vĂ”imalik, mĂ”nikord elavad need kuude kaupa.
Tere! AitÀh ettekande eest! Te mainisite checkup'i. Kuidas te arvutate vigu stat_statements?
VĂ€ga hea kĂŒsimus. Ma vĂ”in vĂ€ga detailselt nĂ€idata ja rÀÀkida. LĂŒhidalt â me vaatame, kuidas on muutunud rĂŒhmade pĂ€ringute kogum: kui palju on kadunud ja kui palju on uusi tekkinud. Ja seejĂ€rel vaatame kahte mÔÔdikut: total_time ja calls, seega on seal kaks viga. Ja vaatame, milline on kadunud rĂŒhmade panus. Seal on kaks alammoodi: lahkunud ja saabunud. Vaatame, kui suur on nende panus kogu pilti.
Kas te ei karda, et see seal pöörleb kaks-kolm korda ajavahemikus snapƥottide vahel?
St. nad registreerusid uuesti vÔi kuidas?
NĂ€iteks, see pĂ€ring on juba ĂŒks kord vĂ€lja tĂ”rjuda, siis tuli tagasi ja tĂ”rjuti taas vĂ€lja, siis tuli veel kord tagasi ja tĂ”rjuti jĂ€lle vĂ€lja. Ja te siin midagi arvutasite, kus see kĂ”ik on?
Hea kĂŒsimus, tuleb vaadata.
Ma tegin sarnast asja. Muidugi lihtsamat, ma tegin seda ĂŒksi. Aga mul tuli nullida, teha reset stat_statements ja orienteeruda snapĆĄoti hetkel, et seal oleks vĂ€hem teatud osa, et see ei oleks ikkagi jĂ”udnud lakke, kui palju stat_statements-ite vĂ”ib koguneda. Ja ma lĂ€htun, et tĂ”enĂ€oliselt ei ole midagi vĂ€lja tĂ”rjutud.
Jah-jah.
Aga ma ei mÔista, kuidas vÔiks midagi muud usaldusvÀÀrselt teha.
Kahjuks ei mÀleta ma tÀpselt - kas me seal kasutame pÀringu teksti vÔi queryid pg_stat_statements ja selle jÀrgi juhindume. Kui me juhindume queryid'ist, siis peaksime vÔrreldes sarnaseid asju.
Ei, see vÔib mitme vÔrgu vahel vÀlja juhtida ja uuesti tagasi tulla.
Kas selle sama id-ga?
Jah.
Me uurime seda. Hea kĂŒsimus. Peame uurima. Kuid seni, mida me nĂ€eme, on meil kas kirjutatud 0...
See on muidugi haruldane juhtum, aga olin jahmunud, kui kuulsin, et stat_statements seal vÔib vÀlja juhtida.
Pg_stat_statements'is vÔib palju olla. Oleme kohtunud sellega, et kui teil track_utility = on, siis jÀlgitakse ka teie setteid.
Jah, muidugi.
Ja kui teil on random java hibernate, siis hakkab seal lukuklahvi tabel lukustuma. Ja niipea, kui te keelate vĂ€ga koormatud rakenduse, on teil 50-100 gruppi. Ja seal on enam-vĂ€hem kĂ”ik stabiilne. Ăks viis selle vastu vĂ”itlemiseks on pg_stat_statements.max suurendada.
Jah, aga tuleb teada, kui palju. Ja kuidagi peab selle ĂŒle jĂ€lgima. Mina teen nii. T. e. mul on pg_stat_statements.max. Ja vaatan, et ma snapshot'i ajal ei ole jĂ”udnud 70% juurde. HĂ€sti, see tĂ€hendab, et me ei ole midagi kaotanud. Teeme reseti. Ja kogume uuesti. Kui jĂ€rgmises snapshot'is on vĂ€hem kui 70, siis tĂ€hendab, et tĂ”enĂ€oliselt ei ole me jĂ€lle midagi kaotanud.
Jah. Vaikimisi on praegu 5000. Ja paljudele sellest piisab.
Tavaliselt â jah.
Video:

P.S. Isiklikult lisan, et kui Postgresis on konfidentsiaalsed andmed ja neid ei tohi testkeskkonda viia, siis vÔib kasutada . Skeem on umbkaudu jÀrgmine:

Allikas: habr.com
