У нас есть веб-сервер debian linux. Он просто запускает apache2. Наш сервер mysql находится на другом хосте. Однако мы иногда запускаем задачи cron на веб-сервере для выполнения обычных задач.
Однако недавно в одной из задач cron возникла ошибка, и она начала пожирать память. Убийца Linux OOM убил apache. Что, конечно же, обрушило наш веб-сайт. Жадный до памяти cron продолжал работать. Однако в этом случае я бы хотел, чтобы убийца OOM убил этот скрипт и не апач.
Есть ли способ настроить ядро так, чтобы я мог сказать не убить процессы, называемые 'apache2' (или, по крайней мере, сделать apache2 последний вещь убивает)? И apache, и обычные crons запускаются от имени одного и того же пользователя (www-user).
OOMKiller является настраиваемый до степени. После запуска процесса вы можете установить значение /proc/<pid>/oom_adj
до отрицательного целого числа. Это повлияет на привязанность OOMKiller к процессу и его потомкам. Когда ваша система достигает состояния нехватки памяти, другие процессы будут остановлены.
Не похоже, что вы устраняете основную причину проблемы, фактически отлаживая, почему это задание cron использует так много памяти.
Вы можете попробовать установить эту опцию
эхо 1> / proc / sys / vm / oom_kill_allocating_task
который скажет убийце OOM убить процесс, вызвавший условие OOM, но это не обязательно будет вашей работой cron. Вы также можете использовать "ulimit -m" в своем скрипте, чтобы установить максимальный объем используемой резидентной памяти. Я думаю, вам лучше всего было бы оценить, почему задание cron использует так много памяти и, возможно, лучше всего подходит для другого хоста или его нужно переписать, чтобы потреблять меньше памяти.
Вы также можете изменить поведение виртуальной памяти при фиксации. Например, вы можете изменить значение / proc / sys / vm / overcommit_memory на «2», что означает НЕ перегружать память. (Не изменяйте это значение просто так, не понимая, что оно делает.)
В режиме «без чрезмерной фиксации» любой новый процесс, запрашивающий дополнительную память, получит сообщение об ошибке при попытке выделить. Таким образом, вместо того, чтобы заставить убийцу OOM взломать ваш старый, долго работающий процесс (ы), новому человеку, запрашивающему оперативную память, говорят «нет».
... а затем вам нужно исправить проблему с памятью. Найдите утечку, измените процесс, потребляющий память, добавьте в коробку дополнительную память и т. Д.
Краткий ответ: Нет, OOM-killer не настраивается, и есть / был сопротивление чтобы изменить это.
Всего несколько идей в голове:
Увеличьте пространство подкачки - если скрипты 32-битные, то должно быть легко дать им слишком много места для исчерпания.
Увеличьте физическую память. На 1 довольно много.
Использовать ulimit
чтобы ограничить объем памяти, который скрипт может занять.
Здесь говорится, что вы можете установить «флаг» OOM_DISABLE для процесса: http://linux-mm.org/OOM_Killer