sql >> Database teknologi >  >> RDS >> PostgreSQL

Arkitektur og indstilling af hukommelse i PostgreSQL-databaser

Hukommelsesstyring i PostgreSQL er vigtig for at forbedre ydeevnen af ​​databaseserveren. PostgreSQL-konfigurationsfilen (postgres.conf) styrer konfigurationen af ​​databaseserveren. Den bruger standardværdier for parametrene, men vi kan ændre disse værdier for bedre at afspejle arbejdsbelastning og driftsmiljø.

I denne blog vil vi dække disse hukommelsesrelaterede parametre. Men før vi starter, lad os tage et kig på hukommelsesarkitekturen i PostgreSQL.

Hukommelsesarkitektur

Hukommelse i PostgreSQL kan klassificeres i to kategorier:

  1. Lokalt hukommelsesområde:Det tildeles af hver backend-proces til eget brug.
  2. Delt hukommelsesområde:Det bruges af alle processer på en PostgreSQL-server.

Lokalt hukommelsesområde

I PostgreSQL allokerer hver backend-proces lokal hukommelse til forespørgselsbehandling; hvert område er opdelt i underområder, hvis størrelse er enten fast eller variabel.

Underområderne er som følger.

Work_mem

Eksekutøren bruger dette område til at sortere tupler efter ORDER BY og DISTINCT operationer. Det bruger det også til at forbinde tabeller ved at flette-join og hash-join-operationer.

Maintenance_work_mem

Denne parameter bruges til nogle former for vedligeholdelsesoperationer (VACUUM, REINDEX).

Temp_buffere

Eksekveren bruger dette område til lagring af midlertidige tabeller.

Delt hukommelsesområde

Delt hukommelsesområde tildeles af PostgreSQL-serveren, når den starter op. Disse områder er opdelt i flere underområder med fast størrelse.

Delt bufferpulje

PostgreSQL indlæser sider i tabeller og indekser fra vedvarende lagring til en delt bufferpulje og opererer derefter direkte på dem.

WAL buffer

PostgreSQL understøtter WAL (Write ahead log) mekanismen for at sikre, at ingen data går tabt efter en serverfejl. WAL-data er virkelig en transaktionslog i PostgreSQL, og WAL-buffer er et bufferområde af WAL-dataene, før de skrives til et vedvarende lager.

Forpligtelseslog

Forpligtelsesloggen (CLOG) beholder tilstanden for alle transaktioner og er en del af samtidighedskontrolmekanismen. Commit-loggen allokeres til den delte hukommelse og bruges under transaktionsbehandlingen.

PostgreSQL definerer følgende fire transaktionstilstande.

  1. IN_PROGRESS
  2. ENGAGEMENT
  3. AFBRUDT
  4. UNDERKOMMITTET
Download Whitepaper Today PostgreSQL Management &Automation med ClusterControlFå flere oplysninger om, hvad du skal vide for at implementere, overvåge, administrere og skalere PostgreSQLDownload Whitepaper

Justering af PostgreSQL-hukommelsesparametre

Der er nogle vigtige parametre, som anbefales til hukommelsesstyring i PostgreSQL. Du bør tage højde for følgende.

Delte_buffere

Denne parameter angiver mængden af ​​hukommelse, der bruges til delte hukommelsesbuffere. Parameteren shared_buffers bestemmer, hvor meget hukommelse der er dedikeret til serveren til caching af data. Standardværdien for shared_buffers er typisk 128 megabyte (128 MB).

Standardværdien af ​​denne parameter er meget lav, fordi på nogle platforme, såsom ældre Solaris-versioner og SGI, kræver det invasive handlinger at have store værdier, såsom genkompilering af kernen. Selv på de moderne Linux-systemer vil kernen sandsynligvis ikke tillade indstilling af shared_buffers til over 32 MB uden først at justere kerneindstillingerne.

Mekanismen er ændret i PostgreSQL 9.4 og senere, så kerneindstillinger skal ikke justeres der.

Hvis der er høj belastning på databaseserveren, vil en høj værdi forbedre ydeevnen.

Hvis du har en dedikeret DB-server med 1 GB eller mere RAM, er en rimelig startværdi for shared_buffer-konfigurationsparameteren 25 % af hukommelsen i dit system.

Standardværdien for shared_buffers =128 MB. Ændringen kræver genstart af PostgreSQL-serveren.

Generel anbefaling til at indstille shared_buffers er som følger.

  • Under 2 GB hukommelse skal du indstille værdien af ​​shared_buffers til 20 % af den samlede systemhukommelse.
  • Under 32 GB hukommelse skal du indstille værdien af ​​shared_buffers til 25 % af den samlede systemhukommelse.
  • Over 32 GB hukommelse skal du indstille værdien af ​​shared_buffers til 8 GB

Work_mem

Denne parameter angiver mængden af ​​hukommelse, der skal bruges af interne sorteringsoperationer og hashtabeller, før der skrives til midlertidige diskfiler. Hvis der sker en masse komplekse sorteringer, og du har nok hukommelse, så gør en forøgelse af work_mem parameteren det muligt for PostgreSQL at udføre større sorteringer i hukommelsen, som vil være hurtigere end diskbaserede ækvivalenter.

