Optimalna izvedba PostgreSQL ovisi o pravilno definiranim parametrima operativnog sustava. Loše postavljeni parametri jezgre OS-a mogu dovesti do smanjenja performansi poslužitelja baze podataka. Stoga je obavezno da ti parametri budu postavljeni u skladu s poslužiteljem baze podataka i njegovim radnim opterećenjem. U ovom postu raspravljat ćemo o nekim važnim parametrima jezgre Linuxa koji mogu utjecati na performanse poslužitelja baze podataka i načinima njihove prilagodbe.
SHMMAX / SHMALL
SHMMAX — to je parametar jezgre koji se koristi za određivanje maksimalne veličine jednog segmenta dijeljene memorije (shared memory) koji može dodijeliti proces Linuxa. Do verzije 9.2 PostgreSQL je koristio System V (SysV), za koji je bila potrebna konfiguracija SHMMAX. Nakon 9.2, PostgreSQL je prešao na POSIX dijeljenu memoriju. Tako da sada zahtijeva manje bajtova dijeljene memorije System V.
Do verzije 9.3, SHMMAX je bio najvažniji parametar jezgre. Vrijednost SHMMAX postavlja se u bajtovima.
Slično tome, SHMALL — to je još jedan parametar jezgre koji se koristi za određivanje
ukupnog volumena stranica dijeljene memorije (shared memory). Da biste pregledali trenutne vrijednosti SHMMAX, SHMALL ili SHMMIN, koristite naredbu ipcs.
SHM* Detalji — Linux
$ ipcs -lm
------ Ograničenja dijeljene memorije --------
max broj segmenata = 4096
max seg veličina (kbytes) = 1073741824
max ukupna dijeljena memorija (kbytes) = 17179869184
min seg veličina (bytes) = 1SHM* Detalji — MacOS X
$ ipcs -M
Status IPC-a od kao u čet, 16. kol 2018 22:20:35 PKT
shminfo:
shmmax: 16777216 (max dijeljena memorijska veličina segmenta)
shmmin: 1 (min dijeljena memorijska veličina segmenta)
shmmni: 32 (max broj identifikatora dijeljene memorije)
shmseg: 8 (max dijeljeni memorijski segmenti po procesu)
shmall: 1024 (max količina dijeljene memorije u stranicama)
PostgreSQL koristi System V IPC za dodjelu dijeljene memorije. Ovaj parametar je jedan od najvažnijih parametara jezgre. Kad god dobijete sljedeće poruke o grešci, to znači da imate stariju verziju PostgreSQL-a i da imate vrlo nisku vrijednost SHMMAX. Očekuje se da korisnici prilagode i povećaju vrijednost u skladu s dijeljenom memorijom koju planiraju koristiti.
Moguće greške zbog pogrešne konfiguracije
Ako je SHMMAX pogrešno postavljen, možete dobiti grešku prilikom pokušaja inicijalizacije PostgreSQL klastera pomoću naredbe initdb.
initdb Neuspjeh
DETAIL: Neuspjela sistemska poziv bila je shmget(key=1, size=2072576, 03600).
HINT: Ova greška obično znači da je zahtjev PostgreSQL-a za segmentom dijeljene memorije premašio SHMMAX parametar vašeg kernela.
Možete smanjiti veličinu zahtjeva ili rekonfigurirati jezgru s većim SHMMAX. Da biste smanjili veličinu zahtjeva (trenutno 2072576 bajta),
smanjite korištenje zajedničke memorije PostgreSQL-a, možda smanjivanjem shared_buffers ili max_connections.
Ako je veličina zahtjeva već mala, moguće je da je manja od vašeg SHMMIN parametra jezgre,
u kojem slučaju je potrebno povećati veličinu zahtjeva ili rekonfigurirati SHMMIN.
Dokumentacija PostgreSQL-a sadrži više informacija o konfiguraciji zajedničke memorije. Dječji proces je izašao s kodom izlaza 1
Slično tome, možete dobiti pogrešku prilikom pokretanja PostgreSQL poslužitelja koristeći naredbu pg_ctl.
pg_ctl neuspjeh
DETALJI: Neuspješan poziv sustava bio je shmget(key=5432001, size=14385152, 03600).
HINT: Ova greška obično znači da je zahtjev PostgreSQL-a za segmentom dijeljene memorije premašio SHMMAX parametar vašeg kernela.
Možete smanjiti veličinu zahtjeva ili rekonfigurirati jezgru s većim SHMMAX.; Da biste smanjili veličinu zahtjeva (trenutno 14385152 bajta), smanjite korištenje zajedničke memorije PostgreSQL-a, možda smanjivanjem shared_buffers ili max_connections.
Ako je veličina zahtjeva već mala, moguće je da je manja od vašeg SHMMIN parametra jezgre,
u kojem slučaju je potrebno povećati veličinu zahtjeva ili rekonfigurirati SHMMIN.
Dokumentacija PostgreSQL-a sadrži više informacija o konfiguraciji zajedničke memorije.
Razumijevanje razlika u definicijama
Definicija parametara SHMMAX/SHMALL malo se razlikuje u Linuxu i MacOS X:
- Linux: kernel.shmmax, kernel.shmall
- MacOS X: kern.sysv.shmmax, kern.sysv.shmall
Komanda sysctl može se koristiti za privremenu promjenu vrijednosti. Da biste postavili trajne vrijednosti, dodajte unos u /etc/sysctl.conf. Pojedinosti su navedene u nastavku.
Promjena parametara jezgre na MacOS X-u
# Get the value of SHMMAX
sudo sysctl kern.sysv.shmmax
kern.sysv.shmmax: 4096
# Get the value of SHMALL
sudo sysctl kern.sysv.shmall
kern.sysv.shmall: 4096
# Set the value of SHMMAX
sudo sysctl -w kern.sysv.shmmax=16777216
kern.sysv.shmmax: 4096 -> 16777216
# Set the value of SHMALL
sudo sysctl -w kern.sysv.shmall=16777216
kern.sysv.shmall: 4096 -> 16777216Promjena parametara jezgre na Linuxu
# Get the value of SHMMAX
sudo sysctl kernel.shmmax
kernel.shmmax: 4096
# Get the value of SHMALL
sudo sysctl kernel.shmall
kernel.shmall: 4096
# Set the value of SHMMAX
sudo sysctl -w kernel.shmmax=16777216
kernel.shmmax: 4096 -> 16777216
# Set the value of SHMALL
sudo sysctl -w kernel.shmall=16777216
kernel.shmall: 4096 -> 16777216Ne zaboravite: da biste promjene učinili trajnima, dodajte ove vrijednosti u /etc/sysctl.conf
Velike stranice (Huge Pages)
Na Linuxu se po defaultu koriste stranice memorije od 4 KB, dok na BSD-u — Super Pages, a na Windows-u — Large Pages. Stranica je dio radne memorije koji dodjeljuje proces. Proces može imati više stranica ovisno o zahtjevima za memorijom. Što više memorije procesu treba, to više stranica mu je dodijeljeno. OS podržava tablicu dodjele stranica za procese. Što je manja veličina stranice, to je tablica veća, a više vremena je potrebno za pretraživanje stranice u ovoj tablici stranica. Stoga velike stranice omogućuju korištenje velikih količina memorije s smanjenim prekomjernim troškovima; manje pregleda stranica, manje grešaka stranica, brže operacije čitanja/pisanja putem velikih međuspremnika. Kao rezultat — poboljšanje performansi.
PostgreSQL podržava velike stranice samo na Linuxu. Zadano, Linux koristi 4 KB stranice memorije, pa je u slučajevima kada je operacija s memorijom previše potrebno postaviti veće stranice. Primjećuje se porast performansi korištenjem velikih stranica veličine 2 MB do 1 GB. Veličinu velike stranice možete postaviti prilikom pokretanja sustava. Možete lako provjeriti parametre velike stranice i njihovu upotrebu na svom Linux računalu koristeći naredbu cat /proc/meminfo | grep -i huge.
Dobivanje informacija o velikim stranicama (samo na Linuxu)
Napomena: Ovo je samo za Linux, za druge OS ove operacije se zanemaruju $ cat /proc/meminfo | grep -i huge
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kBU ovom primjeru, iako je veličina velike stranice postavljena na 2048 (2 MB), ukupni broj velikih stranica ima vrijednost 0. To znači da su velike stranice isključene.
Skripta za određivanje broja velikih stranica
Ovo je jednostavna skripta koja vraća potreban broj velikih stranica. Pokrenite skriptu na svom Linux poslužitelju dok PostgreSQL radi. Provjerite da je za varijablu okruženja $PGDATA postavljen katalog podataka PostgreSQL.
Dobivanje broja potrebnih velikih stranica
#!/bin/bash
pid=`head -1 $PGDATA/postmaster.pid`
echo "Pid: $pid"
peak=`grep ^VmPeak /proc/$pid/status | awk '{ print $2 }'`
echo "VmPeak: $peak kB"
hps=`grep ^Hugepagesize /proc/meminfo | awk '{ print $2 }'`
echo "Hugepagesize: $hps kB"
hp=$((peak/hps))
echo Set Huge Pages: $hpIzlaz skripte izgleda ovako:
Izlaz skripte
Pid: 12737
VmPeak: 180932 kB
Hugepagesize: 2048 kB
Set Huge Pages: 88Preporučena vrijednost velikih stranica je 88, stoga trebate postaviti vrijednost 88.
Postavljanje velikih stranica
sysctl -w vm.nr_hugepages=88Provjerite velike stranice sada, vidjet ćete da se velike stranice ne koriste (HugePages_Free = HugePages_Total).
Ponovno informacije o velikim stranicama (samo na Linuxu)
$ cat /proc/meminfo | grep -i huge
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
HugePages_Total: 88
HugePages_Free: 88
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kBSada postavite parametar huge_pages „on“ u $PGDATA/postgresql.conf i ponovo pokrenite poslužitelj.
I opet informacije o velikim stranicama (samo na Linuxu)
$ cat /proc/meminfo | grep -i huge
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
HugePages_Total: 88
HugePages_Free: 81
HugePages_Rsvd: 64
HugePages_Surp: 0
Hugepagesize: 2048 kBSada možete vidjeti da se koristi vrlo malo velikih stranica. Pokušajmo sada dodati neke podatke u bazu podataka.
Nekoliko operacija s bazom podataka za upravljanje velikim stranicama
postgres=# CREATE TABLE foo(a INTEGER);
CREATE TABLE
postgres=# INSERT INTO foo VALUES(generate_Series(1,10000000));
INSERT 0 10000000Pogledajmo koristimo li više velikih stranica nego prije.
Još jednom informacije o velikim stranicama (samo na Linuxu)
$ cat /proc/meminfo | grep -i huge
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
HugePages_Total: 88
HugePages_Free: 18
HugePages_Rsvd: 1
HugePages_Surp: 0
Hugepagesize: 2048 kBSada možete vidjeti da se većina velikih stranica koristi.
Napomena: približna vrijednost za HugePages koja se ovdje koristi je vrlo niska, što nije normalna vrijednost za mašinu u produkciji. Molimo procijenite potreban broj stranica za vaš sustav i postavite ih prema opterećenju i resursima.
vm.swappiness
vm.swappiness — to je još jedna kernel opcija koja može utjecati na performanse baze podataka. Ova opcija se koristi za upravljanje ponašanjem swapovanja (swappiness) (swap stranica u i iz memorije) u Linuxu. Vrijednost se kreće od 0 do 100. Određuje koliko će memorije biti oslobođeno ili učitano. Nula znači isključivanje zamjene, dok 100 znači agresivno swapovanje.
Možete postići dobre performanse postavljanjem nižih vrijednosti.
Postavljanje vrijednosti 0 u novijim kernelima može dovesti do toga da OOM Killer (proces za čišćenje memorije u Linuxu) ubije proces. Stoga, može se sigurno postaviti vrijednost 1 ako želite minimizirati swapovanje. Zadana vrijednost u Linuxu je 60. Viša vrijednost tjera MMU (jedinica za upravljanje memorijom) da koristi više swap prostora nego RAM-a, dok niža vrijednost zadržava više podataka/koda u memoriji.
Niža vrijednost je dobra oklada za poboljšanje performansi u PostgreSQL-u.
vm.overcommit_memory / vm.overcommit_ratio
Aplikacije dobivaju memoriju i oslobađaju je kada više nije potrebna. No, u nekim slučajevima aplikacija dobije previše memorije i ne oslobodi je. To može izazvati OOM Killer. Evo mogućih vrijednosti za ovu opciju vm.overcommit_memory s opisom za svaku:
- Heuristički overcommit (zadano); heuristika zasnovana na kernelu
- Dopusti overcommit u svakom slučaju
- Ne pretjeruj, ne premašuj overcommit koeficijent.
Link:
vm.overcommit_ratio — postotak RAM-a dostupnog za prekomjernu upotrebu. Vrijednost od 50% u sustavu s 2 GB RAM-a može alocirati do 3 GB RAM-a.
Vrijednost 2 za vm.overcommit_memory osigurava bolju izvedbu za PostgreSQL. Ova vrijednost maksimizira korištenje RAM-a od strane server procesâ bez značajnog rizika da će proces biti ubijen od strane OOM killera. Aplikacija će se moći ponovno pokrenuti, ali samo unutar prekomjerne upotrebe, što smanjuje rizik da OOM killer ubije proces. Stoga, vrijednost 2 pruža bolju izvedbu nego zadana vrijednost 0. Ipak, pouzdanost se može poboljšati tako da se RAM izvan dopuštenog raspona ne preopterećuje. Ovo elimira rizik da će proces biti ubijen od strane OOM killera.
U sustavima bez swap memorije može doći do problema s vm.overcommit_memory postavljenim na 2.
vm.dirty_background_ratio / vm.dirty_background_bytes
vm.dirty_background_ratio — to je postotak memorije ispunjene prljavim stranicama koje treba zapisati na disk. Ispis na disk se vrši u pozadini. Vrijednost ovog parametra kreće se od 0 do 100; međutim, vrijednost ispod 5 može biti neučinkovita, a neka jezgra je ne podržavaju. 10 je vrijednost koja je zadana u većini Linux sustava. Možete poboljšati izvedbu za operacije s intenzivnim zapisom s manjim omjerom, što znači da će Linux zapisivati prljave stranice u pozadini.
Trebate postaviti vrijednost vm.dirty_background_bytes ovisno o brzini vašeg diska.
Za ova dva parametra ne postoje 'dobre' vrijednosti, jer obje ovise o hardveru. Međutim, postavljanje vm.dirty_background_ratio na 5 i vm.dirty_background_bytes na 25% od brzine diska poboljšava izvedbu za ~ 25% u većini slučajeva.
vm.dirty_ratio / dirty_bytes
To je isto kao vm.dirty_background_ratio / dirty_background_bytes, osim što se ispis izvršava u radnoj sesiji, blokirajući aplikaciju. Stoga vm.dirty_ratio treba biti veći od vm.dirty_background_ratio. Ovo osigurava da se pozadinski procesi pokreću ranije kako bi se izbjeglo maksimalno moguće blokiranje aplikacije. Možete prilagoditi razliku između ova dva omjera ovisno o opterećenju diskovnog ulaza-izlaza.
Zaključak
Možete prilagoditi dodatne parametre za poboljšanje performansi, ali će poboljšanja biti minimalna i nećete imati značajne koristi. Moramo se sjetiti da ne odnose se svi parametri na sve tipove aplikacija. Neke aplikacije bolje funkcioniraju s prilagodbom određenih parametara, dok druge ne. Trebate pronaći pravi balans između konfiguracija tih parametara za očekivano opterećenje i tip aplikacije, a također treba uzeti u obzir ponašanje operativnog sustava prilikom prilagodbe. Podešavanje parametara jezgre nije tako jednostavno kao podešavanje parametara baze podataka: ovdje je teže dati svoje preporuke.
Izvor: habr.com
