Nastavenie funkcie „Out-Of Memory Killer“ v Linux pre PostgreSQL

Nastavenie funkcie „Out-Of Memory Killer“ v Linux pre PostgreSQL

Keď v Linux Databázový server sa neočakávane ukončí a je potrebné určiť príčinu. Môže existovať niekoľko dôvodov. Napríklad, SIGSEGV — zlyhanie v dôsledku chyby na backend serveri. Ale to je zriedkavé. Najčastejšie vám jednoducho dôjde miesto na disku alebo pamäť. Ak vám dôjde miesto na disku, existuje len jedna cesta von – uvoľniť miesto a reštartovať databázu.

Zabijak s nedostatkom pamäte

Keď ty server alebo procesu dôjde pamäť, Linux Nástroj Out-Of-Memory Killer ponúka dve riešenia: zrútenie celého systému alebo ukončenie procesu (aplikácie), ktorý spotrebúva pamäť. Lepšie je, samozrejme, proces ukončiť a zachrániť tak operačný systém pred zrútením. Stručne povedané, nástroj Out-Of-Memory Killer je proces, ktorý ukončí aplikáciu, aby zachránil jadro pred zrútením. Obetuje aplikáciu, aby operačný systém mohol bežať. Najprv si povieme, ako funguje OOM a ako ho ovládať, a potom sa pozrime na to, ako nástroj OOM Killer rozhoduje, ktoré aplikácie ukončiť.

Jednou z hlavných úloh Linux — Prideľovanie pamäte procesom, keď si ju vyžiadajú. Proces alebo aplikácia zvyčajne vyžaduje pamäť od operačného systému, ale nevyužije ju úplne. Ak operačný systém prideľuje pamäť každému, kto ju požiada, ale neplánuje ju použiť, systému sa rýchlo minie pamäť a systém zlyhá. Aby sa tomu zabránilo, operačný systém rezervuje pamäť pre proces, ale v skutočnosti ju neprideľuje. Pamäť sa prideľuje iba vtedy, keď ju proces skutočne plánuje použiť. Niekedy operačný systém nemá voľnú pamäť, ale prideľuje ju procesu a keď ju proces potrebuje, operačný systém ju prideľuje, ak môže. Nevýhodou je, že niekedy si operačný systém rezervuje pamäť, ale keď je to potrebné, nie je k dispozícii žiadna voľná pamäť, čo spôsobí zlyhanie systému. OOM zohráva v tomto scenári kľúčovú úlohu, pretože ukončuje procesy, aby zabránil panike jadra. Keď je proces PostgreSQL násilne ukončený, v protokole sa zobrazí nasledujúca správa:

Out of Memory: Killed process 12345 (postgres).

Ak má systém málo pamäte a nemožno ju uvoľniť, funkcia sa zavolá out_of_memory. V tejto fáze jej ostáva už len jedna vec – dokončiť jeden alebo viacero procesov. Mal by OOM-killer ukončiť proces okamžite alebo môže počkať? Je zrejmé, že keď sa volá out_of_memory, je to kvôli čakaniu na I/O operáciu alebo stránkovanie na disk. OOM zabijak preto musí najskôr vykonať kontroly a na ich základe rozhodnúť, že je potrebné proces ukončiť. Ak sú všetky nižšie uvedené kontroly pozitívne, OOM proces ukončí.

Výber procesu

Keď dôjde pamäť, zavolá sa funkcia out_of_memory(). Má funkciu select_bad_process(), ktorý dostáva hodnotenie od funkcie badness(). Zameria sa na „najhorší“ proces. Funkcia badness() vyberá proces podľa určitých pravidiel.

  1. Jadro potrebuje pre seba určitú minimálnu pamäť.
  2. Potrebujete uvoľniť veľa pamäte.
  3. Nie je potrebné ukončiť procesy, ktoré využívajú málo pamäte.
  4. Je potrebné dokončiť minimálne procesy.
  5. Komplexné algoritmy, ktoré zvyšujú šance na dokončenie tých procesov, ktoré chce používateľ sám dokončiť.

Po dokončení všetkých týchto kontrol OOM preskúma skóre (oom_score). OOM menuje oom_score každý proces a potom túto hodnotu vynásobí množstvom pamäte. Procesy s väčšími hodnotami sa s väčšou pravdepodobnosťou stanú obeťou OOM Killera. Procesy spojené s užívateľom root majú nižšie skóre a je menej pravdepodobné, že budú nútené ukončiť.

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

ID procesu Postgres je 3813, takže v inom prostredí je možné získať skóre pomocou tohto parametra jadra oom_score:

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

