Konfiguriranje možnosti jedra Linuxa za optimizacijo PostgreSQL

Konfiguriranje možnosti jedra Linuxa za optimizacijo PostgreSQL Optimalno delovanje PostgreSQL je odvisno od pravilno definiranih parametrov operacijskega sistema. Slabo konfigurirane nastavitve jedra OS lahko povzročijo slabo delovanje strežnika baze podatkov. Zato je nujno, da so te nastavitve konfigurirane glede na strežnik baze podatkov in njegovo delovno obremenitev. V tej objavi bomo razpravljali o nekaterih pomembnih parametrih jedra Linuxa, ki lahko vplivajo na zmogljivost strežnika baze podatkov, in o tem, kako jih konfigurirati.

SHMMAX / SHMALL

SHMMAX je parameter jedra, ki se uporablja za določanje največje velikosti posameznega segmenta pomnilnika v skupni rabi, ki ga lahko dodeli proces Linux. Pred različico 9.2 je PostgreSQL uporabljal System V (SysV), ki zahteva nastavitev SHMMAX. Po različici 9.2 je PostgreSQL prešel na skupni pomnilnik POSIX. Tako je zdaj potrebnih manj bajtov skupnega pomnilnika System V.

Pred različico 9.3 je bil SHMMAX najpomembnejši parameter jedra. Vrednost SHMMAX je podana v bajtih.

Podobno, MALI je še en parameter jedra, ki se uporablja za določanje
sistemska količina skupnih pomnilniških strani. Za ogled trenutnih vrednosti SHMMAX, SHMALL ali SHMMIN uporabite ukaz ipcs.

SHM* Podrobnosti - 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* Podrobnosti - 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 uporablja Sistem V IPC za dodelitev skupnega pomnilnika. Ta parameter je eden najpomembnejših parametrov jedra. Kadarkoli prejmete naslednja sporočila o napaki, to pomeni, da imate starejšo različico PostgreSQL in je vaša vrednost SHMMAX zelo nizka. Od uporabnikov se pričakuje, da prilagodijo in povečajo vrednost glede na skupni pomnilnik, ki ga nameravajo uporabiti.

Možne napačne konfiguracije

Če SHMMAX ni pravilno konfiguriran, lahko prejmete napako, ko poskušate inicializirati gručo PostgreSQL z ukazom initdb.

Napaka initdb
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

Prav tako lahko prejmete napako, ko zaženete strežnik PostgreSQL z ukazom pg_ctl.

pg_ctl Napaka
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.

Razumevanje razlik v definicijah

Definiranje parametrov SHMMAX/SHMALL je v sistemih Linux in MacOS X nekoliko drugačno:

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

Ekipa sysctl lahko uporabite za začasno spremembo vrednosti. Če želite nastaviti konstantne vrednosti, dodajte vnos v /etc/sysctl.conf. Podrobnosti so spodaj.

Spreminjanje nastavitev jedra v sistemu 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

Spreminjanje parametrov jedra v sistemu Linux

# 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 pozabi: Če želite spremembe narediti trajne, dodajte te vrednosti v /etc/sysctl.conf

Ogromne strani

Linux privzeto uporablja 4 KB pomnilniške strani, BSD uporablja XNUMX KB pomnilniške strani. Super straniin v sistemu Windows - Velike strani. Stran je del RAM-a, dodeljen procesu. Proces ima lahko več strani, odvisno od pomnilniških zahtev. Več pomnilnika kot proces potrebuje, več strani mu je dodeljenih. OS vzdržuje tabelo dodeljevanja strani za procese. Manjša kot je velikost strani, večja kot je tabela, dlje traja iskanje strani v tej tabeli strani. Velike strani torej omogočajo uporabo velikih količin pomnilnika z zmanjšanimi stroški; manj ogledov strani, manj napak na strani, hitrejše operacije branja/pisanja v večjih medpomnilnikih. Rezultat je izboljšana zmogljivost.

PostgreSQL podpira le velike strani v Linuxu. Linux privzeto uporablja 4 KB pomnilniške strani, zato je v primerih, ko je pomnilniških operacij preveč, potrebno nastaviti večje strani. Pri uporabi velikih strani od 2 MB do 1 GB je opaziti povečanje zmogljivosti. Velikost velike strani lahko nastavite ob zagonu. Z ukazom lahko enostavno preverite parametre velike strani in njihovo uporabo na vašem računalniku Linux mačka /proc/meminfo | grep -i ogromno.

