У нас есть веб-сервер 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