
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.
- Jadro potrebuje pre seba určitú minimálnu pamäť.
- Potrebujete uvoľniť veľa pamäte.
- Nie je potrebné ukončiť procesy, ktoré využívajú málo pamäte.
- Je potrebné dokončiť minimálne procesy.
- 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
2Ak 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_adjAk chcete nastaviť hodnotu oom_score_adj, nastavte OOMScoreAdjust v bloku služieb:
[Service]
OOMScoreAdjust=-1000Alebo použite oomprotect v tíme rcctl.
rcctl set <i>servicename</i> oomprotect -1000Vynú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 = 1Ak chcete vypnúť OOM-Killer, zadajte hodnotu 0 v rovnakom príkaze:
sudo -s sysctl -w vm.oom-kill = 0Vý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
0Ak nastavíte hodnotu na 0, potom keď sa minie pamäť, nedôjde k panike jadra.
$ echo 0 > /proc/sys/vm/panic_on_oomAk nastavíte hodnotu na 1, potom keď sa minie pamäť, dôjde k panike jadra.
echo 1 > /proc/sys/vm/panic_on_oomOOM-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
