En industriell metod för att trimma PostgreSQL: experiment med databaser." Nikolay Samokhvalov

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Ä:

  1. 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,
  2. djup förstÄelse för funktionerna i DBMS och OS.

AnvÀnder Nancy CLI (https://gitlab.com/postgres.ai/nancy), kommer vi att titta pÄ ett specifikt exempel - de ökÀnda shared_buffers - i olika situationer, i olika projekt och försöka ta reda pÄ hur man vÀljer den optimala instÀllningen för vÄr infrastruktur, databas och belastning.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

Vi kommer att prata om experiment med databaser. Det hÀr Àr en historia som varar i drygt ett halvÄr.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

Och under de senaste Ären har jag startat om min Postgres konsultverksamhet 11 tidszoner hÀrifrÄn.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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".

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

Hur utvecklas allt detta?

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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?

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

  • 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).

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

Vi lanserar ett experiment. HÀr Àr pg_stat_statements. Till vÀnster Àr vad som hÀnde. Till höger - vad hÀnde.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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%.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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"

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

Nancy – Det Ă€r i öppen kĂ€llkod, pĂ„ Gitlab. Du kan sĂ€ga det, du kan prova. Jag gav en lĂ€nk i bilderna. Du kan klicka pĂ„ den sĂ„ kommer den att finnas dĂ€r hjĂ€lpa i alla avseenden.

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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Ä.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

  • 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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

  • 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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

Vilka Àr de tekniska svÄrigheterna utifrÄn exemplet frÄn olika företag?

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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?

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

https://gist.github.com/NikolayS/08d9b7b4845371d03e195a8d8df43408

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

Men! Faktum Àr att det finns olika loggningssystem. Och folks standard Àr vanligtvis "syslog".

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

  • UtvĂ€rdera IOPS och skrivflöde.
  • Kontrollera ditt loggningssystem.
  • Om den berĂ€knade belastningen Ă€r för stor, övervĂ€g provtagning.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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 postgres-checkup. Även en bas i öppen kĂ€llkod. Och vi utvecklar det nu aktivt.

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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.

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

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 PostgreSQL Anonymizer. Schemat Àr ungefÀr som följer:

Industriell instÀllning till PostgreSQL-instÀllning: experiment pÄ databaser." Nikolay Samokhvalov

KĂ€lla: will.com

LĂ€gg en kommentar