OOM-Killer zabíjí MariaDB

OOM-Killer zabíjí MariaDB
« kdy: 09. 12. 2022, 22:00:51 »
dobrý den, všem,

  snažím se pochopit, kde na serveru mám problém a potřeboval bych trošku popostrčit v porozumění. Situace - server s 3,6 GB RAM - vypnuté swapování. Problém: minimálně jednou týdně mi oom-killer sestřelí mariadb. Vypadá to, že mám málo RAM paměti, nicméně nerozumím tomu, proč.

  Když vyjedu výpis paměti, tak to vypadá průměrně takto:

Kód: [Vybrat]
root@bender:/var/lib# free -h
               total        used        free      shared  buff/cache   available
Mem:           3,7Gi       1,9Gi       316Mi       260Mi       1,4Gi       1,2Gi
Swap:             0B          0B          0B


Chápu, že si databáze mariadb nebo jakákoli aplikace může ukousnout v době problému více RAM. Říkal jsem si, že je tam dostatečná rezerva.

Podezíral jsem mariadb, že si vezme více paměti a proto padne. Proto jsem se jal konfigurovat její nastavení. Do přílohy dávám soubor mysqltunner.log.

V rámci toho řádku bych chápal, že si MySQL (mariadb) nemůže vzít víc, jak 580M.

Kód: [Vybrat]
-------- Performance Metrics ------------------------------
[--] Up for: 13h 26m 35s (1M q [40.268 qps], 19K conn, TX: 9G, RX: 399M)
[--] Reads / Writes: 86% / 14%
[--] Binary logging is disabled
[--] Physical Memory     : 3.7G
[--] Max MySQL memory    : 580.9M
[--] Other process memory: 0B
[--] Total buffers: 297.0M global + 17.7M per thread (16 max threads)
[--] P_S Max memory usage: 72B
[--] Galera GCache Max memory usage: 0B
[OK] Maximum reached memory usage: 527.7M (14.10% of installed RAM)
[OK] Maximum possible memory usage: 580.9M (15.52% of installed RAM)

Přesto omezení nepomohla a pády databáze kvůli nedostatku paměti přetrvávají. Jedině, že bych špatně chápal výpis a je to maximum paměti 580MB + 297MB buffer. Ale i tak, mám databázi spuštěnou a htop říká že mariadb využívá 21% paměti a systém včetně tohoto teď využívá 2 GB RAM ze 3,6GB. Takže mám pořád 1,6GB teoreticky volných.


Dále přikládám výpis ze syslogu, kde došlo 9/12 v 3:45 k sestřelení databáze. Zatím netuším, jak si to interpretovat - kolik paměti v tu chvíli Mariadb čerpala, když byla ukončena.

Ono totiž teoreticky paměť nemusí vyčerpat mariadb, ale může být jenom obětí jiných procesů, které paměť vyžerou. Co a jak byste monitorovali, aby bylo možné zjistit, který proces se tak rozežere?

Ještě přikládám graf využití paměti z Muninu. Z grafu je vidět, že 3:45 došlo k uvolnění paměti, protože spadla databáze. Někdy před osmou jsem ji znovu nastartoval. Graf před pádem ovšem podle mě nijak nevybočuje z grafů po osmé hodině - kromě tedy křivky commited, ale to už jsem nedostudoval, co je s ní myšleno.

Ještě mě napadlo, že tu může být i částečné zkreslení grafu Muninu. Protože když dojde k zaplnění RAM, tak nemusí systém reagovat. Munin node se spouští každých pět minut, aby posbíral čísla a vytvoří graf. Pokud byl systém zamrzlý a rozhodoval, který proces ukončí, nemusel Munin nasbírat data a tak mohl další zběr vycházet z předchozí stavu před vyčerpáním paměti RAM.

Ještě přikládám graf z monitoringu Cacti. Protože Cacti zapisuje data do mariadb, tak je přesně vidět, od kdy do kdy došlo k výpadku. A ani tam těsně před událostí nevidím žádný extrém, že by docházelo k vyčerpání RAM.

