Nastavitev parametrov jedra Linux za optimizacijo PostgreSQL

Nastavitev parametrov jedra Linux za optimizacijo PostgreSQL Optimalna izvedba PostgreSQL ovisi o pravilno definiranim parametrima operativnog sustava. Loše podešeni parametri jezgre OS-a mogu dovesti do smanjenja performansi poslužitelja baze podataka. Stoga je obavezno da ovi parametri budu podešeni u skladu sa poslužiteljem baze podataka i njegovim radnim opterećenjem. U ovom objavi raspravljat ćemo o nekim važnim parametrima jezgre Linuxa koji mogu utjecati na performanse poslužitelja baze podataka i načinima njihovog podešavanja.

SHMMAX / SHMALL

SHMMAX — je parametar jezgre koji se koristi za određivanje maksimalne veličine jednog segmenta dijeljene memorije (shared memory) koju proces Linux može dodijeliti. Do verzije 9.2 PostgreSQL je koristio System V (SysV), za koji je potrebna konfiguracija SHMMAX. Nakon 9.2 PostgreSQL se prebacuje na dijeljenu memoriju POSIX. Dakle, sada je potrebno manje bajtova dijeljene memorije System V.

Do verzije 9.3 SHMMAX je bio najvažniji parametr jezgre. Vrijednost SHMMAX se definira u bajtima.

Slično, SHMALL — je još jedan parametar jezgre koji se koristi za određivanje
ukupnog volumena stranica dijeljene memorije (shared memory). Da biste vidjeli trenutne vrijednosti SHMMAX, SHMALL ili SHMMIN, upotrijebite naredbu ipcs.

SHM* Detalji — Linux

$ ipcs -lm

