Konfiguriranje opcija jezgre Linuxa za optimizaciju PostgreSQL-a

Konfiguriranje opcija jezgre Linuxa za optimizaciju PostgreSQL-a Optimalna izvedba PostgreSQL-a ovisi o ispravno definiranim parametrima operativnog sustava. Loše konfigurirane postavke jezgre OS-a mogu rezultirati lošim performansama poslužitelja baze podataka. Stoga je neophodno da se te postavke konfiguriraju 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 kako ih konfigurirati.

SHMMAX / SHMALL

SHMMAX je parametar jezgre koji se koristi za određivanje maksimalne veličine jednog segmenta dijeljene memorije koji Linux proces može dodijeliti. Prije verzije 9.2, PostgreSQL je koristio System V (SysV), koji zahtijeva postavku SHMMAX. Nakon 9.2, PostgreSQL se prebacio na POSIX dijeljenu memoriju. Sada je potrebno manje bajtova zajedničke memorije sustava V.

Prije verzije 9.3, SHMMAX je bio najvažniji parametar kernela. Vrijednost SHMMAX navedena je u bajtovima.

Slično tome, MALENO je još jedan parametar jezgre koji se koristi za određivanje
volumen stranica zajedničke memorije na razini cijelog sustava. Za pregled trenutnih vrijednosti SHMMAX, SHMALL ili SHMMIN upotrijebite naredbu ipcs.

SHM* Detalji - Linux

$ ipcs -lm

------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 1073741824
max total shared memory (kbytes) = 17179869184
min seg size (bytes) = 1

SHM* Detalji - MacOS X

$ ipcs -M
IPC status from  as of Thu Aug 16 22:20:35 PKT 2018
shminfo:
	shmmax: 16777216	(max shared memory segment size)
	shmmin:       1	(min shared memory segment size)
	shmmni:      32	(max number of shared memory identifiers)
	shmseg:       8	(max shared memory segments per process)
	shmall:    1024	(max amount of shared memory in pages)

PostgreSQL koristi Sustav V IPC za dodjelu zajedničke memorije. Ovaj parametar je jedan od najvažnijih parametara jezgre. Kad god primite sljedeće poruke o pogrešci, to znači da imate stariju verziju PostgreSQL-a i da je vaša vrijednost SHMMAX vrlo niska. Od korisnika se očekuje da prilagode i povećaju vrijednost prema zajedničkoj memoriji koju namjeravaju koristiti.

Moguće greške u pogrešnoj konfiguraciji

Ako SHMMAX nije ispravno konfiguriran, možete dobiti pogrešku kada pokušate inicijalizirati PostgreSQL klaster pomoću naredbe initdb.

initdb Greška
DETAIL: Failed system call was shmget(key=1, size=2072576, 03600).

HINT: This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter. 
You can either reduce the request size or reconfigure the kernel with larger SHMMAX. To reduce the request size (currently 2072576 bytes),
reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.

If the request size is already small, it's possible that it is less than your kernel's SHMMIN parameter,
in which case raising the request size or reconfiguring SHMMIN is called for.

The PostgreSQL documentation contains more information about shared memory configuration. child process exited with exit code 1

Isto tako, možete dobiti pogrešku prilikom pokretanja PostgreSQL poslužitelja pomoću naredbe pg_ctl.

pg_ctl Greška
DETAIL: Failed system call was shmget(key=5432001, size=14385152, 03600).

HINT: This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter.