Pridobivanje informacij o velikih straneh (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

Čeprav je v tem primeru velikost velike strani nastavljena na 2048 (2 MB), je skupno število velikih strani nastavljeno na 0. To pomeni, da so velike strani onemogočene.

Skripta za določanje števila velikih strani

Ta preprost skript vrne zahtevano število velikih strani. Zaženite skript na strežniku Linux, medtem ko se izvaja PostgreSQL. Prepričajte se, da za spremenljivko okolja $PGDATA Imenik podatkov PostgreSQL je določen.

Pridobivanje potrebnega števila 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 izgleda takole:

Izhod skripta

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

Priporočena vrednost za velike strani je 88, zato jo nastavite na 88.

Namestitev velikih strani

sysctl -w vm.nr_hugepages=88

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

Ponovno pregledane velike strani (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 na "on" v $PGDATA/postgresql.conf in znova zaženite strežnik.

Š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:       81
HugePages_Rsvd:       64
HugePages_Surp:        0
Hugepagesize:       2048 kB

Zdaj lahko vidite, da se uporablja zelo malo velikih strani. Poskusimo zdaj dodati nekaj podatkov v zbirko podatkov.

Nekatere operacije zbirke podatkov za recikliranje velikih strani

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

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

Več informacij 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 uporablja večina velikih strani.

Opomba: tukaj uporabljena ocenjena vrednost za HugePages je zelo nizka, kar ni običajna vrednost za stroj, ki izvaja okolje izdelka. Ocenite zahtevano število strani za vaš sistem in jih ustrezno nastavite glede na obremenitev in vire.

vm.swappiness

vm.swappiness je še en parameter jedra, ki lahko vpliva na zmogljivost baze podatkov. Ta možnost se uporablja za nadzor vedenja swappiness (zamenjava strani v in iz pomnilnika) v Linuxu. Vrednost se giblje od 0 do 100. Določa, koliko pomnilnika bo izstranjeno ali izstranjeno. Nič pomeni brez menjave in 100 pomeni agresivno menjavo.

Če nastavite nižje vrednosti, lahko dosežete dobro delovanje.

Če to nastavite na 0 v novejših jedrih, lahko povzroči, da OOM Killer (proces čiščenja pomnilnika Linuxa) uniči proces. Zato je varno, če ga nastavite na 1, če želite zmanjšati menjavo. Privzeta vrednost v Linuxu je 60. Višja vrednost povzroči, da MMU (enota za upravljanje pomnilnika) porabi več prostora za izmenjavo kot RAM, medtem ko nižja vrednost ohrani več podatkov/kode v pomnilniku.

Nižja vrednost je dobra stava za izboljšano zmogljivost v PostgreSQL.

vm.overcommit_memory / vm.overcommit_ratio

Aplikacije pridobijo pomnilnik in ga sprostijo, ko ga ne potrebujejo več. Toda v nekaterih primerih aplikacija dobi preveč pomnilnika in ga ne sprosti. To lahko povzroči morilca OOM. Tukaj so možne vrednosti parametrov vm.overcommit_memory z opisom za vsako:

  1. Hevristična preobremenitev (privzeto); hevristika na osnovi jedra
  2. Vseeno dovolite prekomerno prevzemanje
  3. Ne pretiravajte, ne prekoračite razmerja prevelike obveznosti.

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

vm.overcommit_ratio — odstotek RAM-a, ki je na voljo za preobremenitev. Vrednost 50 % na sistemu z 2 GB RAM-a lahko dodeli do 3 GB RAM-a.

Vrednost 2 za vm.overcommit_memory zagotavlja boljšo zmogljivost za PostgreSQL. Ta vrednost maksimira uporabo RAM-a strežniškega procesa brez večjega tveganja, da bi ga uničil proces OOM killer. Aplikacija se bo lahko znova naložila, vendar le v mejah prekoračitve, kar zmanjša tveganje, da bi OOM killer uničil proces. Zato vrednost 2 zagotavlja boljšo zmogljivost kot privzeta vrednost 0. Vendar pa je mogoče zanesljivost izboljšati tako, da zagotovite, da pomnilnik izven obsega ni preobremenjen. To odpravlja tveganje, da bi proces uničil ubijalec OOM.

V sistemih brez zamenjave lahko pride do težave z vm.overcommit_memory, ki je enak 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 je odstotek pomnilnika, napolnjenega z umazanimi stranmi, ki jih je treba zapisati na disk. Izpiranje na disk poteka v ozadju. Vrednost tega parametra se giblje od 0 do 100; vendar je lahko vrednost pod 5 neučinkovita in je nekatera jedra ne podpirajo. 10 je privzeta vrednost v večini sistemov Linux. Zmogljivost za pisalno intenzivne operacije lahko izboljšate z manjšim faktorjem, kar bo pomenilo, da bo Linux v ozadju izpraznil umazane strani.

Nastaviti morate vrednost vm.dirty_background_bytes odvisno od hitrosti vaše vožnje.

Za ta dva parametra ni "dobrih" vrednosti, saj sta oba odvisna od strojne opreme. Vendar pa nastavitev vm.dirty_background_ratio na 5 in vm.dirty_background_bytes na 25 % hitrosti diska v večini primerov izboljša zmogljivost na ~25 %.

vm.dirty_ratio/dirty_bytes

To je enako kot vm.dirty_background_ratio/dirty_background_bytes, le da se ponastavitev izvede v delovni seji in blokira aplikacijo. Zato mora biti vm.dirty_ratio višji od vm.dirty_background_ratio. To zagotavlja, da se procesi v ozadju začnejo prej, da se čim bolj izognete blokiranju aplikacije. Razliko med tema dvema razmerjema lahko prilagodite glede na V/I obremenitev diska.

Skupaj

Druge nastavitve lahko spremenite, da izboljšate zmogljivost, vendar bodo izboljšave minimalne in ne boste videli veliko koristi. Ne smemo pozabiti, da vse možnosti ne veljajo za vse vrste aplikacij. Nekatere aplikacije delujejo bolje, če prilagodimo nekatere nastavitve, nekatere pa ne. Najti morate pravo ravnovesje med konfiguriranjem teh nastavitev za vašo pričakovano delovno obremenitev in vrsto aplikacije, pri nastavljanju pa morate upoštevati tudi vedenje OS. Konfiguriranje parametrov jedra ni tako enostavno kot konfiguriranje parametrov baze podatkov; težje je dati priporočila.

Vir: www.habr.com

Dodaj komentar