Nastavení funkce „Out-Of Memory Killer“ v Linux pro PostgreSQL

Nastavení funkce „Out-Of Memory Killer“ v Linux pro PostgreSQL

Když v Linux Databázový server se neočekávaně ukončí a je třeba zjistit příčinu. Může existovat několik důvodů. Například SIGSEGV — selhání kvůli chybě na backend serveru. Ale to je vzácné. Nejčastěji vám prostě dojde místo na disku nebo paměti. Pokud vám dojde místo na disku, existuje pouze jedna cesta ven – uvolnit místo a restartovat databázi.

Out-of-Memory Killer

Když u server nebo procesu dojde paměť, Linux Nástroj Out-Of-Memory Killer nabízí dvě řešení: zhroucení celého systému nebo ukončení procesu (aplikace), který spotřebovává paměť. Lepší je samozřejmě proces ukončit a zachránit tak operační systém před zhroucením. Stručně řečeno, nástroj Out-Of-Memory Killer je proces, který ukončí aplikaci, aby zachránil jádro před zhroucením. Obětuje aplikaci, aby operační systém zůstal v chodu. Nejprve si probereme, jak OOM funguje a jak jej ovládat, a poté se podíváme na to, jak nástroj OOM Killer rozhoduje, které aplikace ukončit.

Jeden z hlavních úkolů Linux — Alokovat paměť procesům, když si ji vyžádají. Proces nebo aplikace obvykle požaduje paměť od operačního systému, ale nepoužívá ji zcela. Pokud operační systém alokuje paměť každému, kdo si ji vyžádá, ale neplánuje ji použít, systému rychle dojde paměť a systém se zhroutí. Aby se tomu zabránilo, operační systém rezervuje paměť pro proces, ale ve skutečnosti ji nealokuje. Paměť je alokována pouze tehdy, když ji proces skutečně hodlá použít. Někdy operační systém nemá volnou paměť, ale alokuje paměť procesu, a když ji proces potřebuje, operační systém ji alokuje, pokud může. Nevýhodou je, že operační systém někdy rezervuje paměť, ale když je potřeba, není žádná volná paměť, což způsobí zhroucení systému. OOM hraje v tomto scénáři klíčovou roli, protože ukončuje procesy, aby zabránil panice jádra. Když je proces PostgreSQL násilně ukončen, v protokolu se zobrazí následující zpráva:

Out of Memory: Killed process 12345 (postgres).

Pokud je v systému málo paměti a nelze ji uvolnit, je funkce volána out_of_memory. V této fázi jí zbývá udělat jediné – dokončit jeden nebo více procesů. Měl by OOM-killer ukončit proces okamžitě nebo může počkat? Je zřejmé, že když je voláno out_of_memory, je to kvůli čekání na I/O operaci nebo stránkování na disk. OOM zabiják tedy musí nejprve provést kontroly a na jejich základě rozhodnout, že je potřeba proces ukončit. Pokud jsou všechny níže uvedené kontroly pozitivní, OOM proces ukončí.

Výběr procesu

Když dojde paměť, funkce se zavolá out_of_memory(). Má funkci select_bad_process(), který obdrží hodnocení od funkce badness(). Bude zaměřen na „nejhorší“ proces. Funkce badness() vybírá proces podle určitých pravidel.

  1. Jádro pro sebe potřebuje určitou minimální paměť.
  2. Musíte uvolnit hodně paměti.
  3. Není potřeba ukončovat procesy, které využívají málo paměti.
  4. Je třeba dokončit minimum procesů.
  5. Komplexní algoritmy, které zvyšují šance na dokončení u těch procesů, které chce dokončit sám uživatel.

Po dokončení všech těchto kontrol OOM prozkoumá skóre (oom_score). OOM přiděluje oom_score každý proces a poté tuto hodnotu vynásobí množstvím paměti. Procesy s vyššími hodnotami se s větší pravděpodobností stanou obětí OOM Killera. Procesy spojené s uživatelem root mají nižší skóre a je méně pravděpodobné, že budou nuceny ukončit.

postgres=# SELECT pg_backend_pid();
pg_backend_pid 
----------------
    3813
(1 row)

ID procesu Postgres je 3813, takže v jiném shellu je možné získat skóre pomocí tohoto parametru jádra oom_score:

vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2

Pokud nechcete, aby OOM-Killer vůbec zabil proces, existuje další možnost jádra: oom_score_adj. Přidejte velkou zápornou hodnotu, abyste snížili šance na dokončení procesu, který si ceníte.

sudo echo -100 > /proc/3813/oom_score_adj

Chcete-li nastavit hodnotu oom_score_adj, nastavte OOMScoreAdjust v servisním bloku:

[Service]
OOMScoreAdjust=-1000

Nebo použít oomprotect v týmu rcctl.

rcctl set <i>servicename</i> oomprotect -1000

Vynutit ukončení procesu

Když je již vybrán jeden nebo více procesů, OOM-Killer zavolá funkci oom_kill_task(). Tato funkce vyšle do procesu ukončovací signál. V případě nedostatku paměti oom_kill() Volá tuto funkci pro odeslání signálu SIGKILL do procesu. Zpráva se zapíše do protokolu jádra.

Out of Memory: Killed process [pid] [name].

Jak ovládat OOM-Killer

В Linux OOM-Killer můžete povolit nebo zakázat (i když se to nedoporučuje). Chcete-li jej povolit nebo zakázat, použijte parametr vm.oom-kill. Chcete-li povolit OOM-Killer za běhu, spusťte příkaz sysctl.

sudo -s sysctl -w vm.oom-kill = 1

Chcete-li zakázat OOM-Killer, zadejte ve stejném příkazu hodnotu 0:

sudo -s sysctl -w vm.oom-kill = 0

Výsledek tohoto příkazu nebude uložen navždy, ale pouze do prvního restartu. Pokud potřebujete větší vytrvalost, přidejte tento řádek do souboru /etc/sysctl.conf:

echo vm.oom-kill = 1 >>/etc/sysctl.conf

Dalším způsobem, jak povolit a zakázat, je napsat proměnnou panic_on_oom. Hodnotu lze vždy zkontrolovat /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Pokud nastavíte hodnotu na 0, pak při vyčerpání paměti nedojde k panice jádra.

$ echo 0 > /proc/sys/vm/panic_on_oom

Pokud nastavíte hodnotu na 1, pak když dojde paměť, dojde k panice jádra.

echo 1 > /proc/sys/vm/panic_on_oom

OOM-Killer lze, jak jsme již zmínili, zapínat a vypínat. Linux může rezervovat více paměti pro procesy, než je k dispozici, ale ve skutečnosti ji nealokovat, a toto chování je řízeno parametrem jádra LinuxZa to je zodpovědná proměnná. vm.overcommit_memory.

Můžete pro něj zadat následující hodnoty:

0: Jádro samo rozhoduje, zda rezervovat příliš mnoho paměti. Toto je výchozí hodnota ve většině verzí. Linux.
1: Jádro si vždy vyhradí paměť navíc. To je riskantní, protože paměť může dojít, protože to s největší pravděpodobností jednoho dne procesy budou vyžadovat.
2: jádro si nevyhradí více paměti, než je uvedeno v parametru overcommit_ratio.

Pomocí tohoto parametru určíte procento paměti, které je povoleno přerezervovat. Pokud pro něj není místo, není přidělena žádná paměť a rezervace bude zamítnuta. Toto je nejbezpečnější možnost doporučená pro PostgreSQL. OOM-Killer je ovlivněn dalším prvkem – schopností swapování, která je řízena proměnnou cat /proc/sys/vm/swappiness. Tyto hodnoty říkají jádru, jak zacházet se stránkováním. Čím vyšší hodnota, tím menší je pravděpodobnost, že OOM ukončí proces, ale kvůli I/O operacím to má negativní dopad na databázi. A naopak – čím nižší hodnota, tím vyšší je pravděpodobnost zásahu OOM-Killer, ale také vyšší je výkon databáze. Výchozí hodnota je 60, ale pokud se celá databáze vejde do paměti, je lepší nastavit hodnotu na 1.

Výsledky

Nenechte se „zabijákem“ v OOM-Killer vyděsit. V tomto případě bude vrah zachráncem vašeho systému. „Zabije“ nejhorší procesy a zachrání systém před zhroucením. Abyste nemuseli k ukončení PostgreSQL používat OOM-Killer, nastavte na vm.overcommit_memory hodnota 2. To nezaručuje, že OOM-Killer nebude muset zasahovat, ale sníží se tím pravděpodobnost vynucení ukončení procesu PostgreSQL.

Zdroj: www.habr.com

Kupte si spolehlivý hosting pro stránky s DDoS ochranou, VPS VDS servery 🔥 Kupte si spolehlivý webhosting s ochranou DDoS, VPS VDS servery | ProHoster