Как отключить oom killer в linux?

Мои текущие конфиги:

> cat /proc/sys/vm/panic_on_oom
0
> cat /proc/sys/vm/oom_kill_allocating_task
0
> cat /proc/sys/vm/overcommit_memory
1

но когда я запускаю задачу, она все равно убивается.

> ./test/mem.sh
Killed
> dmesg | tail -2
[24281.788131] Memory cgroup out of memory: Kill process 10565 (bash) score 1001 or sacrifice child
[24281.788133] Killed process 10565 (bash) total-vm:12601088kB, anon-rss:5242544kB, file-rss:64kB

Обновлять

Мои задачи привыкли к научным вычислениям, которые требуют много памяти, кажется, что overcommit_memory=1 может быть лучшим выбором.

Обновление 2

На самом деле, я работаю над проектом анализа данных, который требует памяти больше, чем 16G, но меня попросили ограничить их примерно в 5G. Реализовать это требование путем оптимизации самой программы может быть невозможно, поскольку в проекте используется множество подкоманд, и большинство из них не содержит таких параметров, как Xms или Xmx в Java.

Обновление 3

Мой проект должен быть перегруженной системой. Точно так же, как говорит a3f, кажется, что мои приложения предпочитают аварийно завершать работу на xmalloc при сбое выделения памяти.

> cat /proc/sys/vm/overcommit_memory
2
> ./test/mem.sh
./test/mem.sh: xmalloc: .././subst.c:3542: cannot allocate 1073741825 bytes (4295237632 bytes allocated)

Я не хочу сдаваться, хотя столько страшных испытаний меня утомляют. Так что, пожалуйста, укажи мне путь к свету; )


person Yang    schedule 04.03.2016    source источник


Ответы (2)


Убийца OOM никуда не денется. Если нет памяти, кто-то должен платить. Что вы можете сделать, так это установить предел, после которого выделение памяти не выполняется. Это именно то, что достигается установкой vm.overcommit_memory в 2.

Из документов:

Ядро Linux поддерживает следующие режимы обработки избыточной фиксации.

2 - Не переусердствуйте. Общее выделение адресного пространства для системы не может превышать объем подкачки + настраиваемый объем (по умолчанию 50%) физического ОЗУ. В зависимости от объема, который вы используете, в большинстве ситуаций это означает, что процесс не будет уничтожен при доступе к страницам, но будет получать ошибки при выделении памяти в зависимости от ситуации.

Обычно ядро ​​с радостью раздает виртуальную память (overcommit). Только когда вы ссылаетесь на страницу, ядро ​​должно сопоставить страницу с реальным физическим фреймом. Если он не может обслужить этот запрос, процесс должен быть остановлен убийцей OOM, чтобы освободить место.

Отключение overcommit означает, что, например. malloc(3) вернет NULL, если ядро ​​не сможет зафиксировать запрошенный объем памяти. Это делает вещи немного более предсказуемыми, хотя и ограниченными (многие приложения выделяют больше, чем им когда-либо понадобится).

person a3f    schedule 04.03.2016
comment
Спасибо! Мои задачи всегда стоят много воспоминаний. Если установить overcommit_memory=2, задача будет приостановлена? Возможно, это не очень хорошо для задач научных вычислений. - person Yang; 04.03.2016
comment
@ Ян Я обновил ответ. Если вы хотите избежать ситуаций OOM, вам нужно купить больше оперативной памяти (или исправить свою стратегию управления памятью, или продолжать использовать overcommit и надеяться на лучшее). - person a3f; 04.03.2016
comment
Спасибо за такое подробное объяснение о виртуальной машине и странице, я очень ценю это. В Обновлении 2 мне нужен метод, чтобы ограничить использование памяти для процесса и гарантировать, что они работают, а не убиты, т. е. они должны получать NULL при запросе большего количества памяти, но он должен продолжать вычисления , например docker run --oom-kill-disable. Я что-то пропустил, или эта мысль совершенно неверна? - person Yang; 04.03.2016
comment
@Yang Посмотрите ссылку, которую я разместил. Вы можете установить верхний предел, после которого выделение не выполняется. Тогда вашему приложению придется столкнуться с ошибкой выделения памяти. Многие приложения просто аварийно завершают работу (либо неявно, путем разыменования нулевого указателя, либо явно, например, xmalloc). Я не знаю, как ваше приложение справляется с этим. - person a3f; 04.03.2016
comment
В обновлении 3 мои дурацкие приложения вылетели из-за xmalloc, похоже, у них нет никаких планов по устранению сбоя выделения памяти. Поскольку проект с избыточным объемом памяти, Always overcommit может я думаю, будет подходящим режимом обработки чрезмерной фиксации. - person Yang; 04.03.2016
comment
@Yang Либо перепишите приложение, чтобы оно потребляло меньше, либо увеличьте физическую память. Второй вариант наверное дешевле. - person a3f; 04.03.2016
comment
malloc НИКОГДА не возвращает NULL под linux, либо какой-то другой процесс уничтожается, либо сам уничтожается - person workless; 09.05.2016
comment
@workless Это зависит от стратегии чрезмерной фиксации, дополнительную информацию см. в связанном документе. И даже с поведением overcommit по умолчанию malloc(-1) даст вам NULL. - person a3f; 09.05.2016
comment
@a3f спасибо, я не знал об этом, существует так много программ, которые даже не проверяют возвращаемый адрес, давайте постараемся отключить overommit - person workless; 10.05.2016

Возможные значения oom_adj находятся в диапазоне от -17 до +15. Чем выше оценка, тем больше вероятность того, что связанный процесс будет уничтожен OOM-killer. Если для oom_adj задано значение -17, процесс не рассматривается для уничтожения OOM.

Но лучше увеличить оперативную память, если увеличение оперативной памяти невозможно, добавьте память подкачки.

Чтобы увеличить объем памяти подкачки, попробуйте эту ссылку,

person Ravipati Praveen    schedule 25.09.2017
comment
Пожалуйста, не публикуйте ответ, состоящий по существу из ссылки. Включите важные моменты в свой ответ; оставьте ссылку для получения дополнительной информации или в качестве справки. - person glennsl; 25.09.2017
comment
@glennsl Спасибо. - person Ravipati Praveen; 25.09.2017
comment
@glennsl, спасибо за предоставленную информацию и ссылку. Я обновил свой пост. - person Ravipati Praveen; 25.09.2017
comment
@RavipatiPraveen, Спасибо! Отключение OOM-killing — это действительно то, что я хочу, установив oom_adj на -17 для задачи. Увеличение подкачки звучит очень круто, и это может решить проблемы. Позже попробую, спасибо! - person Yang; 26.09.2017