Jag föreslÄr att du lÀser utskriften av Nikolai Samokhvalovs rapport "Industriell metod för att trimma PostgreSQL: experiment pÄ databaser"
Shared_buffers = 25% â Ă€r det mycket eller lite? Eller helt rĂ€tt? Hur vet du om denna â ganska förlegade â rekommendation Ă€r lĂ€mplig i just ditt fall?
Det Àr dags att nÀrma sig frÄgan om att vÀlja postgresql.conf-parametrar "som en vuxen". Inte med hjÀlp av blinda "autotuners" eller förÄldrade rÄd frÄn artiklar och bloggar, utan baserat pÄ:
- strikt verifierade experiment pÄ databaser, utförda automatiskt, i stora mÀngder och under förhÄllanden sÄ nÀra "bekÀmpande" som möjligt,
- djup förstÄelse för funktionerna i DBMS och OS.
AnvÀnder Nancy CLI (
Vi kommer att prata om experiment med databaser. Det hÀr Àr en historia som varar i drygt ett halvÄr.
Lite om mig sjÀlv. Erfarenhet av Postgres i mer Àn 14 Är. Ett antal sociala nÀtverksföretag har grundat. Postgres var och anvÀnds överallt.
Ăven RuPostgres-gruppen pĂ„ Meetup, 2:a plats i vĂ€rlden. Vi nĂ€rmar oss sakta 2 000 personer. RuPostgres.org.
Och pÄ PC:er pÄ olika konferenser, inklusive Highload, Àr jag ansvarig för databaser, i synnerhet Postgres frÄn första början.
Och under de senaste Ären har jag startat om min Postgres konsultverksamhet 11 tidszoner hÀrifrÄn.
Och nÀr jag gjorde det hÀr för nÄgra Är sedan hade jag ett uppehÄll i det aktiva manuella arbetet med Postgres, förmodligen sedan 2010. Jag blev förvÄnad över hur lite arbetsrutinen för en DBA har förÀndrats, hur mycket manuellt arbete som fortfarande behöver anvÀndas. Och jag tÀnkte direkt att nÄgot var fel hÀr, jag mÄste automatisera mer av allt.
Och eftersom allt var avlÀgset befann sig de flesta klienterna i molnen. Och mycket har redan automatiserats, uppenbarligen. Mer om detta senare. Det vill sÀga, allt detta resulterade i idén att det borde finnas ett antal verktyg, det vill sÀga nÄgon form av plattform som kommer att automatisera nÀstan alla DBA-ÄtgÀrder sÄ att ett stort antal databaser kan hanteras.
Denna rapport kommer inte att innehÄlla:
- "Silverkulor" och uttalanden som - stÀll in 8 GB eller 25% shared_buffers och du kommer att bli bra. Det kommer inte att finnas mycket om shared_buffers.
- Hardcore "inÀlvor".
Och vad kommer att hÀnda?
- Det kommer att finnas optimeringsprinciper som vi tillÀmpar och utvecklar. Det kommer att dyka upp alla möjliga idéer pÄ vÀgen och olika verktyg som vi skapar till största delen i Open Source, det vill sÀga vi gör grunden i Open Source. Dessutom har vi biljetter, all kommunikation Àr praktiskt taget öppen kÀllkod. Du kan se vad vi gör nu, vad som kommer att finnas i nÀsta release osv.
- Det kommer ocksÄ att finnas en del erfarenhet av att anvÀnda dessa principer, dessa verktyg i ett antal företag: frÄn smÄ startups till stora företag.
Hur utvecklas allt detta?
För det första Àr huvuduppgiften för en DBA, förutom att sÀkerstÀlla skapandet av instanser, distribution av sÀkerhetskopior etc., att hitta flaskhalsar och optimera prestanda.
Nu Àr det uppstÀllt sÄ hÀr. Vi tittar pÄ övervakningen, vi ser nÄgot, men vi saknar nÄgra detaljer. Vi börjar grÀva mer noggrant, vanligtvis med hÀnderna, och förstÄr vad vi ska göra med det pÄ ett eller annat sÀtt.
Och det finns tvÄ tillvÀgagÄngssÀtt. Pg_stat_statements Àr standardlösningen för att identifiera lÄngsamma frÄgor. Och analys av Postgres-loggar med pgBadger.
Varje tillvÀgagÄngssÀtt har allvarliga nackdelar. I det första tillvÀgagÄngssÀttet har vi kastat ut alla parametrar. Och om vi ser grupperna SELECT * FROM dÀr kolumnen Àr lika med "?" eller "$" sedan Postgres 10. Vi vet inte om detta Àr en indexskanning eller en seq-skanning. Det beror vÀldigt mycket pÄ parametern. Om du ersÀtter ett sÀllan pÄtrÀffat vÀrde dÀr blir det en indexskanning. Om du ersÀtter ett vÀrde som upptar 90% av tabellen dÀr, kommer seq-skanningen att vara uppenbar, eftersom Postgres kan statistiken. Och detta Àr en stor nackdel med pg_stat_statements, Àven om en del arbete pÄgÄr.
Den största nackdelen med logganalys Àr att du som regel inte har rÄd med "log_min_duration_statement = 0". Och vi ska prata om detta ocksÄ. Följaktligen ser du inte hela bilden. Och vissa frÄgor, som Àr mycket snabba, kan förbruka en enorm mÀngd resurser, men du kommer inte att se den eftersom den ligger under din tröskel.
Hur löser DBA:er de problem de hittar?
Vi hittade till exempel nÄgot problem. Vad brukar man göra? Om du Àr en utvecklare kommer du att göra nÄgot pÄ nÄgon instans som inte Àr av samma storlek. Om du Àr en DBA, dÄ har du iscensÀttning. Och det kan bara finnas en. Och han var sex mÄnader efter. Och du tror att du kommer att gÄ till produktion. Och Àven erfarna DBA:er checkar sedan in produktionen, pÄ en replik. Och det hÀnder att de skapar ett tillfÀlligt index, ser till att det hjÀlper, slÀpper det och ger det till utvecklarna sÄ att de kan lÀgga det i migreringsfilerna. Det Àr den typen av nonsens som hÀnder nu. Och detta Àr ett problem.
- Justera konfigurationer.
- Optimera uppsÀttningen av index.
- Ăndra sjĂ€lva SQL-frĂ„gan (detta Ă€r det svĂ„raste sĂ€ttet).
- LÀgg till kapacitet (det enklaste sÀttet i de flesta fall).
Det hÀnder mycket med dessa saker. Det finns mÄnga handtag i Postgres. Det finns mycket att veta. Det finns mÄnga index i Postgres, tack ocksÄ till arrangörerna av denna konferens. Och allt detta mÄste vara kÀnt, och det Àr detta som fÄr icke-DBA:er att kÀnna att DBA:er utövar svart magi. Det vill sÀga, du behöver studera i 10 Är för att börja förstÄ allt detta normalt.
Och jag Àr en kÀmpe mot denna svarta magi. Jag vill göra allt sÄ att det finns teknik, och det finns ingen intuition i allt detta.
Verkliga exempel
Jag observerade detta i minst tvÄ projekt, inklusive mitt eget. Ett annat blogginlÀgg berÀttar att ett vÀrde pÄ 1 000 för default_statistict_target Àr bra. Okej, lÄt oss prova det i produktionen.
Och hÀr Àr vi, med hjÀlp av vÄrt verktyg tvÄ Är senare, med hjÀlp av experiment pÄ de databaser som vi pratar om idag, kan vi jÀmföra vad som var och vad som har blivit.
Och för detta mÄste vi skapa ett experiment. Den bestÄr av fyra delar.
- Den första Àr miljön. Vi behöver en hÄrdvara. Och nÀr jag kommer till nÄgot företag och skriver pÄ ett kontrakt sÀger jag Ät dem att ge mig samma hÄrdvara som i produktionen. För var och en av dina mÀstare behöver jag minst en sÄdan hÄrdvara. Antingen Àr detta en virtuell maskin i Amazon eller Google, eller sÄ behöver jag exakt samma maskinvara. Det vill sÀga jag vill Äterskapa miljön. Och i miljökonceptet inkluderar vi huvudversionen av Postgres.
- Den andra delen Àr föremÄl för vÄr forskning. Detta Àr en databas. Det kan skapas pÄ flera sÀtt. Jag ska visa dig hur.
- Den tredje delen Àr belastningen. Detta Àr det svÄraste ögonblicket.
- Och den fjÀrde delen Àr vad vi kontrollerar, det vill sÀga vad vi kommer att jÀmföra med vad. LÄt oss sÀga att vi kan Àndra en eller flera parametrar i konfigurationen, eller sÄ kan vi skapa ett index osv.
Vi lanserar ett experiment. HÀr Àr pg_stat_statements. Till vÀnster Àr vad som hÀnde. Till höger - vad hÀnde.
Till vÀnster default_statistics_target = 100, till höger = 1 000. Vi ser att detta hjÀlpte oss. Sammantaget blev allt bÀttre med 8%.
Men om vi scrollar ner kommer det att finnas grupper av förfrÄgningar frÄn pgBadger eller frÄn pg_stat_statements. Det finns tvÄ alternativ. Vi kommer att se att en del begÀran har minskat med 88 %. Och hÀr kommer det tekniska tillvÀgagÄngssÀttet. Vi kan grÀva lÀngre inuti eftersom vi undrar varför den sjönk. Du mÄste förstÄ vad som hÀnde med statistiken. Varför fler hinkar i statistik leder till sÀmre resultat.
Eller sĂ„ kan vi inte grĂ€va, utan gör "ĂNDRA TABELL ... ĂNDRA KOLUMN" och returnera 100 hinkar till statistiken i denna kolumn. Och sedan med ett annat experiment kan vi se till att det hĂ€r plĂ„stret hjĂ€lpte. Allt. Det hĂ€r Ă€r en ingenjörsmetod som hjĂ€lper oss att se helheten och fatta beslut baserat pĂ„ data snarare Ă€n pĂ„ intuition.
Ett par exempel frÄn andra omrÄden. Det har funnits CI-tester i testning i mÄnga Är. Och inget projekt med sitt fulla sinne skulle leva utan automatiserade tester.
I andra branscher: inom flyget, inom fordonsindustrin, nÀr vi testar aerodynamik har vi ocksÄ möjlighet att göra experiment. Vi kommer inte att skjuta upp nÄgot frÄn en ritning direkt ut i rymden, eller sÄ tar vi inte omedelbart nÄgon bil ut pÄ banan. Det finns till exempel en vindtunnel.
Vi kan dra slutsatser frÄn observationer av andra branscher.
För det första har vi en speciell miljö. Det Àr nÀra produktion, men inte nÀra. Dess huvudsakliga funktion Àr att den ska vara billig, repeterbar och sÄ automatiserad som möjligt. Och det mÄste ocksÄ finnas speciella verktyg för att genomföra detaljerad analys.
Med största sannolikhet nÀr vi sjösÀtter ett plan och flyger har vi mindre möjlighet att studera varje millimeter av vingytan Àn vad vi har i en vindtunnel. Vi har fler diagnostiska verktyg. Vi har rÄd att bÀra mer tunga saker som vi inte har rÄd att sÀtta pÄ ett flygplan i luften. Samma sak med Postgres. Vi kan i vissa fall aktivera fullstÀndig frÄgeloggning under experiment. Och vi vill inte göra detta i produktionen. Vi kanske till och med planerar att aktivera detta med auto_explain.
Och som sagt, en hög automatisering innebÀr att vi trycker pÄ knappen och upprepar. SÄ hÀr ska det vara, sÄ att det blir mycket experimenterande, sÄ att det Àr igÄng.
Nancy CLI - grunden för "databaslaboratoriet"
Och sÄ gjorde vi det hÀr. Det vill sÀga, jag pratade om dessa idéer i juni, för nÀstan ett Är sedan. Och vi har redan den sÄ kallade Nancy CLI i öppen kÀllkod. Detta Àr grunden för att bygga ett databaslaboratorium.
Naturligtvis Àr det mycket som fortfarande Àr under utveckling. Det finns mÄnga idéer dÀr. Men det hÀr Àr nÄgot vi anvÀnder nÀstan varje dag. Och nÀr vi har en idé - varför kommer det sig att nÀr vi raderar 40 000 000 rader sÄ kommer allt till IO, dÄ kan vi genomföra ett experiment och titta mer i detalj för att förstÄ vad som hÀnder och sedan försöka fixa det i farten. Det vill sÀga, vi gör ett experiment. Vi justerar till exempel nÄgot och ser vad som hÀnder i slutÀndan. Och det gör vi inte i produktionen. Detta Àr kÀrnan i idén.
Var kan detta fungera? Detta kan fungera lokalt, det vill sÀga du kan göra det var som helst, du kan till och med köra det pÄ en MacBook. Vi behöver en hamnarbetare, lÄt oss gÄ. Det Àr allt. Du kan köra det i vissa fall pÄ en hÄrdvara, eller i en virtuell maskin, var som helst.
Och det finns ocksĂ„ möjlighet att köra pĂ„ distans i Amazon i EC2 Instance, pĂ„ flĂ€ckar. Och det hĂ€r Ă€r en vĂ€ldigt cool möjlighet. IgĂ„r genomförde vi till exempel mer Ă€n 500 experiment pĂ„ i3-instanser, som började med den yngsta och slutade med i3-16-xlarge. Och 500 experiment kostade oss $64. Var och en varade i 15 minuter. Det vill sĂ€ga, pĂ„ grund av att spots anvĂ€nds dĂ€r Ă€r det vĂ€ldigt billigt â 70% rabatt, Amazons per sekund fakturering. Du kan göra mycket. Du kan göra riktig forskning.
Och tre huvudversioner av Postgres stöds. Det Àr inte sÄ svÄrt att avsluta nÄgra gamla och den nya 12:e versionen ocksÄ.
Vi kan definiera ett objekt pÄ tre sÀtt. Detta:
- Dump/sql-fil.
- Det huvudsakliga sÀttet Àr att klona PGDATA-katalogen. Som regel tas den frÄn backupservern. Om du har normala binÀra sÀkerhetskopior kan du göra kloner dÀrifrÄn. Om du har moln, kommer ett molnkontor som Amazon och Google att göra detta Ät dig. Detta Àr det viktigaste sÀttet att klona verklig produktion. SÄ hÀr utvecklar vi oss.
- Och den sista metoden passar för forskning nÀr man vill förstÄ hur nÄgot fungerar i Postgres. Det hÀr Àr pgbench. Du kan generera med pgbench. Det Àr bara ett "db-pgbench"-alternativ. Du berÀttar för honom vilken skala. Och allt kommer att genereras i molnet, som sagt.
Och ladda:
- Vi kan utföra belastningen i en SQL-trÄd. Detta Àr det mest primitiva sÀttet.
- Och vi kan efterlikna belastningen. Och vi kan först och frÀmst efterlikna det pÄ följande sÀtt. Vi mÄste samla alla stockar. Och det Àr smÀrtsamt. Jag ska visa dig varför. Och med pgreplay spelar vi, som Àr inbyggt i Nancy.
- Eller ett annat alternativ. Den sÄ kallade hantverksbelastningen, som vi gör med en viss anstrÀngning. Genom att analysera vÄr nuvarande belastning pÄ stridssystemet drar vi ut de översta grupperna av förfrÄgningar. Och med hjÀlp av pgbench kan vi emulera denna belastning i laboratoriet.
- Antingen mÄste vi utföra nÄgon form av SQL, dvs vi kontrollerar nÄgon form av migrering, skapar ett index dÀr, kör ANALAZE dÀr. Och vi tittar pÄ vad som hÀnde före vakuumet och efter vakuumet. I allmÀnhet, vilken SQL som helst.
- Antingen Àndrar vi en eller flera parametrar i konfigurationen. Vi kan berÀtta för oss att kontrollera till exempel 100 vÀrden i Amazon för vÄr terabytedatabas. Och om nÄgra timmar har du resultatet. Som regel kommer det att ta dig flera timmar att distribuera en terabyte-databas. Men det finns en patch under utveckling, vi har en serie möjlig, dvs du kan konsekvent anvÀnda samma pgdata pÄ samma server och kontrollera. Postgres kommer att starta om och cacheminne kommer att ÄterstÀllas. Och du kan köra lasten.
- En katalog kommer med ett gÀng olika filer, med början frÄn pg ögonblicksbilderstat***. Och det mest intressanta dÀr Àr pg_stat_statements, pg_stat_kcacke. Det hÀr Àr tvÄ tillÀgg som analyserar förfrÄgningar. Och pg_stat_bgwriter innehÄller inte bara pgwriter-statistik, utan ocksÄ om checkpoint och hur backends sjÀlva förskjuter smutsiga buffertar. Och allt Àr intressant att se. Till exempel, nÀr vi stÀller in shared_buffers Àr det vÀldigt intressant att se hur mycket alla ersatte.
- Postgres loggar kommer ocksĂ„. TvĂ„ loggar â en förberedelselogg och en laddningslogg.
- En relativt ny funktion Àr FlameGraphs.
- Dessutom, om du anvÀnde pgreplay eller pgbench alternativ för att spela belastningen, kommer deras utdata att vara inbyggt. Och du kommer att se latens och TPS. Det kommer att gÄ att förstÄ hur de sÄg det.
- Systeminformation.
- GrundlÀggande CPU- och IO-kontroller. Detta Àr mer för EC2-instanser i Amazon, nÀr du vill starta 100 identiska instanser i en trÄd och köra 100 olika körningar dÀr, dÄ har du 10 000 experiment. Och du mÄste se till att du inte stöter pÄ en felaktig instans som redan förtrycks av nÄgon. Andra Àr aktiva pÄ den hÀr hÄrdvaran och du har lite resurser kvar. Det Àr bÀttre att kassera sÄdana resultat. Och med hjÀlp av sysbench frÄn Alexey Kopytov gör vi flera korta kontroller som kommer och kan jÀmföras med andra, det vill sÀga du kommer att förstÄ hur CPU:n beter sig och hur IO:n beter sig.
Vilka Àr de tekniska svÄrigheterna utifrÄn exemplet frÄn olika företag?
LÄt oss sÀga att vi vill upprepa den verkliga belastningen med loggar. Det Àr en bra idé om det Àr skrivet pÄ Open Source pgreplay. Vi anvÀnder det. Men för att det ska fungera bra mÄste du aktivera fullstÀndig frÄgeloggning med parametrar och timing.
Det finns vissa komplikationer med varaktighet och tidsstÀmpel. Vi tömmer hela köket. HuvudfrÄgan Àr om du har rÄd eller inte?
Problemet Àr att det kanske inte Àr tillgÀngligt. Först och frÀmst mÄste du förstÄ vilken ström som kommer att skrivas till loggen. Om du har pg_stat_statements kan du anvÀnda den hÀr frÄgan (lÀnken kommer att finnas i bilderna) för att förstÄ ungefÀr hur mÄnga byte som kommer att skrivas per sekund.
Vi tittar pÄ lÀngden pÄ förfrÄgan. Vi försummar det faktum att det inte finns nÄgra parametrar, men vi vet lÀngden pÄ begÀran och vi vet hur mÄnga gÄnger per sekund den kördes. PÄ sÄ sÀtt kan vi uppskatta ungefÀr hur mÄnga byte per sekund. Vi kan göra fel dubbelt sÄ mycket, men vi kommer definitivt att förstÄ ordningen pÄ detta sÀtt.
Vi kan se att denna begĂ€ran exekveras 802 gĂ„nger per sekund. Och vi ser att bytes_per sek â 300 kB/s kommer att skrivas plus eller minus. Och som regel har vi rĂ„d med ett sĂ„dant flöde.
Men! Faktum Àr att det finns olika loggningssystem. Och folks standard Àr vanligtvis "syslog".
Och om du har syslog kan du ha en sÄdan hÀr bild. Vi tar pgbench, aktiverar frÄgeloggning och ser vad som hÀnder.
Utan loggning - det hÀr Àr kolumnen till vÀnster. Vi fick 161 000 TPS. Med syslog - detta Àr i Ubuntu 16.04 pÄ Amazon fÄr vi 37 000 TPS. Och om vi byter till tvÄ andra loggningsmetoder sÄ Àr situationen mycket bÀttre. Det vill sÀga vi förvÀntade oss att det skulle sjunka, men inte i samma utstrÀckning.
Och pÄ CentOS 7, dÀr journald ocksÄ deltar, förvandlar loggar till ett binÀrt format för enkel sökning etc., dÄ Àr det en mardröm dÀr, vi tappar 44 gÄnger i TPS.
Och det hÀr Àr vad folk lever med. Och ofta i företag, sÀrskilt stora, Àr detta vÀldigt svÄrt att Àndra pÄ. Om du kan komma bort frÄn syslog, snÀlla kom bort frÄn den.
- UtvÀrdera IOPS och skrivflöde.
- Kontrollera ditt loggningssystem.
- Om den berÀknade belastningen Àr för stor, övervÀg provtagning.
Vi har pg_stat_statements. Den mÄste som sagt finnas dÀr. Och vi kan ta och beskriva varje grupp av förfrÄgningar pÄ ett speciellt sÀtt i en fil. Och sedan kan vi anvÀnda en mycket bekvÀm funktion i pgbench - det hÀr Àr möjligheten att infoga flera filer med alternativet "-f".
Den förstÄr mycket "-f". Och du kan berÀtta med hjÀlp av "@" i slutet vilken andel varje fil ska ha. Det vill sÀga, vi kan sÀga att gör detta i 10% av fallen, och detta i 20%. Och detta kommer att föra oss nÀrmare det vi ser i produktionen.
Hur ska vi förstÄ vad vi har i produktionen? Vilken andel och hur? Det hÀr Àr lite Ät sidan. Vi har en produkt till
Han föddes av lite olika anledningar. Av skĂ€l att övervakning inte rĂ€cker. Det vill sĂ€ga, man kommer, tittar pĂ„ basen, tittar pĂ„ problemen som finns. Och som regel gör du en hĂ€lsokontroll. Om du Ă€r en erfaren DBA, dĂ„ gör du health_check. Vi tittade pĂ„ anvĂ€ndningen av index, etc. Om du har OKmeter, sĂ„ bra. Det hĂ€r Ă€r cool övervakning för Postgres. OKmeter.io â snĂ€lla installera det, allt Ă€r gjort vĂ€ldigt bra dĂ€r. Det Ă€r betalt.
Om du inte har en sÄ har du oftast inte sÄ mycket. Vid övervakning finns det vanligtvis CPU, IO och sedan med reservationer, och det Àr allt. Och vi behöver mer. Vi mÄste se hur autovakuum fungerar, hur checkpoint fungerar, i io mÄste vi separera checkpoint frÄn bgwriter och frÄn backends, etc.
Problemet Àr att nÀr man hjÀlper ett stort företag kan de inte implementera nÄgot snabbt. De kan inte snabbt köpa OKmeter. De kanske köper den om ett halvÄr. Vissa paket kan de inte snabbt leverera.
Och vi kom pÄ idén att vi behöver ett specialverktyg som inte krÀver att nÄgot installeras, det vill sÀga du behöver inte installera nÄgot alls i produktionen. Installera den pÄ din bÀrbara dator eller pÄ en observationsserver dÀr du kommer att köra den. Och det kommer att analysera mÄnga saker: operativsystemet, filsystemet och Postgres sjÀlv, vilket gör nÄgra lÀtta frÄgor som kan köras direkt till produktionen och ingenting kommer att misslyckas.
Vi kallade det Postgres-checkup. I medicinska termer Àr detta en vanlig hÀlsokontroll. Om det Àr biltema Àr det som underhÄll. Du gör underhÄll pÄ din bil var sjÀtte mÄnad eller ett Är, beroende pÄ mÀrke. Gör du underhÄll för din bas? Det vill sÀga, gör du djupgÄende research regelbundet? Det mÄste göras. Om du gör sÀkerhetskopior, gör sedan en kontroll, detta Àr inte mindre viktigt.
Och vi har ett sÄdant verktyg. Det började aktivt dyka upp för bara cirka tre mÄnader sedan. Han Àr fortfarande ung, men det finns mycket dÀr.
Samla de mest "inflytelserika" grupperna av frÄgor - rapportera K003 i Postgres-checkup
Och det finns en grupp rapporter K. Tre rapporter hittills. Och det finns en sÄdan rapport K003. Det finns toppen frÄn pg_stat_statements, sorterad efter total_time.
NÀr vi sorterar förfrÄgningsgrupper efter total_time ser vi högst upp den grupp som laddar vÄrt system mest, det vill sÀga förbrukar mer resurser. Varför namnger jag frÄgegrupper? För vi kastade ut parametrarna. Dessa Àr inte lÀngre förfrÄgningar, utan grupper av förfrÄgningar, det vill sÀga de Àr abstraherade.
Och om vi optimerar frÄn topp till botten kommer vi att lÀtta pÄ vÄra resurser och försena det ögonblick dÄ vi behöver uppgradera. Detta Àr ett mycket bra sÀtt att spara pengar.
Kanske Àr detta inte ett sÀrskilt bra sÀtt att ta hand om anvÀndare, eftersom vi kanske inte ser sÀllsynta, men vÀldigt irriterande fall dÀr en person vÀntat i 15 sekunder. Totalt sett Àr de sÄ sÀllsynta att vi inte ser dem, men vi har att göra med resurser.
Vad hÀnde i den hÀr tabellen? Vi tog tvÄ ögonblicksbilder. Postgres_checkup ger dig ett delta för varje mÀtvÀrde: total tid, samtal, rader, shared_blks_read, etc. Det Àr allt, delta har berÀknats. Det stora problemet med pg_stat_statements Àr att den inte kommer ihÄg nÀr den ÄterstÀlldes. Om pg_stat_database kommer ihÄg, sÄ kommer inte pg_stat_statements ihÄg. Du ser att det finns ett antal pÄ 1 000 000, men vi vet inte var vi rÀknade ifrÄn.
Och hĂ€r vet vi, hĂ€r har vi tvĂ„ ögonblicksbilder. Vi vet att deltat i det hĂ€r fallet var 56 sekunder. Ett mycket kort mellanrum. Sorterat efter total_time. Och sedan kan vi differentiera, det vill sĂ€ga vi delar upp alla mĂ€tvĂ€rden efter varaktighet. Om vi ââdelar varje mĂ€tvĂ€rde efter varaktighet fĂ„r vi antalet samtal per sekund.
DÀrefter Àr total_time per second mitt favoritmÄtt. Det mÀts i sekunder, per sekund, det vill sÀga hur mÄnga sekunder det tog vÄrt system att utföra denna grupp av förfrÄgningar per sekund. Om du ser mer Àn en sekund per sekund dÀr betyder det att du var tvungen att ge mer Àn en kÀrna. Detta Àr ett mycket bra mÄtt. Du kan förstÄ att den hÀr vÀnnen till exempel behöver minst tre kÀrnor.
Det hÀr Àr vÄrt kunnande, jag har aldrig sett nÄgot liknande nÄgonstans. Observera - detta Àr en mycket enkel sak - sekund per sekund. Ibland, nÀr din CPU Àr 100%, sedan en halvtimme per sekund, det vill sÀga, du spenderade en halvtimme pÄ att göra just denna begÀran.
DÀrefter ser vi rader per sekund. Vi vet hur mÄnga rader per sekund den returnerade.
Och sÄ finns det ocksÄ en intressant sak. Hur mÄnga shared_buffers vi lÀser per sekund frÄn sjÀlva shared_buffers. TrÀffarna fanns redan dÀr, och vi tog raderna frÄn operativsystemets cache eller frÄn disken. Det första alternativet Àr snabbt, och det andra kan eller kanske inte Àr snabbt, beroende pÄ situationen.
Och det andra sÀttet att differentiera Àr att dela upp antalet förfrÄgningar i denna grupp. I den andra kolumnen kommer du alltid att ha en frÄga uppdelad per frÄga. Och dÄ Àr det intressant - hur mÄnga millisekunder var det i denna begÀran. Vi vet hur den hÀr frÄgan beter sig i genomsnitt. 101 millisekunder krÀvdes för varje begÀran. Detta Àr den traditionella mÄtten vi behöver förstÄ.
Hur mÄnga rader returnerade varje frÄga i genomsnitt? Vi ser 8 denna grupp ÄtervÀnder. I genomsnitt hur mycket som togs frÄn cachen och lÀstes. Vi ser att allt Àr cachat fint. Solida trÀffar för den första gruppen.
Och den fjÀrde delstrÀngen i varje rad Àr hur stor procentandel av totalen. Vi har samtal. LÄt oss sÀga 1 000 000. Och vi kan förstÄ vilket bidrag den hÀr gruppen ger. Vi ser att i detta fall bidrar den första gruppen med mindre Àn 0,01 %. Det vill sÀga att det gÄr sÄ lÄngsamt att vi inte ser det i helhetsbilden. Och den andra gruppen har 5 % pÄ samtal. Det vill sÀga 5 % av alla samtal Àr den andra gruppen.
Total_time Àr ocksÄ intressant. Vi spenderade 14 % av vÄr totala arbetstid pÄ den första gruppen av förfrÄgningar. Och för den andra - 11%, etc.
Jag gÄr inte in pÄ detaljer, men det finns finesser dÀr. Vi visar ett fel högst upp, för nÀr vi jÀmför kan ögonblicksbilder flyta, det vill sÀga vissa förfrÄgningar kan falla ut och kan inte lÀngre finnas i den andra, medan nÄgra nya kan dyka upp. Och dÀr rÀknar vi felet. Om du ser 0 sÄ Àr det bra. Det finns inga fel. Om felfrekvensen Àr upp till 20 % Àr det OK.
Sedan ÄtergÄr vi till vÄrt Àmne. Vi mÄste skapa arbetsbördan. Vi tar det frÄn topp till botten och gÄr tills vi nÄr 80% eller 90%. Vanligtvis Àr detta 10-20 grupper. Och vi gör filer för pgbench. Vi anvÀnder random dÀr. Ibland gÄr detta tyvÀrr inte. Och i Postgres 12 kommer det att finnas fler möjligheter att anvÀnda detta tillvÀgagÄngssÀtt.
Och dÄ vinner vi 80-90% i total_time pÄ detta sÀtt. Vad ska jag sÀtta efter "@"? Vi tittar pÄ samtalen, tittar pÄ hur stort intresse det Àr och förstÄr att vi Àr skyldiga sÄ mycket intresse hÀr. FrÄn dessa procentsatser kan vi förstÄ hur man balanserar var och en av filerna. Efter det anvÀnder vi pgbench och gÄr till jobbet.
Vi har Àven K001 och K002.
K001 Ă€r en stor strĂ€ng med fyra delstrĂ€ngar. Detta Ă€r ett kĂ€nnetecken för hela vĂ„r last. Se andra kolumnen och andra underraden. Vi ser att ungefĂ€r en och en halv sekund per sekund, d.v.s. om det finns tvĂ„ kĂ€rnor, sĂ„ blir det bra. Det kommer att finnas cirka 75 % kapacitet. Och det kommer att fungera sĂ„ hĂ€r. Om vi ââhar 10 kĂ€rnor, kommer vi generellt att vara lugna. PĂ„ sĂ„ sĂ€tt kan vi utvĂ€rdera resurser.
K002 Ă€r vad jag kallar frĂ„geklasser, dvs SELECT, INSERT, UPDATE, DELETE. Och separat VĂLJ FĂR UPPDATERING, eftersom det Ă€r ett lĂ„s.
Och hÀr kan vi dra slutsatsen att SELECT Àr vanliga lÀsare - 82% av alla samtal, men samtidigt - 74% i total_time. Det vill sÀga, de kallas mycket, men förbrukar mindre resurser.
Och vi ÄtergÄr till frÄgan: "Hur kan vi vÀlja rÀtt shared_buffers?" Jag observerar att de flesta riktmÀrken Àr baserade pÄ idén - lÄt oss se vad genomströmningen blir, d.v.s. vad genomströmningen blir. Det mÀts vanligtvis i TPS eller QPS.
Och vi försöker pressa ut sÄ mÄnga transaktioner per sekund som möjligt frÄn bilen med hjÀlp av instÀllningsparametrar. HÀr Àr exakt 311 per sekund för att vÀlja.
Men ingen kör i full fart till jobbet och hem igen. Detta Àr dumt. Samma sak med databaser. Vi behöver inte köra i full fart, och det gör ingen. Ingen bor i produktionen, som har 100% CPU. Fast kanske nÄgon lever, men det hÀr Àr inte bra.
Tanken Àr att vi brukar köra pÄ 20 procent av kapaciteten, helst inte mer Àn 50 procent. Och vi försöker optimera svarstiden för vÄra anvÀndare framför allt. Det vill sÀga, vi mÄste vrida vÄra rattar sÄ att det finns en minsta latens vid 20 % hastighet, villkorligt. Detta Àr en idé som vi ocksÄ försöker anvÀnda i vÄra experiment.
Och slutligen, rekommendationer:
- Var noga med att göra Databas Lab.
- Om möjligt, gör det pĂ„ begĂ€ran sĂ„ att det vecklas ut ett tag â lek och slĂ€ng det. Om du har moln, dĂ„ Ă€r detta sjĂ€lvklart, d.v.s. har mycket stĂ„ende.
- Var nyfiken. Och om nÄgot Àr fel, kolla sedan med experiment hur det beter sig. Nancy kan anvÀndas för att trÀna dig sjÀlv för att kontrollera hur basen fungerar.
- Och strÀva efter minsta svarstid.
- Och var inte rÀdd för Postgres kÀllor. NÀr du arbetar med kÀllor mÄste du kunna engelska. Det Àr mÄnga kommentarer dÀr, allt förklaras dÀr.
- Och kontrollera databasens hÀlsa regelbundet, minst en gÄng var tredje mÄnad, manuellt eller Postgres-checkup.
frÄgor
Tack sÄ mycket! En mycket intressant sak.
TvÄ bitar.
Ja, tvÄ stycken. Bara jag förstod inte riktigt. NÀr Nancy och jag jobbar, kan vi justera bara en parameter eller en hel grupp?
Vi har en deltakonfigurationsparameter. Du kan vÀnda dit hur mycket du vill pÄ en gÄng. Men du mÄste förstÄ att nÀr du Àndrar mÄnga saker kan du dra fel slutsatser.
Ja. Varför frÄgade jag? För det Àr svÄrt att genomföra experiment nÀr man bara har en parameter. Du drar Ät det, se hur det fungerar. Jag satte ut honom. Sedan börjar du nÀsta.
Man kan dra Ät samtidigt, men det beror pÄ situationen sÄklart. Men det Àr bÀttre att testa en idé. Vi fick en idé igÄr. Vi hade en vÀldigt nÀra situation. Det fanns tvÄ konfigurationer. Och vi kunde inte förstÄ varför det var stor skillnad. Och idén uppstod att man mÄste anvÀnda dikotomi för att konsekvent förstÄ och hitta vad skillnaden Àr. Du kan omedelbart göra hÀlften av parametrarna lika, sedan en fjÀrdedel, etc. Allt Àr flexibelt.
Och det finns en frÄga till. Projektet Àr ungt och utvecklande. Dokumentationen Àr redan klar, finns det en detaljerad beskrivning?
Jag gjorde specifikt en lĂ€nk dĂ€r till beskrivningen av parametrarna. Ăr det dĂ€r. Men mycket Ă€r inte dĂ€r Ă€n. Jag letar efter likasinnade. Och jag hittar dem nĂ€r jag upptrĂ€der. Det hĂ€r Ă€r vĂ€ldigt coolt. NĂ„gon jobbar redan med mig, nĂ„gon hjĂ€lpte till och gjorde nĂ„got dĂ€r. Och om du Ă€r intresserad av detta Ă€mne, ge feedback om vad som saknas.
NÀr vi vÀl bygger laboratoriet kanske det kommer Äterkoppling. LÄt oss se. Tack!
HallÄ! Tack för rapporten! Jag sÄg att det finns stöd för Amazon. Finns det nÄgra planer pÄ att stödja GSP?
Bra frÄga. Vi började göra det. Och vi frös det för nu eftersom vi vill spara pengar. Det vill sÀga att det finns stöd för att köra pÄ localhost. Du kan skapa en instans sjÀlv och arbeta lokalt. Det Àr förresten vad vi gör. Jag gör det hÀr pÄ Getlab, dÀr pÄ GSP. Men vi ser inte poÀngen med att göra just en sÄdan orkestrering Ànnu, eftersom Google inte har billiga platser. Det finns ??? fall, men de har begrÀnsningar. För det första har de alltid bara 70 % rabatt och du kan inte spela med priset dÀr. PÄ spots höjer vi priset med 5-10% för att minska sannolikheten att du blir sparkad. Det vill sÀga du sparar flÀckar, men de kan tas ifrÄn dig nÀr som helst. Om du bjuder lite högre Àn vad andra gör, kommer du att dödas senare. Google har helt andra detaljer. Och det finns en annan mycket dÄlig begrÀnsning - de lever bara i 24 timmar. Och ibland vill vi köra ett experiment i 5 dagar. Men du kan göra detta pÄ flÀckar, flÀckar varar ibland i mÄnader.
HallÄ! Tack för rapporten! Du nÀmnde kontroll. Hur berÀknar man stat_statements-fel?
Mycket bra frÄga. Jag kan visa och berÀtta i detalj. Kortfattat tittar vi pÄ hur uppsÀttningen av förfrÄgningsgrupper har flutit: hur mÄnga har fallit av och hur mÄnga nya som har dykt upp. Och sedan tittar vi pÄ tvÄ mÀtvÀrden: total_time och calls, sÄ det finns tvÄ fel. Och vi tittar pÄ de flytande gruppernas bidrag. Det finns tvÄ undergrupper: de som lÀmnade och de som kom. LÄt oss se vad deras bidrag Àr till helhetsbilden.
Ăr du inte rĂ€dd att den ska vĂ€nda dit tvĂ„ eller tre gĂ„nger under tiden mellan ögonblicksbilderna?
Dvs registrerade de sig igen eller vad?
Till exempel har denna begÀran redan förhandsregistrerats en gÄng, sedan kom den och förköptes igen, sedan kom den igen och förköptes igen. Och du rÀknade ut nÄgot hÀr, och var Àr allt?
Bra frÄga, vi fÄr titta.
Jag gjorde en liknande sak. Det var enklare sÄklart, jag gjorde det ensam. Men jag var tvungen att ÄterstÀlla, ÄterstÀlla stat_statements och ta reda pÄ vid tidpunkten för ögonblicksbilden att det fanns mindre Àn en viss brÄkdel, som fortfarande inte nÄdde taket för hur mycket stat_statements kunde ackumuleras dÀr. Och min uppfattning Àr att, med största sannolikhet, ingenting fördrevs.
Jaja.
Men jag förstÄr inte hur man annars ska göra det pÄ ett tillförlitligt sÀtt.
TyvĂ€rr kommer jag inte ihĂ„g exakt om vi anvĂ€nder frĂ„getexten dĂ€r eller queryid med pg_stat_statements och fokuserar pĂ„ det. Om vi ââfokuserar pĂ„ queryid, sĂ„ jĂ€mför vi i teorin jĂ€mförbara saker.
Nej, han kan tvingas ut flera gÄnger mellan ögonblicksbilderna och komma igen.
Med samma id?
Ja.
Vi ska studera detta. Bra frÄga. Vi mÄste studera det. Men för tillfÀllet skrivs det vi ser antingen 0...
Detta Àr naturligtvis ett sÀllsynt fall, men jag blev chockad nÀr jag fick reda pÄ att stat_statemetns kan förskjuta dit.
Det kan finnas mÄnga saker i Pg_stat_statements. Vi stötte pÄ det faktum att om du har track_utility = pÄ sÄ spÄras Àven dina set.
Ja visst.
Och om du har java hibernate, vilket Àr slumpmÀssigt, sÄ börjar hashtabellen finnas dÀr. Och sÄ fort du stÀnger av en vÀldigt laddad applikation hamnar du pÄ 50-100 grupper. Och allt Àr mer eller mindre stabilt dÀr. Ett sÀtt att bekÀmpa detta Àr att öka pg_stat_statements.max.
Ja, men du mÄste veta hur mycket. Och pÄ nÄgot sÀtt mÄste vi hÄlla ett öga pÄ honom. Det Àr vad jag gör. Det vill sÀga jag har pg_stat_statements.max. Och jag ser att jag vid ögonblicksbilden inte hade nÄtt 70%. Okej, sÄ vi har inte förlorat nÄgot. LÄt oss ÄterstÀlla. Och vi sparar igen. Om nÀsta ögonblicksbild Àr mindre Àn 70, har du troligen inte förlorat nÄgot igen.
Ja. StandardinstÀllningen Àr nu 5 000. Och detta rÀcker för mÄnga.
Vanligtvis ja.
videor:
PS För min egen rÀkning vill jag tillÀgga att om Postgres innehÄller konfidentiell data och den inte kan inkluderas i testmiljön, sÄ kan du anvÀnda
KĂ€lla: will.com