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:
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.
-------- 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.