![Не позволяйте OOM Linux убивать Apache на нашем веб-сервере](https://rvso.com/image/503707/%D0%9D%D0%B5%20%D0%BF%D0%BE%D0%B7%D0%B2%D0%BE%D0%BB%D1%8F%D0%B9%D1%82%D0%B5%20OOM%20Linux%20%D1%83%D0%B1%D0%B8%D0%B2%D0%B0%D1%82%D1%8C%20Apache%20%D0%BD%D0%B0%20%D0%BD%D0%B0%D1%88%D0%B5%D0%BC%20%D0%B2%D0%B5%D0%B1-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B5.png)
У нас есть веб-сервер Debian Linux. Он просто запускает apache2. Наш сервер MySQL находится на другом хосте. Однако мы иногда запускаем задачи cron на веб-сервере для выполнения обычных задач.
Однако недавно одна из задач cron имела ошибку и начала поглощать память. Linux OOM killer убил apache. Что, конечно, привело к падению нашего веб-сайта. Жадный до памяти cron продолжал работать. Однако в этом случае я хотел бы, чтобы OOM killer убил этот скрипт, инетапач.
Есть ли способ настроить ядро так, чтобы я мог сказатьнезавершить процессы, называемые «apache2» (или, по крайней мере, сделать apache2последнийвещь, которую он убивает)? И apache, и обычные cron запускаются от имени одного и того же пользователя (www-user).
решение1
Не похоже, что вы устраняете основную причину проблемы, фактически выясняя, почему это задание cron использует так много памяти.
Вы можете попробовать установить эту опцию
echo 1 > /proc/sys/vm/oom_kill_allocating_task
что сообщит OOM killer о необходимости завершить процесс, вызвавший состояние OOM, но это не гарантирует, что это будет ваша cron job. Вы также можете использовать "ulimit -m" в своем скрипте, чтобы задать максимальный объем резидентной памяти для использования. Я думаю, что лучшим вариантом будет оценить, почему cronjob использует так много памяти, и, возможно, лучше всего подойдет для другого хоста или его следует переписать, чтобы он потреблял меньше памяти.
решение2
OOMKillerявляетсянастраивается в определенной степени. После запуска процесса вы можете установить значение /proc/<pid>/oom_adj
в отрицательное целое число. Это повлияет на сродство OOMKiller к процессу и его потомкам. Когда ваша система попадает в состояние нехватки памяти, другие процессы будут завершены.
решение3
Вы также можете изменить поведение Virtual Memory over commit. Например, вы можете изменить значение /proc/sys/vm/overcommit_memory на '2' — что означает НЕ перерасходовать память. (Не меняйте это значение, не понимая, что оно делает.)
В режиме «no overcommit» любой новый процесс, запрашивающий больше оперативной памяти, получит ошибку при попытке ее выделения. Поэтому вместо того, чтобы позволить OOM killer пойти и уничтожить ваш старый, долго работающий процесс(ы), новому парню, запрашивающему оперативную память, говорят «нет».
...и тогда вам нужно исправить проблему с памятью. Найдите утечку, перепроектируйте процесс, потребляющий память, добавьте больше оперативной памяти в коробку и т. д.
решение4
Здесь говорится, что вы можете установить «флаг» OOM_DISABLE для процесса: http://linux-mm.org/OOM_Killer