Zrozumienie pamięci współdzielonej PostgreSQL

Ukończone

Usługa PostgreSQL używa pamięci, którą można sklasyfikować jako:

  • Pamięć lokalna — przydzielona do każdego procesu
  • Pamięć współdzielona — używana przez wszystkie procesy

Pamięć lokalna

Każdy proces w usłudze PostgreSQL wymaga pamięci do przetwarzania zapytań. Następujące parametry serwera umożliwiają zdefiniowanie użycia pamięci:

work_mem definiuje pamięć wymaganą do sortowania krotek używanych w operacjach ORDER BY i DISTINCT. Ten parametr określa ilość pamięci dostępnej dla operacji sortowania wewnętrznego i tabel skrótów. Jeśli masz dużą ilość dostępnej pamięci, a obciążenie ma zapytania ze złożonym sortowaniem, zwiększenie tej wartości parametru może zwiększyć wydajność, umożliwiając większe skanowanie w pamięci przed rozlaniem na dysk.

Jednak jedno złożone zapytanie może mieć wiele operacji sortowania i skrótów uruchomionych współbieżnie. Każda operacja używa tak dużej ilości pamięci, jak ta wartość umożliwia przed rozpoczęciem zapisywania na dyskach plików tymczasowych. Dlatego w obciążonym systemie łączna ilość używanej pamięci jest wielokrotnie większa niż w przypadku pojedynczego parametru work_mem.

Aby dostroić tę wartość, użyj wartości Total RAM * 0,25 / max_connections jako wartości początkowej.

maintenance_work_mem to pamięć wymagana przez vacuumowanie i ponowne indeksowanie. Ten parametr określa ilość pamięci dostępnej dla operacji sortowania wewnętrznego i tabel skrótów. Wartość domyślna to 64 KB, ale zwiększenie tej wartości zwiększa wydajność czyszczenia.

autovacuum_work_mem ustawia maksymalną ilość pamięci, jaka ma być wykorzystywana przez każdy proces autovacuum.

temp_buffers definiuje pamięć do przechowywania tabel tymczasowych. Ten parametr ustawia maksymalną liczbę tymczasowych buforów używanych przez każdą sesję bazy danych.

effective_cache_size definiuje ilość dostępnej pamięci do buforowania dysku przez system operacyjny i w bazie danych. Planista zapytań PostgreSQL określa, czy ta pamięć jest ustawiona w pamięci RAM. Skanowanie indeksów najprawdopodobniej będzie używane względem wyższych wartości; w przeciwnym razie są używane skanowania sekwencyjne, jeśli wartość jest niska.

Ustaw effective_cache_size na 50% całkowitej pamięci RAM maszyny.

Pamięć udostępniona

Pamięć udostępniona jest przydzielana podczas uruchamiania. Pamięć udostępniona jest używana dla:

shared_buffers definiuje bufory pamięci współdzielonej używane przez serwer. PostgreSQL ładuje strony tabel i indeksów z magazynu trwałego do wspólnej puli buforowej, a następnie przetwarza je w pamięci. Ta współdzielona pula buforów jest głównym składnikiem pamięci współdzielonej używanej przez serwer. Wartość domyślna to 128 MB (w zależności od warstwy obliczeniowej). Jeśli zdecydujesz się przydzielić więcej pamięci, musisz ponownie uruchomić serwer.

wal_buffers definiuje liczbę buforów stron dyskowych w pamięci współdzielonej na potrzeby zapisywania dzienników z wyprzedzeniem (WAL) przed zapisaniem go w magazynie trwałym.

Podsumowując, ważne parametry serwera odnoszące się do pamięci, które można dostroić, to:

  • bufory współdzielone
  • pamięć robocza
  • efektywny_rozmiar_pamięci_podręcznej