PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Architektura i dostrajanie pamięci w bazach danych PostgreSQL

Zarządzanie pamięcią w PostgreSQL jest ważne dla poprawy wydajności serwera bazy danych. Plik konfiguracyjny PostgreSQL (postgres.conf) zarządza konfiguracją serwera bazy danych. Używa domyślnych wartości parametrów, ale możemy zmienić te wartości, aby lepiej odzwierciedlały obciążenie pracą i środowisko operacyjne.

W tym blogu omówimy te parametry związane z pamięcią. Ale zanim zaczniemy, spójrzmy na architekturę pamięci w PostgreSQL.

Architektura pamięci

Pamięć w PostgreSQL można podzielić na dwie kategorie:

  1. Obszar pamięci lokalnej:jest przydzielany przez każdy proces backendu do własnego użytku.
  2. Obszar pamięci współdzielonej:jest używany przez wszystkie procesy serwera PostgreSQL.

Obszar pamięci lokalnej

W PostgreSQL każdy proces zaplecza alokuje pamięć lokalną do przetwarzania zapytań; każdy obszar jest podzielony na podobszary, których rozmiary są stałe lub zmienne.

Podobszary są następujące.

Pamięć_pracy

Executor używa tego obszaru do sortowania krotek według operacji ORDER BY i DISTINCT. Używa go również do łączenia tabel za pomocą operacji łączenia i łączenia mieszającego.

Maintenance_work_mem

Ten parametr jest używany do niektórych rodzajów operacji konserwacyjnych (PRÓŻNIA, REINDEX).

Bufory_temperatury

Executor używa tego obszaru do przechowywania tabel tymczasowych.

Obszar pamięci współdzielonej

Obszar pamięci współdzielonej jest przydzielany przez serwer PostgreSQL podczas jego uruchamiania. Obszar ten jest podzielony na kilka podobszarów o stałej wielkości.

Wspólna pula buforów

PostgreSQL ładuje strony w tabelach i indeksach z pamięci trwałej do współdzielonej puli buforów, a następnie operuje na nich bezpośrednio.

Bufor WAL

PostgreSQL obsługuje mechanizm WAL (zapis z wyprzedzeniem) w celu zapewnienia, że ​​żadne dane nie zostaną utracone po awarii serwera. Dane WAL to tak naprawdę dziennik transakcji w PostgreSQL, a bufor WAL to obszar buforowania danych WAL przed zapisaniem ich w pamięci trwałej.

Dziennik zatwierdzeń

Dziennik zatwierdzania (CLOG) przechowuje stany wszystkich transakcji i jest częścią mechanizmu kontroli współbieżności. Dziennik zatwierdzania jest przydzielany do pamięci współdzielonej i używany podczas przetwarzania transakcji.

PostgreSQL definiuje następujące cztery stany transakcji.

  1. IN_PROGRESS
  2. ZAANGAŻOWANY
  3. PRZERWAŁA
  4. ZDECYDOWANO
Pobierz oficjalny dokument już dziś Zarządzanie i automatyzacja PostgreSQL za pomocą ClusterControlDowiedz się, co musisz wiedzieć, aby wdrażać, monitorować, zarządzać i skalować PostgreSQLPobierz oficjalny dokument

Dostrajanie parametrów pamięci PostgreSQL

Istnieje kilka ważnych parametrów, które są zalecane do zarządzania pamięcią w PostgreSQL. Należy wziąć pod uwagę następujące kwestie.

Shared_buffers

Ten parametr określa ilość pamięci używanej przez bufory pamięci współdzielonej. Parametr shared_buffers określa, ile pamięci jest przeznaczonej na serwer do buforowania danych. Domyślna wartość shared_buffers wynosi zwykle 128 megabajtów (128 MB).

Domyślna wartość tego parametru jest bardzo niska, ponieważ na niektórych platformach, takich jak starsze wersje Solaris i SGI, posiadanie dużych wartości wymaga inwazyjnych działań, takich jak rekompilacja jądra. Nawet w nowoczesnych systemach Linux jądro prawdopodobnie nie pozwoli na ustawienie shared_buffers na ponad 32 MB bez uprzedniego dostosowania ustawień jądra.

Mechanizm został zmieniony w PostgreSQL 9.4 i późniejszych, więc ustawienia jądra nie będą tam musiały być zmieniane.

Jeśli serwer bazy danych jest mocno obciążony, ustawienie wysokiej wartości poprawi wydajność.

Jeśli masz dedykowany serwer DB z 1 GB lub więcej pamięci RAM, rozsądną wartością początkową parametru konfiguracyjnego shared_buffer jest 25% pamięci w twoim systemie.

Domyślna wartość shared_buffers =128 MB. Zmiana wymaga ponownego uruchomienia serwera PostgreSQL.

Ogólne zalecenie dotyczące ustawienia shared_buffers jest następujące.

  • Poniżej 2 GB pamięci ustaw wartość shared_buffers na 20% całkowitej pamięci systemowej.
  • Poniżej 32 GB pamięci ustaw wartość shared_buffers na 25% całkowitej pamięci systemowej.
  • Powyżej 32 GB pamięci ustaw wartość shared_buffers na 8 GB

Pamięć_pracy

Ten parametr określa ilość pamięci, jaka ma być używana przez wewnętrzne operacje sortowania i tablice mieszania przed zapisaniem do tymczasowych plików dyskowych. Jeśli dzieje się wiele złożonych sortowań i masz wystarczającą ilość pamięci, zwiększenie parametru work_mem umożliwia PostgreSQLowi wykonywanie większych sortowań w pamięci, które będą szybsze niż odpowiedniki oparte na dyskach.