------ Ograničenja dijeljene memorije --------
max broj segmenata = 4096
max seg size (kbytes) = 1073741824
max ukupna dijeljena memorija (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 System V IPC za dodjelu dijeljene memorije. Ovaj parametar je jedan od najvažnijih parametara jezgre. Svaki put kada primite sljedeće poruke o greškama, to znači da imate stariju verziju PostgreSQL i da imate vrlo nisku vrijednost SHMMAX. Očekuje se da će korisnici ispraviti i povećati vrijednost u skladu s dijeljenom memorijom koju namjeravaju koristiti.

Moguće greške zbog pogrešne konfiguracije

Ako je SHMMAX pogrešno konfiguriran, možete dobiti grešku prilikom pokušaja inicijalizacije klastera PostgreSQL pomoću naredbe initdb.

initdb Neuspjeh
DETAIL: Neuspješni poziv na sustav bio je shmget(key=1, size=2072576, 03600).

HINT: Ova greška obično znači da je zahtjev za segment dijeljene memorije prekoračio SHMMAX parametar vašeg kernela. 
Lahko zmanjšate velikost zahteve ali ponovno konfigurirate jedro z večjim SHMMAX. Da bi zmanjšali velikost zahteve (trenutno 2072576 bajtov),
zmanjšajte uporabo skupne pomnilnika PostgreSQL, morda z zmanjšanjem shared_buffers ali max_connections.

Če je velikost zahteve že majhna, je možno, da je manjša od parametra SHMMIN vašega jedra,
v tem primeru je potrebno povečati velikost zahteve ali ponovno konfigurirati SHMMIN.

Dokumentacija PostgreSQL vsebuje več informacij o konfiguraciji skupnega pomnilnika. Proces otroka je končal z izhodno kodo 1

Podobno lahko dobite napako pri zagonu strežnika PostgreSQL z uporabo ukaza pg_ctl.

pg_ctl Napaka
PODROBNOSTI: Neuspešen sistemski klic je bil shmget(key=5432001, size=14385152, 03600).

HINT: Ova greška obično znači da je zahtjev za segment dijeljene memorije prekoračio SHMMAX parametar vašeg kernela.

Lahko zmanjšate velikost zahteve ali ponovno konfigurirate jedro z večjim SHMMAX.; Da bi zmanjšali velikost zahteve (trenutno 14385152 bajtov), zmanjšajte uporabo skupne pomnilnika PostgreSQL, morda z zmanjšanjem shared_buffers ali max_connections.

Če je velikost zahteve že majhna, je možno, da je manjša od parametra SHMMIN vašega jedra,
v tem primeru je potrebno povečati velikost zahteve ali ponovno konfigurirati SHMMIN.

Dokumentacija PostgreSQL vsebuje več informacij o konfiguraciji skupnega pomnilnika.

Razumevanje razlik v definicijah

Definicija parametrov SHMMAX/SHMALL se nekoliko razlikuje v Linuxu in MacOS X:

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

Komanda sysctl se lahko uporablja za začasno spremembo vrednosti. Če želite nastaviti trajne vrednosti, dodajte vpis v /etc/sysctl.conf. Podrobnosti so navedene spodaj.

Sprememba parametrov jedra 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

Sprememba parametrov jedra 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

Ne pozabite: Da bi bile spremembe trajne, dodajte te vrednosti v /etc/sysctl.conf

Velike strani (Huge Pages)

V Linuxu so privzeto uporabljene strani pomnilnika 4 KB, v BSD — Super Pages, v Windows — Large Pages. Stran je del sistemskega pomnilnika, dodeljen procesu. Proces lahko ima več strani, odvisno od zahtev po pomnilniku. Več pomnilnika kot ga potrebuje proces, več strani mu je dodeljenih. OS podpira tabelo dodeljevanja strani za procese. Manjša kot je velikost strani, večja je tabela, več časa je potrebnega za iskanje strani v tej tabeli. Zato velike strani omogočajo uporabo velike količine pomnilnika z zmanjšanimi stroški; manj iskanja po straneh, manj napak pri straneh, hitrejše operacije branja/pisanja prek velikih predpomnilnikov. Kot rezultat — izboljšana zmogljivost.

PostgreSQL podpira velike strani samo v Linuxu. Privzeto Linux uporablja 4 KB pomnilniških strani, zato je v primerih, ko je operacij s pomnilnikom preveč, potrebno nastaviti strani večje velikosti. Opazimo lahko povečanje zmogljivosti pri uporabi velikih strani velikosti 2 MB in do 1 GB. Velikost velike strani je mogoče nastaviti med nalaganjem. Parametre velike strani in njihovo uporabo na vašem računalniku Linux lahko enostavno preverite z ukazom cat /proc/meminfo | grep -i huge.

Pridobivanje informacij o velikih straneh (samo za Linux)

Opomba: To velja samo za Linux, za druge operacijske sisteme je ta operacija ignorirana$ 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

V tem primeru, čeprav je velikost velike strani nastavljena na 2048 (2 MB), je skupno število velikih strani 0. To pomeni, da so velike strani izklopljene.

Skript za določanje števila velikih strani

To je preprost skript, ki vrne potrebno število velikih strani. Zaženi skript na svojem strežniku Linux, medtem ko deluje PostgreSQL. Prepričaj se, da je za spremenljivko okolja $PGDATA nastavljen imenik podatkov PostgreSQL.

Pridobitev številke zahtevanih velikih strani

#!/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

Izhod skripta se prikaže takole:

Izhod skripta

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

Priporočena vrednost velikih strani je 88, zato morate nastaviti vrednost 88.

Nastavitev velikih strani

sysctl -w vm.nr_hugepages=88

Sedaj preverite velike strani, videli boste, da velike strani niso uporabljene (HugePages_Free = HugePages_Total).

Znova informacije o velikih straneh (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

Zdaj nastavite parameter huge_pages „on“ v $PGDATA/postgresql.conf in ponovno zaženite strežnik.

In znova informacije o velikih straneh (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

Zdaj lahko vidite, da se zelo malo velikih strani uporablja. Sedaj poskusimo dodati nekaj podatkov v bazo podatkov.

Nekatere operacije z bazo podatkov za obvladovanje velikih strani

postgres=# USTVARI TABLE foo(a INTEGER);
USTVARI TABLE
postgres=# VSTAVI V foo VREDNOSTI(generate_Series(1,10000000));
VSTAVI 0 10000000

Poglejmo, ali zdaj uporabljamo več velikih strani kot prej.

Še enkrat informacije o velikih straneh (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

Zdaj lahko vidite, da se večina velikih strani uporablja.

Opomba: približna vrednost za HugePages, uporabljena tukaj, je zelo nizka, kar ni normalna vrednost za proizvodno okolje. Ocenite potrebno število strani za vaš sistem in jih ustrezno nastavite glede na obremenitev in vire.

vm.swappiness

vm.swappiness — to je še en parameter jedra, ki lahko vpliva na zmogljivost baze podatkov. Ta parameter se uporablja za upravljanje obnašanja menjave (swappiness) (menjava strani v spomin in iz njega) v Linuxu. Vrednost se giba od 0 do 100. Določa, koliko pomnilnika bo izpraznjenega ali izpraznjenega. Nič pomeni izklop menjave, medtem ko 100 pomeni agresivno menjavo.

Lahko dosežete dobro zmogljivost z nastavitvijo nizkih vrednosti.

Nastavitev vrednosti 0 v novejših jedrih lahko povzroči, da OOM Killer (postopek praznjenja pomnilnika v Linuxu) ubije proces. Tako lahko varno nastavite vrednost 1, če želite minimizirati menjavo. Privzeta vrednost v Linuxu je 60. Višje vrednosti spodbuja MMU (enota za upravljanje pomnilnika) k uporabi več prostora mesta za menjavo kot RAM, medtem ko nižje vrednosti ohranjajo več podatkov/kod v pomnilniku.

Nižja vrednost je dobra izbira za izboljšanje zmogljivosti v PostgreSQL.

vm.overcommit_memory \/ vm.overcommit_ratio

Aplikacije pridobijo pomnilnik in ga sprostijo, ko ga več ne potrebujejo. Toda v nekaterih primerih aplikacija pridobi preveč pomnilnika in ga ne sprosti. To lahko povzroči OOM killer. Tu so možne vrednosti parametra vm.overcommit_memory s opisom za vsako:

  1. Hevristični overcommit (privzeto); temelji na jedrni hevristiki
  2. Dovoli overcommit v vsakem primeru
  3. Ne pretiravajte, ne prekoračite overcommit koeficienta.

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

vm.overcommit_ratio — procent ram mémoire disponible pour surcharge. Une valeur de 50 % dans un système avec 2 Go de RAM peut allouer jusqu'à 3 Go de RAM.

La valeur 2 pour vm.overcommit_memory offre de meilleures performances pour PostgreSQL. Cette valeur maximise l'utilisation de la mémoire par le processus serveur sans risque significatif d'être tué par le processus OOM killer. L'application pourra redémarrer, mais uniquement dans les limites de la surcharge, ce qui réduit le risque que le OOM killer tue le processus. Par conséquent, la valeur 2 offre de meilleures performances que la valeur par défaut 0. Cependant, la fiabilité peut être améliorée en veillant à ce que la mémoire en dehors de la plage admissible ne soit pas surchargée. Cela élimine le risque que le processus soit tué par le OOM-killer.

Dans les systèmes sans swap, un problème peut survenir avec vm.overcommit_memory égal à 2.

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

vm.dirty_background_ratio / vm.dirty_background_bytes

vm.dirty_background_ratio — c'est le pourcentage de mémoire remplie de pages sales qui doivent être écrites sur le disque. L'écriture sur disque se fait en arrière-plan. La valeur de ce paramètre varie de 0 à 100 ; cependant, une valeur inférieure à 5 peut être inefficace, et certains noyaux ne le supportent pas. 10 est la valeur par défaut dans la plupart des systèmes Linux. Vous pouvez améliorer les performances des opérations d'écriture intensive avec un coefficient plus bas, ce qui signifie que Linux écrira des pages sales en arrière-plan.

Vous devez définir la valeur vm.dirty_background_bytes en fonction de la vitesse de votre disque.

Pour ces deux paramètres, il n'y a pas de « bonnes » valeurs, car les deux dépendent du matériel. Cependant, définir vm.dirty_background_ratio à 5 et vm.dirty_background_bytes à 25 % de la vitesse du disque améliore les performances de ~ 25 % dans la plupart des cas.

vm.dirty_ratio / dirty_bytes

C'est la même chose que vm.dirty_background_ratio / dirty_background_bytes, sauf que l'écriture se produit dans une session de travail, bloquant l'application. Par conséquent, vm.dirty_ratio doit être supérieur à vm.dirty_background_ratio. Cela garantit que les processus en arrière-plan seront lancés plus tôt pour éviter le maximum de blocage possible de l'application. Vous pouvez ajuster la différence entre ces deux ratios en fonction de la charge d'E/S disque.

Zaključek

Lahko nastavite druge parametre za povečanje zmogljivosti, vendar bodo izboljšave minimalne in ne boste imeli posebnih koristi. Treba je upoštevati, da ne veljajo vsi parametri za vse vrste aplikacij. Nekatere aplikacije delujejo bolje, ko prilagodimo določene parametre, nekatere pa ne. Morate najti pravi balans med konfiguracijami teh parametrov glede na pričakovano obremenitev in tip aplikacije, prav tako pa je pri nastavitvi treba upoštevati obnašanje operacijskega sistema. Prilagoditev nastavitev jedra ni tako enostavna kot prilagoditev nastavitev baze podatkov: tukaj je težje dati svoje priporočilo.

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster