Optimálna výkonnosť PostgreSQL závisí od správne určených parametrov operačného systému. Zle nastavené parametre jadra OS môžu viesť k zníženiu výkonu databázového servera. Preto je nevyhnutné, aby tieto parametre boli nastavené v súlade s databázovým serverom a jeho pracovnou záťažou. V tomto príspevku sa budeme zaoberať niektorými dôležitými parametrami jadra Linuxu, ktoré môžu ovplyvniť výkon databázového servera a spôsobmi ich nastavenia.
SHMMAX / SHMALL
SHMMAX — je to parameter jadra, ktorý sa používa na určenie maximálnej veľkosti jedného segmentu zdieľanej pamäte (shared memory), ktorý môže alokovať proces Linux. Do verzie 9.2 PostgreSQL používal System V (SysV), pre ktorý je potrebné nastaviť SHMMAX. Po verzii 9.2 PostgreSQL prešiel na zdieľanú pamäť POSIX. Takže teraz je potrebné menej bajtov zdieľanej pamäte System V.
Do verzie 9.3 bol SHMMAX najdôležitejším parametrom jadra. Hodnota SHMMAX je stanovená v bajtoch.
Podobne, SHMALL — je ďalší parameter jadra, ktorý sa používa na určenie
celkového objemu strán zdieľanej pamäte (shared memory). Ak chcete zobraziť aktuálne hodnoty SHMMAX, SHMALL alebo SHMMIN, použite príkaz ipcs.
SHM* Detaily — Linux
$ ipcs -lm
------ Limity zdieľanej pamäte --------
max počet segmentov = 4096
max veľkosť seg (kbytes) = 1073741824
max celková zdieľaná pamäť (kbytes) = 17179869184
min veľkosť seg (bajty) = 1SHM* Detaily — MacOS X
$ ipcs -M
Stav IPC od as of Thu Aug 16 22:20:35 PKT 2018
shminfo:
shmmax: 16777216 (max veľkosť zdieľaného pamäťového segmentu)
shmmin: 1 (min veľkosť zdieľaného pamäťového segmentu)
shmmni: 32 (max počet identifikátorov zdieľanej pamäte)
shmseg: 8 (max počet zdieľaných pamäťových segmentov na proces)
shmall: 1024 (max množstvo zdieľanej pamäte v stránkach)
PostgreSQL používa System V IPC na alokáciu 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 veľmi nízku hodnotu SHMMAX. Očakáva sa, že používatelia urobia úpravy a zvýšia hodnotu podľa zdieľanej pamäte, ktorú plánujú použiť.
Možné chyby nesprávnej konfigurácie
Ak je SHMMAX nastavený nesprávne, môže sa zobraziť chyba pri pokuse o inicializáciu klastrov PostgreSQL pomocou príkazu initdb.
initdb Zlyhanie
DETAIL: Zlyhaný systémový hovor bol shmget(key=1, size=2072576, 03600).
HINT: Táto chyba zvyčajne znamená, že požiadavka PostgreSQL na zdieľaný pamäťový segment prekročila SHMMAX parameter vášho jadra.
Môžete buď zmenšiť veľkosť požiadavky, alebo prekonfigurovať jadro s väčším SHMMAX. Ak chcete zmenšiť veľkosť požiadavky (aktuálne 2072576 bajtov),
znížte zdieľané používanie pamäte PostgreSQL, možno znížením shared_buffers alebo max_connections.
Ak je veľkosť požiadavky už malá, je možné, že je menšia ako parameter SHMMIN vo vašom jadre,
v takom prípade je potrebné zvýšiť veľkosť požiadavky alebo prekonfigurovať SHMMIN.
Dokumentácia PostgreSQL obsahuje viac informácií o konfigurácii zdieľanej pamäte. Detský proces vyšiel s kódom ukončenia 1
Podobne môžete získať chybu pri spustení servera PostgreSQL pomocou príkazu pg_ctl.
pg_ctl Zlyhanie
DETAIL: Zlyhaný systémový hovor bol shmget(kľúč=5432001, veľkosť=14385152, 03600).
HINT: Táto chyba zvyčajne znamená, že požiadavka PostgreSQL na zdieľaný pamäťový segment prekročila SHMMAX parameter vášho jadra.
Môžete buď zmenšiť veľkosť požiadavky, alebo prekonfigurovať jadro s väčším SHMMAX.; Ak chcete zmenšiť veľkosť požiadavky (aktuálne 14385152 bajtov), znížte zdieľané používanie pamäte PostgreSQL, možno znížením shared_buffers alebo max_connections.
Ak je veľkosť požiadavky už malá, je možné, že je menšia ako parameter SHMMIN vo vašom jadre,
v takom prípade je potrebné zvýšiť veľkosť požiadavky alebo prekonfigurovať SHMMIN.
Dokumentácia PostgreSQL obsahuje viac informácií o konfigurácii zdieľanej pamäte.
Porozumenie rozdielom v definíciách
Definícia parametrov SHMMAX/SHMALL sa trochu líši v Linuxe a MacOS X:
- Linux: kernel.shmmax, kernel.shmall
- MacOS X: kern.sysv.shmmax, kern.sysv.shmall
Tím sysctl môže byť použitá na dočasné zmenenie hodnoty. Ak chcete nastaviť trvalé hodnoty, pridajte záznam do /etc/sysctl.conf. Podrobnosti sú uvedené nižšie.
Zmena parametrov jadra 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 -> 16777216Zmena parametrov jadra na Linuxe
# 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 -> 16777216Nezabudnite: aby ste urobili zmeny trvalými, pridajte tieto hodnoty do /etc/sysctl.conf
Veľké stránky (Huge Pages)
V Linuxe sa štandardne používajú stránky pamäte 4 KB, v BSD — Super Pages, a vo Windows — Large Pages. Stránka je časť operačnej pamäte pridelená procesu. Proces môže mať niekoľko stránok v závislosti od požiadaviek na pamäť. Čím viac pamäte proces potrebuje, tým viac stránok je mu pridelených. OS podporuje tabuľku pridelovania stránok pre procesy. Čím menšia je veľkosť stránky, tým väčšia je tabuľka, tým viac času je potrebné na vyhľadanie stránky v tejto tabuľke stránok. Preto veľké stránky umožňujú používať veľký objem pamäte s menšími nákladmi; menej zobrazení stránok, menej chýb stránok, rýchlejšie operácie čítania/zápisu cez veľké buffery. Výsledkom je zlepšenie výkonu.
PostgreSQL podporuje veľké stránky len v Linuxe. Predvolene Linux používa 4 KB stránky pamäte, preto v prípadoch, keď je operácií s pamäťou príliš veľa, je potrebné nastaviť stránky väčšej veľkosti. Pozoruje sa zlepšenie výkonu pri použití veľkých stránok s veľkosťou 2 MB a až do 1 GB. Veľkosť veľkej stránky môže byť nastavená pri spustení. Môžete ľahko skontrolovať parametre veľkej stránky a ich využitie na vašom Linux počítači pomocou príkazu cat /proc/meminfo | grep -i huge.
Získanie informácií o veľkých stránkach (len na Linuxe)
Poznámka: Toto platí len pre Linux, pre iné operačné systémy je táto operácia ignorovaná
$ 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 kBV tomto príklade, hoci je veľkosť veľkej stránky nastavená na 2048 (2 MB), celkový počet veľkých stránok má hodnotu 0. To znamená, že veľké stránky sú vypnuté.
Skript na zistenie počtu veľkých stránok
Toto je jednoduchý skript, ktorý vráti požadovaný počet veľkých stránok. Spustite skript na vašom Linux serveri, kým beží PostgreSQL. Uistite sa, že pre premennú prostredia $PGDATA je nastavený adresár dát PostgreSQL.
Získanie počtu požadovaných veľkých stránok
#!/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: $hpVýstup zo skriptu vyzerá takto:
Výstup zo skriptu
Pid: 12737
VmPeak: 180932 kB
Hugepagesize: 2048 kB
Set Huge Pages: 88Odporúčaná hodnota veľkých stránok je 88, preto by ste mali nastaviť hodnotu 88.
Nastavenie veľkých stránok
sysctl -w vm.nr_hugepages=88Skontrolujte veľké stránky teraz, uvidíte, že veľké stránky nie sú používané (HugePages_Free = HugePages_Total).
Znovu informácie o veľkých stránkach (len na Linuxe)
$ 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 kBTeraz nastavte parameter huge_pages "on" v $PGDATA/postgresql.conf a reštartujte server.
A znovu informácie o veľkých stránkach (len na Linuxe)
$ 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 kBTeraz môžete vidieť, že je používané veľmi málo veľkých stránok. Skúsme teraz pridať nejaké dáta do databázy.
Niektoré operácie s databázou pre likvidá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 10000000Pozrime sa, či aktuálne používame viac veľkých stránok ako predtým.
Opäť informácie o veľkých stránkach (len na Linuxe)
$ 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 kBTeraz môžete vidieť, že väčšina veľkých stránok je využívaná.
Poznámka: Priemerná hodnota pre HugePages, ktorá sa tu používa, je veľmi nízka, čo nie je normálna hodnota pre stroj v produkčnom prostredí. Prosím, zhodnoťte potrebný 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. Tento parameter sa používa na riadenie správania swapovania (swappiness) (paging stránok do pamäte a von z nej) v Linuxe. Hodnota sa pohybuje od 0 do 100. Určuje, koľko pamäte sa vyprázdni alebo oslobodí. Nula znamená vypnuté swapovanie, zatiaľ čo 100 znamená agresívne swapovanie.
Môžete dosiahnuť dobrý výkon nastavením nižších hodnôt.
Nastavenie hodnoty 0 v novších jadrách môže spôsobiť, že OOM Killer (proces čistenia pamäte v Linuxe) zabije proces. Preto je bezpečné nastaviť hodnotu 1, ak chcete minimalizovať swapovanie. Predvolené nastavenie v Linuxe je 60. Vyššia hodnota spôsobuje, že MMU (jednotka správy pamäte) používa viac miesta na swapovanie ako RAM, zatiaľ čo nižšia hodnota udržuje viac údajov/kódu v pamäti.
Nižšia hodnota je dobrá stávka na zlepšenie výkonu v PostgreSQL.
vm.overcommit_memory / vm.overcommit_ratio
Aplikácie získavajú pamäť a oslobodzujú ju, keď ju už nepotrebujú. V niektorých prípadoch však aplikácia získa príliš veľa pamäte a neoslobodí ju. To môže vyvolať OOM killer. Tu sú možné hodnoty parametra vm.overcommit_memory s popisom pre každú:
- Heuristický overcommit (predvolené); založené na jadre heuristika
- Povoliť overcommit za každých okolností
- Nepreťažujte, neprekračujte overcommit pomer.
Odkaz:
vm.overcommit_ratio — percent of RAM available for overcommitment. A value of 50% on a system with 2 GB of RAM can allocate up to 3 GB of RAM.
A value of 2 for vm.overcommit_memory ensures better performance for PostgreSQL. This value maximizes the use of RAM by the server process without significant risk of being terminated by the OOM killer. The application can restart, but only within the overcommit limits, reducing the risk of the OOM killer terminating the process. Therefore, a value of 2 provides better performance than the default value of 0. However, reliability can be improved by preventing memory from exceeding the allowed limits, thereby eliminating the risk of the process being killed by the OOM killer.
In systems without swap, there may be an issue with vm.overcommit_memory set to 2.
vm.dirty_background_ratio / vm.dirty_background_bytes
vm.dirty_background_ratio — this is the percentage of memory filled with dirty pages that need to be written to disk. The flushing to disk is done in the background. The value of this parameter ranges from 0 to 100; however, a value below 5 may be ineffective and some kernels do not support it. 10 is the default value in most Linux systems. You can enhance performance for write-intensive operations with a lower ratio, which will mean that Linux flushes dirty pages in the background.
You need to set the value of vm.dirty_background_bytes depending on your disk speed.
There are no 'good' values for these two parameters, as both depend on the hardware. However, setting vm.dirty_background_ratio to 5 and vm.dirty_background_bytes to 25% of disk speed improves performance by ~25% in most cases.
vm.dirty_ratio / dirty_bytes
This is the same as vm.dirty_background_ratio / dirty_background_bytes, except that the flushing occurs during the active session, blocking the application. Therefore, vm.dirty_ratio must be higher than vm.dirty_background_ratio. This ensures that background processes will start earlier to avoid maximum blocking of the application. You can adjust the difference between these two ratios depending on I/O load.
Záver
Môžete nastaviť ďalšie parametre na zvýšenie výkonu, ale zlepšenia budú minimálne a nebudete mať žiadne významné výhody. Musíme mať na pamäti, že nie všetky parametre sa vzťahujú na všetky typy aplikácií. Niektoré aplikácie fungujú lepšie pri nastavovaní určitých parametrov, zatiaľ čo iné nie. Musíte nájsť správnu rovnováhu medzi konfiguráciami týchto parametrov pre očakávané pracovné zaťaženie a typ aplikácie, pričom je tiež potrebné zohľadniť správanie operačného systému. Nastaviť parametre jadra nie je také jednoduché ako nastaviť parametre databázy: tu je ťažšie poskytnúť vlastné odporúčania.
Zdroj: habr.com
