Konfigurácia možností jadra Linuxu na optimalizáciu PostgreSQL

Konfigurácia možností jadra Linuxu na optimalizáciu PostgreSQL Optimálny výkon PostgreSQL závisí od správne definovaných parametrov operačného systému. Zle nakonfigurované nastavenia jadra OS môžu spôsobiť slabý výkon databázového servera. Preto je nevyhnutné, aby boli tieto nastavenia nakonfigurované podľa databázového servera a jeho pracovného zaťaženia. V tomto príspevku budeme diskutovať o niektorých dôležitých parametroch jadra Linuxu, ktoré môžu ovplyvniť výkon databázového servera a ako ich nakonfigurovať.

SHMMAX / SHMALL

SHMMAX je parameter jadra používaný na určenie maximálnej veľkosti jedného segmentu zdieľanej pamäte, ktorý môže proces Linuxu prideliť. Pred verziou 9.2 PostgreSQL používal System V (SysV), ktorý vyžaduje nastavenie SHMMAX. Po 9.2 prešiel PostgreSQL na zdieľanú pamäť POSIX. Takže teraz je potrebných menej bajtov zdieľanej pamäte System V.

Pred verziou 9.3 bol SHMMAX najdôležitejším parametrom jadra. Hodnota SHMMAX je zadaná v bajtoch.

podobne SHMALL je ďalší parameter jadra používaný na určenie
celosystémový objem stránok zdieľanej pamäte. Ak chcete zobraziť aktuálne hodnoty SHMMAX, SHMALL alebo SHMMIN, použite príkaz ipcs.

Podrobnosti SHM* - 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

Podrobnosti SHM* - 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)

Používa PostgreSQL Systém V IPC na pridelenie zdieľanej pamäte. Tento parameter je jedným z najdôležitejších parametrov jadra. Kedykoľvek dostanete nasledujúce chybové hlásenia, znamená to, že máte staršiu verziu PostgreSQL a vaša hodnota SHMMAX je veľmi nízka. Od používateľov sa očakáva, že upravia a zvýšia hodnotu podľa zdieľanej pamäte, ktorú zamýšľajú používať.

Možné chyby nesprávnej konfigurácie

Ak SHMMAX nie je správne nakonfigurovaný, pri pokuse o inicializáciu klastra PostgreSQL pomocou príkazu sa môže zobraziť chyba initdb.

Zlyhanie 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

Podobne sa môže zobraziť chyba pri spustení servera PostgreSQL pomocou príkazu pg_ctl.

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

Pochopenie rozdielov v definíciách

Definovanie parametrov SHMMAX/SHMALL sa v systémoch Linux a MacOS X mierne líši:

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

Tím sysctl možno použiť na dočasnú zmenu hodnoty. Ak chcete nastaviť konštantné hodnoty, pridajte položku do /etc/sysctl.conf. Podrobnosti sú uvedené nižšie.

Zmena nastavení jadra v systéme 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

Zmena parametrov jadra v systéme 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

Nezabudni: Ak chcete, aby boli zmeny trvalé, pridajte tieto hodnoty do /etc/sysctl.conf

Obrovské stránky

Linux štandardne používa 4 KB pamäťové stránky, BSD používa XNUMX KB pamäťové stránky. Super stránkya v systéme Windows - Veľké strany. Stránka je časť pamäte RAM pridelená procesu. Proces môže mať viacero stránok v závislosti od požiadaviek na pamäť. Čím viac pamäte proces vyžaduje, tým viac stránok má alokovaných. OS udržiava tabuľku prideľovania stránok pre procesy. Čím menšia je veľkosť stránky, tým väčšia je tabuľka, tým dlhšie trvá nájdenie stránky v tejto tabuľke stránok. Veľké strany preto umožňujú použitie veľkého množstva pamäte so zníženou réžiou; menej zobrazení stránky, menej chýb stránok, rýchlejšie operácie čítania/zápisu cez väčšie vyrovnávacie pamäte. Výsledkom je zlepšený výkon.

PostgreSQL podporuje iba veľké stránky v systéme Linux. Linux štandardne používa 4 KB pamäťové stránky, takže v prípadoch, keď je pamäťových operácií príliš veľa, je potrebné nastaviť väčšie stránky. Zvýšenie výkonu sa pozoruje pri použití veľkých stránok s veľkosťou 2 MB až 1 GB. Veľkú veľkosť stránky je možné nastaviť pri spustení. Pomocou príkazu môžete jednoducho skontrolovať parametre veľkých stránok a ich použitie na vašom počítači so systémom Linux cat /proc/meminfo | grep -i obrovský.