Należy zauważyć, że w przypadku złożonego zapytania wiele operacji sortowania lub mieszania może działać równolegle. Każda operacja będzie mogła wykorzystać tyle pamięci, ile określa ta wartość, zanim zacznie zapisywać dane w plikach tymczasowych. Istnieje jedna możliwość, że kilka sesji może wykonywać takie operacje jednocześnie. Dlatego całkowita używana pamięć może być wielokrotnie większa niż wartość parametru work_mem.

Proszę o tym pamiętać wybierając odpowiednią wartość. Operacje sortowania są używane dla złączeń ORDER BY, DISTINCT i scalających. Tabele haszujące są używane w łączeniach haszujących, przetwarzaniu podzapytań IN w oparciu o hash i agregacji w oparciu o hash.

Parametr log_temp_files może być używany do rejestrowania sortowań, skrótów i plików tymczasowych, które mogą być przydatne w ustaleniu, czy sortowania rozlewają się na dysk zamiast mieścić się w pamięci. Możesz sprawdzić, jakie sorty rozlewają się na dysk, korzystając z planów WYJAŚNIJ ANALIZĘ. Na przykład w danych wyjściowych EXPLAIN ANALYZE, jeśli zobaczysz wiersz taki jak:„Metoda sortowania:scalanie zewnętrzne Dysk:7528kB ”, pamięć robocza o wielkości co najmniej 8 MB utrzymałaby dane pośrednie w pamięci i poprawiłaby czas odpowiedzi na zapytanie.

Domyślna wartość work_mem =4 MB.

Ogólne zalecenie dotyczące ustawienia work_mem jest następujące.

  • Zacznij od niskiej wartości:32-64 MB
  • Następnie poszukaj wierszy „plik tymczasowy” w logach
  • Ustaw na 2-3-krotność największego pliku tymczasowego

konserwacja _work_mem

Ten parametr określa maksymalną ilość pamięci używanej przez operacje konserwacyjne, takie jak VACUUM, CREATE INDEX i ALTER TABLE ADD FOREIGN KEY. Ponieważ tylko jedna z tych operacji może być wykonana na raz przez sesję bazy danych, a instalacja PostgreSQL nie ma wielu z nich działających jednocześnie, bezpiecznie jest ustawić wartość maintenance_work_mem znacznie większą niż work_mem.

Ustawienie większej wartości może poprawić wydajność odkurzania i przywracania zrzutów bazy danych.

Należy pamiętać, że po uruchomieniu autovacuum do autovacuum_max_workers ta pamięć może zostać przydzielona, ​​więc uważaj, aby nie ustawić domyślnej wartości zbyt wysokiej.

Domyślna wartość maintenance_work_mem =64MB.

Ogólne zalecenie dotyczące ustawienia maintenance_work_mem jest następujące.

  • Ustaw wartość 10% pamięci systemowej, do 1 GB
  • Może możesz ustawić go jeszcze wyżej, jeśli masz problemy z PRÓŻNIĄ

Effective_cache_size

Efektywny rozmiar pamięci podręcznej powinien być ustawiony na szacunkową ilość pamięci dostępnej do buforowania dysku przez system operacyjny i samą bazę danych. Jest to wskazówka dotycząca oczekiwanej ilości pamięci dostępnej w systemie operacyjnym i buforach PostgreSQL, a nie alokacji.

Planer zapytań PostgreSQL używa tej wartości, aby dowiedzieć się, czy plany, które rozważa, powinny zmieścić się w pamięci RAM, czy nie. Jeśli jest ustawiony zbyt nisko, indeksy mogą nie być używane do wykonywania zapytań w sposób oczekiwany. Ponieważ większość systemów Unix jest dość agresywna podczas buforowania, co najmniej 50% dostępnej pamięci RAM na dedykowanym serwerze bazy danych będzie pełne buforowanych danych.

Ogólne zalecenie dotyczące efektywnego_rozmiaru_cache jest następujące.

  • Ustaw wartość na ilość dostępnej pamięci podręcznej systemu plików
  • Jeśli nie wiesz, ustaw wartość na 50% całkowitej pamięci systemowej

Domyślna wartość Effective_cache_size =4 GB.

Bufory_temperatury

Ten parametr określa maksymalną liczbę buforów tymczasowych używanych przez każdą sesję bazy danych. Bufory lokalne sesji są używane tylko do dostępu do tabel tymczasowych. Ustawienie tego parametru można zmienić w ramach poszczególnych sesji, ale tylko przed pierwszym użyciem tabel tymczasowych w ramach sesji.

Baza danych PostgreSQL wykorzystuje ten obszar pamięci do przechowywania tymczasowych tabel każdej sesji, zostaną one wyczyszczone po zamknięciu połączenia.

Domyślna wartość temp_buffer =8MB.

Wniosek

Zrozumienie architektury pamięci i dostrojenie odpowiednich parametrów jest ważne dla poprawy wydajności. Jest to szczególnie konieczne w przypadku systemów o dużym obciążeniu pracą. Aby uzyskać więcej ogólnych wskazówek dotyczących dostrajania wydajności, przejrzyj tę ściągawkę dotyczącą wydajności PostgreSQL.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wybierz liczbę wierszy w innej tabeli w instrukcji Postgres SELECT

  2. java.math.BigInteger nie można rzutować na java.lang.Integer

  3. Ulepszenia partycjonowania w PostgreSQL 11

  4. Jak połączyć Struts 2 z Hibernate i PostgreSQL?

  5. Dodaj kolumnę sygnatury czasowej z domyślną funkcją NOW() tylko dla nowych wierszy