Înțelegerea memoriei partajate PostgreSQL
PostgreSQL utilizează memorie care poate fi clasificată ca:
- memoriei locale - alocată fiecărui proces
- Memorie partajată - utilizată de toate procesele
Memorie locală
Fiecare proces din PostgreSQL necesită memorie pentru procesarea interogărilor. Următorii parametri de server vă permit să definiți utilizarea memoriei:
work_mem definește memoria necesară pentru sortarea tuple-uri pentru operațiunile ORDER BY și DISTINCT. Acest parametru determină cantitatea de memorie disponibilă pentru operațiunile de sortare internă și tabelele hash. Dacă aveți o cantitate mare de memorie disponibilă și volumul de lucru are interogări cu sortare complexă, creșterea acestei valori de parametru ar putea îmbunătăți performanța, permițând scanări mai mari în memorie înainte de a vărsa pe disc.
Totuși, o interogare complexă poate avea mai multe operațiuni de sortare și hash care rulează în același timp. Fiecare operațiune utilizează câtă memorie permite această valoare înainte de a începe să scrie pe fișiere temporare bazate pe disc. Într-un sistem ocupat, prin urmare, utilizarea totală a memoriei este de multe ori cea a unui parametru work_mem individual.
Pentru a regla această valoare, utilizați Ram total * 0,25 / max_connections ca valoare inițială.
maintenance_work_mem este memoria solicitată de vid și reindexați. Acest parametru determină cantitatea de memorie disponibilă pentru operațiunile de sortare internă și tabelele hash. Valoarea implicită este de 64 KB, dar mărirea acestei valori îmbunătățește performanța pentru aspirare.
autovacuum_work_mem setează memoria maximă de utilizat de fiecare proces de autovacuum.
temp_buffers definește memoria pentru stocarea tabelelor temporare. Acest parametru setează numărul maxim de tampoane temporare utilizate de fiecare sesiune a bazei de date.
effective_cache_size definește cantitatea de memorie disponibilă pentru memorarea în cache a discului de către sistemul de operare și din baza de date. Planificatorul de interogări PostgreSQL determină dacă această memorie este fixă în RAM. Scanările de index sunt cel mai probabil utilizate în raport cu valori mai mari; în caz contrar, se utilizează scanări secvențiale dacă valoarea este scăzută.
Setați effective_cache_size la 50% din totalul ram al computerului.
Memorie partajată
Memoria partajată este alocată la pornire. Memoria partajată este utilizată pentru:
shared_buffers definește tampoanele de memorie partajate utilizate de server. PostgreSQL încarcă pagini de tabele și indexuri din stocarea persistentă într-un rezervor de tampon partajat, apoi funcționează în memorie. Acest rezervor tampon partajat este componenta majoră a memoriei partajate utilizate de server. Valoarea implicită este de 128 MB (în funcție de nivelul de calcul). Dacă decideți să alocați mai multă memorie, trebuie să reporniți serverul.
wal_buffers definește numărul de tampoane de pagină de disc din memoria partajată pentru scrierea în jurnal înainte de scriere (WAL) înainte de a scrie în spațiul de stocare persistent.
În rezumat, parametrii de server importanți referitori la memoria pe care ați putea dori să o reglați sunt:
- shared_buffers
- work_mem
- effective_cache_size