Tuning Ubuntu/ Debian pod PostgreSQL

Tomasz Gintowt
3 min readJul 2, 2021

--

TL:DR Znajdziesz tutaj moje propozycje jak zmienić parametry Ubuntu/Debian pod serwer z PostgreSQL.

PostgreSQL to jedna z moich ulubionych baz danych, mam wewnętrzny sentyment do Słonia. Postanowiłem znaleźć trochę czasu i spisać w jednym parametry Linux, które warto zmienić na serwerze z PG. Przypominam, że skupiamy się na ustawieniach OS.

Da się szybciej

Za konfigurację parametrów systemowych odpowiada sysctl, są dwie możliwości. Pierwsza dodamy wpisy do /etc/sysctl.conf lub stworzymy własny plik w /etc/sysctl.d/40-postgresql.conf. Jako ciekawostkę dodam, że jeżeli instalowałeś PG z repo, to istnieje już jeden plik w sysctl dotyczący PG, jest /etc/sysctl.d/30-postgresql-shm.conf gdzie możemy zmienić parametry dotyczące shared memory. Do pliku 40-postgresql.conf przeklejamy:

vm.swappiness = 1
vm.dirty_expire_centisecs = 500
vm.dirty_writeback_centisecs = 250
vm.dirty_ratio = 10
vm.dirty_background_ratio = 3
vm.overcommit_memory=2
net.ipv4.tcp_timestamps=0
overcommit_ratio=85
vm.nr_hugepages=1300

Kilka słów wyjaśnień. Parametr vm.swappiness odpowiada za to kiedy Linux będzie wykorzystywał SWAP. Defaultową wartością jest 60, jeżeli mamy 10G Ramu to 10 * 60% = 6G to przekroczeniu tej wartości system zacznie używać SWAP. Jak wiemy, nie jest to najlepsza opcja, SWAP jest wolny, ponieważ jest to najczęściej zwykły dysk. Dlatego chcemy ograniczyć używanie SWAP, 1 jest wartością bezpieczną, w krytycznych momentach system użyje SWAP ale będzie bardziej wykorzystywał RAM. Nie zdziw się, jeśli na swoim monitoringu nagle wzrośnie zużycie pamięci, właśnie taki jest cel tej zmiany. Częściej używamy RAM, rzadziej SWAP.

Kolejne dwa parametry vm.dirty_expire_centisecs oraz vm.dirty_writeback_centisecs to są bardzo ciekawe parametry, ze względu na swoją jednostkę. Nie czuje się na siłach przetłumaczyć opisu, wklejam oryginał “is used to define when dirty data is old enough to be eligible for writeout by the kernel flusher threads. It is expressed in 100'ths of a second.”

Dzięki podpowiedzi Alicja Kucharczyk dodałem jeszcze parametr overcommit_ratio, który liczymy w następujący sposób:

overcommit_ratio < (RAM - swap) / RAM * 100

Dokładny opis wszystkich zmienionych parametrów znajdziesz w dokumentacji.

Zaczytujemy zmiany, które wprowadziliśmy poleceniem:

sysctl --system

Jak, możemy monitorować zmiany ?

$ cat /proc/meminfo | egrep -i "write|cache|dirty"
Cached: 9956512 kB
SwapCached: 1756 kB
Dirty: 60 kB
Writeback: 4 kB
WritebackTmp: 0 kB
$ cat /proc/vmstat | egrep -i "dirty|writeback|cache"
nr_dirty 1396
nr_writeback 0
nr_writeback_temp 0
nr_dirty_threshold 671496
nr_dirty_background_threshold 335338
drop_pagecache 0

Transparent hugepages

Pamiętaj, że jest różnica pomiędzy transparent hugepages and hugepages. THP są alokowane dynamicznie przy starcie systemu i dodatkowo podlegają swapowaniu. Może powodować tospadek wydajności OS, a jak już wiemy bazy danych nie lubią swapa. Żeby wyłączyć THP trzeba zmienić ustawienia GRUB w pliku /etc/default/grub edytujemy linię:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

dodajemy transparent_hugepage=never

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash transparent_hugepage=never"

U Ciebie może to wyglądać inaczej, być więcej parametrów. Teraz REBOOT który zaczyta zmiany:

update-grub
systemctl start reboot.target

File system

Ja, najczęściej używam XFS, dodanie dwóch opcji noatime,nodiratime na początek zazwyczaj wystarczy.

/dev/sdb /var/lib/postgresql xfs defaults,noatime,nodiratime        0 1

Dostępnych opcji jest dużo więcej, dwie wskazane traktuje jako dobry start. Można te zmiany wprowadzić w locie

mount -o remount,noatime,nodiratime /var/lib/postgresql

Huge pages

Na początek potrzebujemy PID procesu postmastera oraz wartości VmPeak

head -n 1 /var/lib/postgresql/*/main/postmaster.pid
2662462
grep -i vmpeak /proc/2662462/status
VmPeak: 2257744 kB

Sprawdźmy, wielkość HP w naszym OS

grep -i hugepagesize /proc/meminfo
Hugepagesize: 2048 kB

Teraz policzmy, ile potrzebujemy HP

2257744 / 2048 = 1102,41

Warto dać trochę zapasu, więc ustawmy 1300 HP.

UWAGA! Wartość HP zależy od ilości pamięci w serwerze, nie kopiuj bezmyślnie, tylko zmień na wartości odpowiadające twoim zasobom.

Na koniec, w postgresql.conf można ustawić:

huge_pages=on

i restart PostgreSQL.

Dziękuje, za uwagę!

Tomasz Gintowt jest Architektem/DevOps/DBA/Trenerem, głównie skupiony na dostarczaniu rozwiązań składowania i przetwarzania danych. Nie są mu obce wszelkiej maści bazy danych, systemy real-time data i streamingu. Obecnie pracuje z Apache Kafka, RabbitMQ, Elastic Stack i PostgreSQL. Organizator spotkań DataOps Poland. Prywatnie fan ciasta marchewkowego.

https://www.linkedin.com/in/tomasz-gintowt/

https://www.meetup.com/dataops-poland/

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

Tomasz Gintowt
Tomasz Gintowt

Written by Tomasz Gintowt

Architect, DevOps, SysOps, and DBA. Currently, I’m an IT Systems Engineer working with Apache Kafka, RabbitMQ, PostgreSQL, Elastic Stack in Real-Time Data Team.

No responses yet

Write a response