Už si s tím přestávám vědět rady. Budu rád za tipy a podnětnou diskusi.

« Poslední změna: 09. 12. 2022, 22:14:36 od Petr Krčmář »


Re:OOM-Killer zabíjí MariaDB
« Odpověď #1 kdy: 10. 12. 2022, 05:13:14 »
Nejsem expert na MariaDB, a vlastně ani na OOM killer. Nicméně obecná rada pro Postgres je mít vždy aktivovaný swap a hlídat si, že se nepoužívá. Bez swapu je limit pro OOM killer poměrně nízko, a dost paměti nebude využitá. Databáze na trochu větších datech používají hodně paměti - cache, sort, hash tables, a je to to co chcete.

Vilith

  • *****
  • 662
    • Zobrazit profil
Re:OOM-Killer zabíjí MariaDB
« Odpověď #2 kdy: 10. 12. 2022, 06:00:07 »
Asi bych použil novější verzi - http://mysqltuner.pl/ (třeba nyní už je 2.0.9)

Zaráží mne, že když hlásí "Max MySQL memory    : 580.9M", tak v syslogu je OOM na 2G

Jinak je na serveru více podivností, z mého rychlého pohledu.
  • sendmail, dnes?
  • PassengerAgent? je potřeba
  • množství Apache procesů
  • munin a nagios?
  • snmp?
  • 5x bash v době OOM?

A k tomu swapu - tak si udělej virtuální, např. pomocí https://manpages.debian.org/jessie/dphys-swapfile/dphys-swapfile.8.en.html
« Poslední změna: 10. 12. 2022, 06:06:44 od Vilith »

Re:OOM-Killer zabíjí MariaDB
« Odpověď #3 kdy: 10. 12. 2022, 08:41:49 »
Jak zde již zaznělo, zapnul bych swap. Ještě jednodušší než ten automatický dphys-swap je ručně nastavený swap do souboru.

Pak se dá nastavit OOM killer, aby vybranou aplikaci nezabíjel tak často nebo vůbec. Otázka je, co se stane, když je to právě ta aplikace, co vyčerpá všechnu paměť. To vy teď ale přesně ještě nevíte. Nastavuje se oom_score_adj od -1000 (nezabíjet) do 1000 (zabít první) , nebo oom_adj od -16 do 15. Nejlépe pomocí choom. Viz man choom.

Re:OOM-Killer zabíjí MariaDB
« Odpověď #4 kdy: 10. 12. 2022, 09:02:07 »
Mám špatnou zkušenost s absencí swapu. Kdysi mi podobným způsobem padal správce oken nebo X11. A při vm.swappiness=0 v podobných situacích nastávají záseky.

On totiž pojem „volná RAM“ je trochu problematický. Když spustíme aplikaci, kód té binárky (včetně všech knihoven) je memory-mapped. Nemusí být fyzicky v RAM – možná bude v cache, možná se načte až v případě potřeby. To ale znamená, že pokud nemáte v cache téměř vůbec nic, systém sice nemusí nutně swapovat, ale bude celkem nepoužitelný, protože systém bude dost intenzivně číst z disku/SSD/whatever.

Na druhou stranu, pokud si nějaký proces naalokuje dost paměti pomocí malloc, a pak ji uvolní pomocí free, nejspíš ta paměť zůstane tomu procesu. IIRC běžně proces má kontinuální blok paměti a malloc s kernelem se nedomluví, že ta část uprostřed lze uvolnit. Swap je pak sice nehezké řešení, ale holt funguje…

Jsem si jist, že jsem nepopsal všechna zákoutí. Třeba zmíněné committed může být dost zrádné, když se forkuje.


RDa

  • *****
  • 2 567
    • Zobrazit profil
    • E-mail
Re:OOM-Killer zabíjí MariaDB
« Odpověď #5 kdy: 10. 12. 2022, 10:29:46 »
5x bash v době OOM?

Nemas tam nejaky cronjob se skripty pod tim bashem, ktery je pametove narocny?

Nekde jde snad zapnout logovani vsech forku, pokud mas ty pady kvuli oom na dennim poradku - mozna by to za to stalo.