You can either reduce the request size or reconfigure the kernel with larger SHMMAX.; To reduce the request size (currently 14385152 bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.

If the request size is already small, it's possible that it is less than your kernel's SHMMIN parameter,
in which case raising the request size or reconfiguring SHMMIN is called for.

The PostgreSQL documentation contains more information about shared memory configuration.

Razumijevanje razlika u definicijama

Definiranje parametara SHMMAX/SHMALL malo je drugačije na Linuxu i MacOS X:

  • Linux: kernel.shmmax, kernel.shmall
  • MacOS X: kern.sysv.shmmax, kern.sysv.shmall

Momčad sysctl može se koristiti za privremenu promjenu vrijednosti. Za postavljanje konstantnih vrijednosti dodajte unos u /etc/sysctl.conf. Detalji su u nastavku.

Promjena postavki jezgre na MacOS X

# 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 -> 16777216

Promjena 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 -> 16777216

Nemoj zaboraviti: Da biste promjene učinili trajnim, dodajte ove vrijednosti u /etc/sysctl.conf

Ogromne stranice

Linux standardno koristi 4 KB memorijske stranice, BSD koristi XNUMX KB memorijske stranice. Super stranice, a na Windowsima - Velike stranice. Stranica je dio RAM-a dodijeljen procesu. Proces može imati više stranica ovisno o zahtjevima memorije. Što više memorije proces zahtijeva, to mu je više stranica dodijeljeno. OS održava tablicu dodjele stranica za procese. Što je stranica manja, što je tablica veća, dulje je potrebno da se pronađe stranica u toj tablici stranica. Velike stranice stoga dopuštaju korištenje velikih količina memorije uz smanjene troškove; manje pregleda stranica, manje grešaka na stranici, brže operacije čitanja/pisanja preko većih međuspremnika. Rezultat je poboljšana izvedba.

PostgreSQL podržava samo velike stranice na Linuxu. Linux prema zadanim postavkama koristi 4 KB memorijske stranice, pa je u slučajevima kada ima previše memorijskih operacija potrebno postaviti veće stranice. Uočava se poboljšanje performansi pri korištenju velikih stranica od 2 MB do 1 GB. Velika veličina stranice može se postaviti tijekom pokretanja sustava. Pomoću naredbe možete jednostavno provjeriti parametre velike stranice i njihovu upotrebu na vašem Linux stroju mačka /proc/meminfo | grep -i ogroman.

Dobivanje informacija o velikim stranicama (samo za Linux)

Note: This is only for Linux, for other OS this operation is ignored$ 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 kB

U ovom primjeru, iako je veličina velike stranice postavljena na 2048 (2 MB), ukupni broj velikih stranica postavljen je na 0. To znači da su velike stranice onemogućene.

Skripta za određivanje broja velikih stranica

Ova jednostavna skripta vraća potreban broj velikih stranica. Pokrenite skriptu na svom Linux poslužitelju dok je pokrenut PostgreSQL. Uvjerite se da za varijablu okruženja $PGDATA PostgreSQL direktorij podataka je određen.

Dobivanje potrebnog broja 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:     $hp

Izlaz skripte izgleda ovako:

Izlaz skripte

Pid:            12737
VmPeak:         180932 kB
Hugepagesize:   2048 kB
Set Huge Pages: 88

Preporučena vrijednost za velike stranice je 88, pa biste je trebali postaviti na 88.

Instaliranje velikih stranica

sysctl -w vm.nr_hugepages=88

Sada provjerite velike stranice, vidjet ćete da se velike stranice ne koriste (HugePages_Free = HugePages_Total).

Ponovno pregledavanje velikih stranica (samo za Linux)

$ 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 kB

Sada postavite parametar huge_pages na "on" u $PGDATA/postgresql.conf i ponovno pokrenite poslužitelj.

Još jednom, informacije o velikim stranicama (samo za Linux)

$ 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 kB

Sada možete vidjeti da se koristi vrlo malo velikih stranica. Pokušajmo sada dodati neke podatke u bazu podataka.

Neke operacije baze podataka za recikliranje velikih stranica

postgres=# CREATE TABLE foo(a INTEGER);
CREATE TABLE
postgres=# INSERT INTO foo VALUES(generate_Series(1,10000000));
INSERT 0 10000000

Da vidimo koristimo li sada više velikih stranica nego prije.

Više informacija na velikim stranicama (samo za Linux)

$ 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 kB

Sada možete vidjeti da se većina velikih stranica koristi.

Napomena: procijenjena vrijednost za HugePages koja se ovdje koristi je vrlo niska, što nije normalna vrijednost za stroj koji pokreće okruženje proizvoda. Molimo procijenite potreban broj stranica za vaš sustav i postavite ih u skladu s opterećenjem i resursima.

vm.zamjenjivost

vm.zamjenjivost je još jedan parametar jezgre koji može utjecati na performanse baze podataka. Ova se opcija koristi za kontrolu ponašanja swappinessa (zamjena stranica unutar i izvan memorije) na Linuxu. Vrijednost je u rasponu od 0 do 100. Određuje koliko će se memorije straničiti ili straničiti. Nula znači da nema razmjene, a 100 znači agresivnu razmjenu.

Možete postići dobre performanse postavljanjem nižih vrijednosti.

Postavljanje na 0 na novijim kernelima može dovesti do toga da OOM Killer (Linuxov proces čišćenja memorije) prekine proces. Stoga je sigurno postaviti na 1 ako želite minimizirati razmjenu. Zadana vrijednost u Linuxu je 60. Viša vrijednost uzrokuje da MMU (jedinica za upravljanje memorijom) koristi više swap prostora od RAM-a, dok niža vrijednost zadržava više podataka/koda u memoriji.

Niža vrijednost dobra je oklada za poboljšane performanse u PostgreSQL-u.

vm.overcommit_memory / vm.overcommit_ratio

Aplikacije preuzimaju memoriju i oslobađaju je kada više nije potrebna. Ali u nekim slučajevima aplikacija dobiva previše memorije i ne oslobađa je. To može uzrokovati OOM ubojicu. Ovdje su moguće vrijednosti parametara vm.overcommit_memory sa opisom za svaki:

  1. Heuristički overcommit (zadano); heuristika temeljena na jezgri
  2. Svejedno dopustite prekoračenje
  3. Nemojte pretjerivati, nemojte prekoračiti omjer prekomjernog angažmana.

veza: https://www.kernel.org/doc/Documentation/vm/overcommit-accounting

vm.overcommit_ratio — postotak RAM-a dostupnog za preopterećenje. Vrijednost od 50% na sustavu s 2 GB RAM-a može dodijeliti do 3 GB RAM-a.

Vrijednost 2 za vm.overcommit_memory pruža bolje performanse za PostgreSQL. Ova vrijednost maksimizira upotrebu RAM-a procesa poslužitelja bez ikakvog značajnog rizika od prekida procesa OOM killer. Aplikacija će se moći ponovno učitati, ali samo unutar granica prekoračenja, što smanjuje rizik da OOM ubojica prekine proces. Stoga vrijednost 2 daje bolju izvedbu od zadane vrijednosti 0. Međutim, pouzdanost se može poboljšati osiguravanjem da memorija izvan raspona nije preopterećena. Time se eliminira rizik da proces ubije OOM ubojica.

Na sustavima bez zamjene može se pojaviti problem s vm.overcommit_memory jednakim 2.

https://www.postgresql.org/docs/current/static/kernel-resources.html#LINUX-MEMORY-OVERCOMMIT

vm.dirty_background_ratio / vm.dirty_background_bytes

vm.omjer_prljave_pozadine je postotak memorije ispunjene prljavim stranicama koje je potrebno zapisati na disk. Ispiranje na disk događa se u pozadini. Vrijednost ovog parametra je u rasponu od 0 do 100; međutim, vrijednost ispod 5 može biti neučinkovita i neki je kerneli ne podržavaju. 10 je zadana vrijednost na većini Linux sustava. Možete poboljšati performanse za intenzivne operacije pisanja za manji faktor, što će značiti da će Linux brisati prljave stranice u pozadini.

Morate postaviti vrijednost vm.dirty_background_bytes ovisno o brzini vaše vožnje.

Ne postoje "dobre" vrijednosti za ova dva parametra jer oba ovise o hardveru. Međutim, postavljanje vm.dirty_background_ratio na 5 i vm.dirty_background_bytes na 25% brzine diska poboljšava performanse na ~25% u većini slučajeva.

vm.prljavi_omjer/prljavi_bajtovi

Ovo je isto kao vm.dirty_background_ratio/dirty_background_bytes, osim što se resetiranje izvodi u radnoj sesiji, blokirajući aplikaciju. Stoga bi vm.dirty_ratio trebao biti veći od vm.omjer_prljave_pozadine. To osigurava da pozadinski procesi počnu ranije kako bi se izbjeglo blokiranje aplikacije koliko god je to moguće. Možete prilagoditi razliku između ova dva omjera ovisno o I/O opterećenju diska.

Ukupan

Možete podesiti druge postavke kako biste poboljšali performanse, ali poboljšanja će biti minimalna i nećete vidjeti puno koristi. Moramo imati na umu da se sve opcije ne odnose na sve vrste aplikacija. Neke aplikacije rade bolje kada prilagodimo neke postavke, a neke ne. Morate pronaći pravu ravnotežu između konfiguriranja ovih postavki za očekivano radno opterećenje i vrstu aplikacije, a također morate uzeti u obzir ponašanje OS-a prilikom podešavanja. Konfiguriranje parametara jezgre nije tako jednostavno kao konfiguriranje parametara baze podataka; teže je davati preporuke.

Izvor: www.habr.com

Dodajte komentar