Optimální výkon PostgreSQL závisí na správně nastavených parametrech operačního systému. Špatně nastavené parametry jádra OS mohou vést ke snížení výkonu databázového serveru. Je tedy nezbytné, aby byly tyto parametry nakonfigurovány v souladu s databázovým serverem a jeho pracovním zatížením. V tomto článku se budeme zabývat některými důležitými parametry jádra Linux, které mohou ovlivnit výkon databázového serveru, a způsoby jejich nastavení.
SHMMAX / SHMALL
SHMMAX — je to parametr jádra, který se používá pro určení maximální velikosti jednoho segmentu sdílené paměti (shared memory), který může alokovat proces Linuxu. Do verze 9.2 PostgreSQL používal System V (SysV), který vyžadoval nastavení SHMMAX. Po verzi 9.2 PostgreSQL přešlo na sdílenou paměť POSIX. Takže nyní je potřeba méně bajtů sdílené paměti System V.
Do verze 9.3 byl SHMMAX nejdůležitějším parametrem jádra. Hodnota SHMMAX se nastavuje v bajtech.
Podobně, SHMALL — je to další parametr jádra, který se používá pro určení
celkového objemu stránek sdílené paměti (shared memory). Chcete-li zobrazit aktuální hodnoty SHMMAX, SHMALL nebo SHMMIN, použijte příkaz ipcs.
SHM* Detaily — Linux
$ ipcs -lm
------ Limity sdílené paměti --------
max počet segmentů = 4096
max velikost seg (kilo-bajty) = 1073741824
max celková sdílená paměť (kilo-bajty) = 17179869184
min velikost seg (bajty) = 1SHM* Detaily — MacOS X
$ ipcs -M
Stav IPC z jako Thu Aug 16 22:20:35 PKT 2018
shminfo:
shmmax: 16777216 (maximální velikost segmentu sdílené paměti)
shmmin: 1 (minimální velikost segmentu sdílené paměti)
shmmni: 32 (maximální počet identifikátorů sdílené paměti)
shmseg: 8 (maximální počet segmentů sdílené paměti na proces)
shmall: 1024 (maximální množství sdílené paměti ve stránkách)
PostgreSQL používá System V IPC pro alokaci sdílené paměti. Tento parametr je jedním z nejdůležitějších parametrů jádra. Kdykoli obdržíte následující chybové zprávy, znamená to, že máte starší verzi PostgreSQL a máte velmi nízkou hodnotu SHMMAX. Očekává se, že uživatelé upraví a zvýší hodnotu v souladu se sdílenou pamětí, kterou plánují použít.
Možné chyby nesprávné konfigurace
Pokud je SHMMAX nastaven nesprávně, může se objevit chyba při pokusu o inicializaci klastru PostgreSQL pomocí příkazu initdb.
initdb Neúspěch
DETAIL: Neúspěšný systémový volání bylo shmget(key=1, size=2072576, 03600).
HINT: Tato chyba obvykle znamená, že žádost PostgreSQL o segment sdílené paměti překročila parametr SHMMAX vašeho jádra.
Můžete buď snížit velikost požadavku, nebo překonfigurovat jádro na větší SHMMAX. Pro snížení velikosti požadavku (aktuálně 2072576 bajtů),
snižte použití sdílené paměti PostgreSQL, například snížením shared_buffers nebo max_connections.
Pokud je velikost požadavku již malá, je možné, že je menší než parametr SHMMIN vašeho jádra,
v takovém případě je nutné zvýšit velikost požadavku nebo překonfigurovat SHMMIN.
Dokumentace PostgreSQL obsahuje více informací o konfiguraci sdílené paměti. Dětský proces skončil s chybovým kódem 1.
Podobně můžete získat chybu při spuštění serveru PostgreSQL pomocí příkazu pg_ctl.
pg_ctl Chyba
DETAIL: Nepodařil se systémový hovor shmget(key=5432001, size=14385152, 03600).
HINT: Tato chyba obvykle znamená, že žádost PostgreSQL o segment sdílené paměti překročila parametr SHMMAX vašeho jádra.
Můžete buď snížit velikost požadavku, nebo překonfigurovat jádro na větší SHMMAX.; Pro snížení velikosti požadavku (aktuálně 14385152 bajtů) snižte použití sdílené paměti PostgreSQL, například snížením shared_buffers nebo max_connections.
Pokud je velikost požadavku již malá, je možné, že je menší než parametr SHMMIN vašeho jádra,
v takovém případě je nutné zvýšit velikost požadavku nebo překonfigurovat SHMMIN.
Dokumentace PostgreSQL obsahuje více informací o konfiguraci sdílené paměti.
Chápání rozdílů v definicích
Definice parametrů SHMMAX/SHMALL se mírně liší v Linuxu a MacOS X:
- Linux: kernel.shmmax, kernel.shmall
- MacOS X: kern.sysv.shmmax, kern.sysv.shmall
Tým sysctl může být použita pro dočasnou změnu hodnoty. Pro nastavení trvalých hodnot přidejte zápis do /etc/sysctl.conf. Podrobnosti jsou uvedeny níže.
Změna parametrů jádra 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 -> 16777216Změna parametrů jádra 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 -> 16777216Nezapomeňte: aby změny byly trvalé, přidejte tyto hodnoty do /etc/sysctl.conf
Velké stránky (Huge Pages)
Ve výchozím nastavení Linux používá 4 KB paměťové stránky, v BSD — Super Pages, a ve Windows — Large Pages. Stránka je část operační paměti přidělená procesu. Proces může mít několik stránek v závislosti na požadavcích na paměť. Čím více paměti proces potřebuje, tím více stránek mu je přiděleno. OS podporuje tabulku přidělování stránek pro procesy. Čím menší je velikost stránky, tím větší je tabulka, tím více času je potřeba pro vyhledávání stránky v této tabulce stránek. Proto velké stránky umožňují využívat velké objemy paměti s nižšími náklady; méně prohlížených stránek, méně chyb stránek, rychlejší operace čtení/zápisu prostřednictvím větších vyrovnávacích pamětí. Jako výsledek — zlepšení výkonu.
PostgreSQL podporuje velké stránky pouze na Linuxu. Ve výchozím nastavení Linux používá stránky s velikostí 4 KB, takže v případech, kdy je operací s pamětí příliš mnoho, je nutné nastavit větší velikosti stránek. Dochází k nárůstu výkonu při využití velkých stránek o velikosti 2 MB a až 1 GB. Velikost velké stránky může být nastavena při spuštění. Můžete snadno zkontrolovat parametry velkých stránek a jejich využití ve svém Linuxovém počítači pomocí příkazu cat /proc/meminfo | grep -i huge.
Získání informací o velkých stránkách (pouze na Linuxu)
Poznámka: Toto platí pouze pro Linux, pro ostatní OS je tato operace ignorována$ 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 příkladu, i když je velikost velké stránky nastavena na 2048 (2 MB), celkový počet velkých stránek má hodnotu 0. To znamená, že velké stránky jsou zakázány.
Skript pro určení počtu velkých stránek
Toto je jednoduchý skript, který vrací požadovaný počet velkých stránek. Spusťte skript na svém Linuxovém serveru, zatímco běží PostgreSQL. Ujistěte se, že je pro proměnnou prostředí $PGDATA nastaven adresář dat PostgreSQL.
Získání čísla požadovaných velkých stránek
#!/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 skriptu vypadá takto:
Výstup skriptu
Pid: 12737
VmPeak: 180932 kB
Hugepagesize: 2048 kB
Set Huge Pages: 88Doporučená hodnota velkých stránek je 88, takže byste měli nastavit hodnotu 88.
Nastavení velkých stránek
sysctl -w vm.nr_hugepages=88Zkontrolujte velké stránky nyní, uvidíte, že velké stránky nejsou používány (HugePages_Free = HugePages_Total).
Znovu informace o velkých stránkách (pouze na Linuxu)
$ 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 kBNyní nastavte parametr huge_pages „on“ v $PGDATA/postgresql.conf a restartujte server.
A znovu informace o velkých stránkách (pouze na Linuxu)
$ 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 kBNyní můžete vidět, že se používá velmi málo velkých stránek. Zkusme nyní přidat nějaká data do databáze.
Některé operace s databází pro využití velkých stránek
postgres=# CREATE TABLE foo(a INTEGER);
CREATE TABLE
postgres=# INSERT INTO foo VALUES(generate_Series(1,10000000));
INSERT 0 10000000Podívejme se, zda nyní používáme více velkých stránek než dříve.
Ještě jednou informace o velkých stránkách (pouze na Linuxu)
$ 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 kBNyní můžete vidět, že většina velkých stránek je využita.
Poznámka: příkladem zde použité hodnoty pro HugePages je velmi nízké, což není normální hodnota pro stroj v produkčním prostředí. Prosím, zhodnoťte potřebný počet stránek pro váš systém a nastavte je podle zátěže a zdrojů.
vm.swappiness
vm.swappiness — to je další parametr jádra, který může ovlivnit výkon databáze. Tento parametr se používá k řízení chování swapování (swappiness) (přesunování stránek do paměti a z ní) v Linuxu. Hodnota se pohybuje od 0 do 100. Určuje, kolik paměti bude uvolněno nebo vyplaceno. Nula znamená vypnutí swapování, zatímco 100 znamená agresivní swapování.
Můžete dosáhnout dobrého výkonu nastavením nižších hodnot.
Nastavení hodnoty 0 v novějších jádrech může způsobit, že OOM Killer (proces čištění paměti v Linuxu) zabije proces. Takže je bezpečné nastavit hodnotu 1, pokud chcete minimalizovat swapování. Výchozí hodnota v Linuxu je 60. Vyšší hodnota nutí MMU (řídicí blok paměti) používat více místa pro swapování než RAM, zatímco nižší hodnota uchovává více dat/kódu v paměti.
Nižší hodnota je dobrá sázka na zlepšení výkonu v PostgreSQL.
vm.overcommit_memory / vm.overcommit_ratio
Aplikace získávají paměť a uvolňují ji, když ji již nepotřebují. Ale v některých případech aplikace získává příliš mnoho paměti a neuvolňuje ji. To může způsobit OOM killer. Zde jsou možné hodnoty parametru vm.overcommit_memory s popisem pro každou:
- Heuristický overcommit (výchozí); založená na jádře heuristika
- Povolit overcommit v každém případě
- Nepřehrávejte to, nepřekračujte overcommit koeficient.
Odkaz:
vm.overcommit_ratio — procento operační paměti dostupné pro nadměrné zatížení. Hodnota 50 % v systému se 2 GB RAM může přidělovat až 3 GB RAM.
Hodnota 2 pro vm.overcommit_memory zajišťuje lepší výkon pro PostgreSQL. Tato hodnota maximalizuje využití operační paměti serverovým procesem bez jakéhokoliv významného rizika, že bude zabit procesem OOM killer. Aplikace se bude moci restartovat, ale pouze v rámci nadměrného útro, což snižuje riziko, že OOM killer zabije proces. Proto hodnota 2 přináší lepší výkon než výchozí hodnota 0. Nicméně spolehlivost může být zlepšena tím, že paměť mimo povolený rozsah nebude přetížena. To vylučuje riziko, že proces bude zabit OOM killerem.
V systémech bez swapování může vzniknout problém s vm.overcommit_memory rovno 2.
vm.dirty_background_ratio / vm.dirty_background_bytes
vm.dirty_background_ratio — to je procento paměti zaplněné "špinavými" stránkami, které je třeba zapsat na disk. Zápis na disk se provádí na pozadí. Hodnota tohoto parametru se pohybuje od 0 do 100; nicméně hodnota pod 5 může být neefektivní a některá jádra ji nepodporují. 10 — výchozí hodnota ve většině systémů Linux. Můžete zvýšit výkon pro operace s intenzivním zápisem s nižším poměrem, což znamená, že Linux bude zapisovat špinavé stránky na pozadí.
Musíte nastavit hodnotu vm.dirty_background_bytes v závislosti na rychlosti vašeho disku.
Pro tyto dva parametry neexistují žádné "dobré" hodnoty, protože oba závisí na hardwaru. Nicméně nastavení vm.dirty_background_ratio na hodnotu 5 a vm.dirty_background_bytes na 25 % z rychlosti disku zvýší výkon přibližně o 25 % ve většině případů.
vm.dirty_ratio / dirty_bytes
To je to samé jako vm.dirty_background_ratio / dirty_background_bytes, s tím rozdílem, že zápis se provádí během aktivní relace, což blokuje aplikaci. Proto by vm.dirty_ratio mělo být vyšší než vm.dirty_background_ratio. To zajišťuje, že procesy na pozadí se spustí dříve, aby se předešlo co největší blokaci aplikace. Můžete upravit rozdíl mezi těmito dvěma poměry v závislosti na zatížení diskového I/O.
Výsledek
Můžete upravit další nastavení pro zvýšení výkonu, ale zlepšení budou minimální a nezískáte žádné významné výhody. Musíme mít na paměti, že ne všechny parametry se vztahují na všechny typy aplikací. Některé aplikace fungují lépe, když upravujeme některé parametry, zatímco jiné nikoli. Musíte najít správnou rovnováhu mezi konfiguracemi těchto parametrů pro očekávanou pracovní zátěž a typ aplikace, a také při úpravách je třeba brát v úvahu chování operačního systému. Upravovat jádrové parametry není tak jednoduché jako upravovat databázové parametry: zde je složitější poskytnout své doporučení.
Zdroj: habr.com