Bemærk, at for en kompleks forespørgsel kan mange sorterings- eller hash-handlinger køre parallelt. Hver handling får lov til at bruge så meget hukommelse, som denne værdi angiver, før den begynder at skrive data ind i de midlertidige filer. Der er én mulighed for, at flere sessioner kan udføre sådanne operationer samtidigt. Derfor kunne den samlede brugte hukommelse være mange gange værdien af ​​parameteren work_mem.

Husk det, når du vælger den rigtige værdi. Sorteringsoperationer bruges til ORDER BY, DISTINCT og merge joins. Hash-tabeller bruges i hash-joins, hash-baseret behandling af IN-underforespørgsler og hash-baseret aggregering.

Parameteren log_temp_files kan bruges til at logge sorteringer, hashes og midlertidige filer, hvilket kan være nyttigt til at finde ud af, om sorteringer spildes til disken i stedet for at passe ind i hukommelsen. Du kan kontrollere de sorter, der spildes til disken ved at bruge EXPLAIN ANALYZE-planer. For eksempel, i outputtet af EXPLAIN ANALYZE, hvis du ser linjen som:"Sorteringsmetode:ekstern flet disk:7528kB ”, ville et work_mem på mindst 8 MB beholde de mellemliggende data i hukommelsen og forbedre forespørgslens responstid.

Standardværdien for work_mem =4MB.

Generel anbefaling for at indstille work_mem er som følger.

  • Start med lav værdi:32-64 MB
  • Søg derefter efter 'midlertidig fil'-linjer i logfiler
  • Indstil til 2-3 gange den største midlertidige fil

vedligeholdelse _work_mem

Denne parameter angiver den maksimale mængde hukommelse, der bruges til vedligeholdelsesoperationer såsom VACUUM, CREATE INDEX og ALTER TABLE ADD FOREIGN KEY. Da kun én af disse operationer kan udføres ad gangen af ​​en databasesession, og en PostgreSQL-installation ikke har mange af dem kørende samtidigt, er det sikkert at sætte værdien af ​​maintenance_work_mem væsentligt større end work_mem.

Indstilling af den større værdi kan muligvis forbedre ydeevnen for støvsugning og gendannelse af databasedumps.

Det er nødvendigt at huske, at når autovacuum kører, kan denne hukommelse tildeles op til autovacuum_max_workers gange, så vær forsigtig med ikke at indstille standardværdien for høj.

Standardværdien for maintenance_work_mem =64MB.

Generel anbefaling til at indstille maintenance_work_mem er som følger.

  • Indstil værdien til 10 % af systemhukommelsen, op til 1 GB
  • Måske kan du indstille den endnu højere, hvis du har problemer med VAKUUM

Effektiv_cachestørrelse

Effective_cache_size bør indstilles til et estimat af, hvor meget hukommelse der er tilgængelig til diskcache af operativsystemet og i selve databasen. Dette er en retningslinje for, hvor meget hukommelse du forventer at være tilgængelig i operativsystemet og PostgreSQL buffer caches, ikke en tildeling.

PostgreSQL-forespørgselsplanlæggeren bruger denne værdi til at finde ud af, om de planer, den overvejer, forventes at passe i RAM eller ej. Hvis det er sat for lavt, bruges indekser muligvis ikke til at udføre forespørgsler, som du ville forvente. Da de fleste Unix-systemer er ret aggressive ved cachelagring, vil mindst 50 % af den tilgængelige RAM på en dedikeret databaseserver være fuld af cachelagrede data.

Generel anbefaling for effektiv_cache_størrelse er som følger.

  • Indstil værdien til mængden af ​​tilgængelig filsystemcache
  • Hvis du ikke ved det, skal du indstille værdien til 50 % af den samlede systemhukommelse

Standardværdien for effective_cache_size =4 GB.

Temp_buffere

Denne parameter indstiller det maksimale antal midlertidige buffere, der bruges af hver databasesession. Sessionens lokale buffere bruges kun til adgang til midlertidige tabeller. Indstillingen af ​​denne parameter kan ændres inden for individuelle sessioner, men kun før den første brug af midlertidige tabeller i sessionen.

PostgreSQL-databasen bruger dette hukommelsesområde til at opbevare de midlertidige tabeller for hver session, disse vil blive ryddet, når forbindelsen lukkes.

Standardværdien for temp_buffer =8MB.

Konklusion

Det er vigtigt at forstå hukommelsesarkitekturen og justere de relevante parametre for at forbedre ydeevnen. Dette er især nødvendigt for systemer med høj arbejdsbelastning. For flere generiske tip til justering af ydeevne, bedes du gennemgå dette præstationssnydeark for PostgreSQL.


  1. Enkel måde at beregne medianen med MySQL

  2. hvordan udfører man Stored Procedure i SQL Developer?

  3. Importer MySQL-dump til PostgreSQL-databasen

  4. En guide til MySQL Galera Cluster Streaming Replikering:Første del