Získavanie informácií o veľkých stránkach (iba 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

V tomto príklade, hoci je veľkosť veľkej strany nastavená na 2048 (2 MB), celkový počet veľkých strán je nastavený na 0. To znamená, že veľké strany sú zakázané.

Skript na určenie počtu veľkých strán

Tento jednoduchý skript vráti požadovaný počet veľkých stránok. Spustite skript na svojom serveri Linux, kým je spustený PostgreSQL. Uistite sa, že pre premennú prostredia $PGDATA Je zadaný dátový adresár PostgreSQL.

Získanie počtu požadovaných veľkých strán

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

Výstup skriptu vyzerá takto:

Výstup skriptu

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

Odporúčaná hodnota pre veľké strany je 88, takže by ste ju mali nastaviť na 88.

Inštalácia veľkých stránok

sysctl -w vm.nr_hugepages=88

Teraz skontrolujte veľké stránky, uvidíte, že veľké stránky sa nepoužívajú (HugePages_Free = HugePages_Total).

Znovu navštívené veľké stránky (iba 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

Teraz nastavte parameter huge_pages na "on" v $PGDATA/postgresql.conf a reštartujte server.

Ešte raz, informácie o veľkých stránkach (iba 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

Teraz môžete vidieť, že sa používa veľmi málo veľkých stránok. Skúsme teraz pridať nejaké údaje do databázy.

Niektoré databázové operácie na recykláciu veľkých stránok

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

Pozrime sa, či teraz používame viac veľkých stránok ako predtým.

Viac informácií o veľkých stránkach (iba 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

Teraz môžete vidieť, že väčšina veľkých stránok sa používa.

Poznámka: Odhadovaná hodnota pre HugePages, ktorá sa tu používa, je veľmi nízka, čo nie je normálna hodnota pre počítač s produktovým prostredím. Odhadnite požadovaný počet stránok pre váš systém a nastavte ich podľa zaťaženia a zdrojov.

vm.swappiness

vm.swappiness je ďalší parameter jadra, ktorý môže ovplyvniť výkon databázy. Táto voľba sa používa na ovládanie správania swappiness (prehadzovanie stránok do pamäte a mimo nej) v systéme Linux. Hodnota sa pohybuje od 0 do 100. Určuje, koľko pamäte bude stránkované alebo odstránené. Nula znamená žiadnu výmenu a 100 znamená agresívnu výmenu.

Dobrý výkon môžete dosiahnuť nastavením nižších hodnôt.

Nastavenie na 0 na novších jadrách môže spôsobiť, že OOM Killer (proces čistenia pamäte v Linuxe) zastaví proces. Takže je bezpečné nastaviť ho na 1, ak chcete minimalizovať zámenu. Predvolená hodnota v Linuxe je 60. Vyššia hodnota spôsobí, že MMU (jednotka správy pamäte) využíva viac odkladacieho priestoru ako RAM, zatiaľ čo nižšia hodnota uchováva viac údajov/kódu v pamäti.

Nižšia hodnota je dobrou stávkou na zlepšenie výkonu v PostgreSQL.

vm.overcommit_memory / vm.overcommit_ratio

Aplikácie získavajú pamäť a uvoľňujú ju, keď už nie je potrebná. V niektorých prípadoch však aplikácia dostane príliš veľa pamäte a neuvoľní ju. To môže spôsobiť vraha OOM. Tu sú možné hodnoty parametrov vm.overcommit_memory s popisom každého:

  1. Heuristický overcommit (predvolené); heuristika založená na jadre
  2. Napriek tomu povoľte overcommit
  3. Nepreháňajte to, neprekračujte pomer overcommit.

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

vm.overcommit_ratio — percento pamäte RAM dostupnej na preťaženie. Hodnota 50 % na systéme s 2 GB RAM môže prideliť až 3 GB RAM.

Hodnota 2 pre vm.overcommit_memory poskytuje lepší výkon pre PostgreSQL. Táto hodnota maximalizuje využitie RAM procesom servera bez akéhokoľvek významného rizika, že bude zabitý procesom OOM zabijaka. Aplikácia sa bude dať znova načítať, ale len v rámci limitov prekročenia, čo znižuje riziko, že OOM zabijak proces zabije. Preto hodnota 2 poskytuje lepší výkon ako predvolená hodnota 0. Spoľahlivosť však možno zlepšiť zabezpečením toho, že pamäť mimo rozsahu nebude preťažená. Tým sa eliminuje riziko, že proces zabije OOM zabijak.

Na systémoch bez swapovania sa môže vyskytnúť problém s vm.overcommit_memory rovným 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 percento pamäte zaplnenej špinavými stránkami, ktoré je potrebné zapísať na disk. Vyprázdnenie disku prebieha na pozadí. Hodnota tohto parametra sa pohybuje od 0 do 100; hodnota pod 5 však môže byť neúčinná a niektoré jadrá ju nepodporujú. 10 je predvolená hodnota na väčšine systémov Linux. Výkon pri operáciách náročných na zápis môžete zlepšiť menším faktorom, čo bude znamenať, že Linux vyprázdni špinavé stránky na pozadí.

Musíte nastaviť hodnotu vm.dirty_background_bytes v závislosti od rýchlosti vašej jazdy.

Pre tieto dva parametre neexistujú žiadne „dobré“ hodnoty, pretože oba závisia od hardvéru. Nastavenie vm.dirty_background_ratio na 5 a vm.dirty_background_bytes na 25 % rýchlosti disku však vo väčšine prípadov zvýši výkon na ~25 %.

vm.dirty_ratio/dirty_bytes

Je to rovnaké ako vm.dirty_background_ratio/dirty_background_bytes, okrem toho, že reset sa vykoná v pracovnej relácii, čím sa aplikácia zablokuje. Preto by mal byť vm.dirty_ratio vyšší ako vm.dirty_background_ratio. To zaisťuje, že procesy na pozadí sa spustia skôr, aby sa zabránilo blokovaniu aplikácie čo najviac. Rozdiel medzi týmito dvoma pomermi môžete upraviť v závislosti od zaťaženia I/O disku.

Celkový

Môžete upraviť ďalšie nastavenia, aby ste zlepšili výkon, ale vylepšenia budú minimálne a neuvidíte veľa výhod. Musíme si uvedomiť, že nie všetky možnosti platia pre všetky typy aplikácií. Niektoré aplikácie fungujú lepšie, keď upravíme niektoré nastavenia, a niektoré nie. Musíte nájsť správnu rovnováhu medzi konfiguráciou týchto nastavení pre očakávané pracovné zaťaženie a typ aplikácie a pri ladení musíte zvážiť aj správanie operačného systému. Konfigurácia parametrov jadra nie je taká jednoduchá ako konfigurácia databázových parametrov, je ťažšie dávať odporúčania.

Zdroj: hab.com

Pridať komentár