Ak nechcete, aby OOM-Killer vôbec zabil proces, existuje ďalšia možnosť jadra: oom_score_adj. Pridajte veľkú zápornú hodnotu, aby ste znížili šance na dokončenie procesu, ktorý si ceníte.

sudo echo -100 > /proc/3813/oom_score_adj

Ak chcete nastaviť hodnotu oom_score_adj, nastavte OOMScoreAdjust v bloku služieb:

[Service]
OOMScoreAdjust=-1000

Alebo použite oomprotect v tíme rcctl.

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

Vynútiť ukončenie procesu

Keď je už vybratý jeden alebo viac procesov, OOM-Killer zavolá funkciu oom_kill_task(). Táto funkcia vyšle do procesu signál ukončenia. V prípade nedostatku pamäte oom_kill() Volá túto funkciu na odoslanie signálu SIGKILL do procesu. Do protokolu jadra sa zapíše správa.

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

Ako ovládať OOM-Killer

В Linux Funkciu OOM-Killer môžete povoliť alebo zakázať (hoci druhá možnosť sa neodporúča). Na jej povolenie alebo zakázanie použite parameter vm.oom-kill. Ak chcete povoliť OOM-Killer za behu, spustite príkaz sysctl.

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

Ak chcete vypnúť OOM-Killer, zadajte hodnotu 0 v rovnakom príkaze:

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

Výsledok tohto príkazu sa neuloží navždy, ale iba do prvého reštartu. Ak potrebujete väčšiu vytrvalosť, pridajte tento riadok do súboru /etc/sysctl.conf:

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

Ďalším spôsobom aktivácie a deaktivácie je napísanie premennej panic_on_oom. Hodnotu je možné vždy skontrolovať /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Ak nastavíte hodnotu na 0, potom keď sa minie pamäť, nedôjde k panike jadra.

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

Ak nastavíte hodnotu na 1, potom keď sa minie pamäť, dôjde k panike jadra.

echo 1 > /proc/sys/vm/panic_on_oom

OOM-Killer sa dá zapnúť a vypnúť, ako sme už spomenuli. Linux môže rezervovať viac pamäte pre procesy, ako je k dispozícii, ale v skutočnosti ju neprideliť a toto správanie je riadené parametrom jadra LinuxZa to je zodpovedná premenná. vm.overcommit_memory.

Môžete preň zadať nasledujúce hodnoty:

0: Jadro samo rozhoduje, či rezervovať priveľa pamäte. Toto je predvolená hodnota vo väčšine verzií. Linux.
1: Jadro si vždy vyhradí dodatočnú pamäť. Je to riskantné, pretože sa môže vyčerpať pamäť, pretože s najväčšou pravdepodobnosťou to jedného dňa procesy budú vyžadovať.
2: jadro si nevyhradí viac pamäte, ako je uvedené v parametri overcommit_ratio.

Pomocou tohto parametra zadáte percento pamäte, ktorá môže byť nadmerne rezervovaná. Ak na to nie je miesto, nepridelí sa žiadna pamäť a rezervácia bude zamietnutá. Toto je najbezpečnejšia možnosť odporúčaná pre PostgreSQL. OOM-Killer je ovplyvnený ďalším prvkom - schopnosťou swapovania, ktorá je riadená premennou cat /proc/sys/vm/swappiness. Tieto hodnoty hovoria jadru, ako zaobchádzať so stránkovaním. Čím vyššia je hodnota, tým je menšia pravdepodobnosť, že OOM ukončí proces, ale kvôli I/O operáciám to má negatívny vplyv na databázu. A naopak – čím je hodnota nižšia, tým je vyššia pravdepodobnosť zásahu OOM-Killer, ale vyšší je aj výkon databázy. Predvolená hodnota je 60, ale ak sa celá databáza zmestí do pamäte, je lepšie nastaviť hodnotu na 1.

Výsledky

Nenechajte sa vystrašiť „zabijakom“ v OOM-Killer. V tomto prípade bude vrahom záchranca vášho systému. „Zabije“ najhoršie procesy a ochráni systém pred pádom. Aby ste nemuseli používať OOM-Killer na ukončenie PostgreSQL, nastavte na vm.overcommit_memory hodnota 2. To nezaručuje, že OOM-Killer nebude musieť zasiahnuť, ale zníži sa tým pravdepodobnosť vynútenia ukončenia procesu PostgreSQL.

Zdroj: hab.com

Kúpte si spoľahlivý hosting pre stránky s DDoS ochranou, VPS VDS servery 🔥 Kúpte si spoľahlivý webhosting s ochranou DDoS, VPS VDS servery | ProHoster