Jak opavit chybu OOM killer crash v Linuxu?

Následující problém jsem měl na VPS u Wedosu.

Symptomy

Neustále se čas od času restartovala služba HTTP, nebo MySQL. A čas od času server zcela zamrzl. Ze začátku tyto chyby byly jednou za čas, takže jsem jim nevěnoval pozornost. Nicméně když už došlo k tomu, že tyto se chyby objevovaly pravidelně, došla mi trpělivost a začal jsem studovat logy. Po nějaké době jsem narazil na následující chybu:

Feb 27 00:08:11 m6099 kernel: php-cgi invoked oom-killer: gfp_mask=0x280da, order=0, oom_adj=0, oom_score_adj=0
…spousta dalších řádků s výpisem běžících služeb ….
Feb 27 00:08:11 m6099 kernel: Out of memory: Kill process 12362 (mysqld) score 293 or sacrifice child

Tuto chybu vytvoří zpravidla nějaká aplikace, kterou vývojář pořádně neošetřil a tak konzumuje paměť tak dlouho, dokud fyzicky nedojde. Tím dojde k vyvolání uvedené chyby, která vyústí v to, že systém sestřelí náhodnou službu. V mém případě to bylo buď MySQL nebo Apache. Za normálních okolností to nevadí, ale u webového serveru je to dost problém.

Řešení

První nejlepší řešení spočívá v tom, že zjistíte jaká aplikace chybu vyvolala. Pokud provozujete WordPress na serveru, pak chybu hledejte v něm, respektive v nějakém z jeho pluginů, který napsal nějaký programátor amatér.

Druhé, ne již tak košer, řešení spočívá v jednoduché úpravě souboru /etc/sysctl.conf. Zde je potřeba nastavit dva parametry.

vm.overcommit_memory = 2
vm.overcommit_ratio = 80

První parametr říká – never commit a virtual address space larger than swap space plus a fraction overcommit_ratio of the physical memory

Česky to znamená, že nikdy systém nesmí povolit adresaci přesahující swapovací soubor a fyzickou paměť. Druhý parametr udává poměr využití fyzické paměti RAM. Defaultně je to 50%, lepší je však nastavit 80%.

Tímto nastavením dojde k tomu, že nedojde ke spuštění aplikace, která by vyvolala popisovanou chybu. Na druhou stranu, všechny důležité aktuálně spuštěné služby zůstanou běžet a to je to důležité.

Pokud ovládáte angličtinu, doporučuji si přečíst tento článek http://www.etalabs.net/overcommit.html

——————

Dodate: overcommit na mém serveru způsobil to, že sice nespadly žádné aplikace, ale na druhou stranu se mi nějaké aplikace nechtěly spouštět. Overcommint tedy nebylo řešením. Zatím to vypadá, že je problém ve Fast-CGI, které obsahuje nějakou chybu.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Tato stránka používá Akismet k omezení spamu. Podívejte se, jak vaše data z komentářů zpracováváme..