Есть ли способ настроить убийцу OOM Linux для уничтожения родительского, а не дочернего процесса?

мне помогло:

git clone git://gcc.gnu.org/git/gcc.git gcc
cd gcc/gcc
./configure
make gcc-vers.texi
mkdir HTML
makeinfo --html --no-split -Idoc -Idoc/include -o HTML doc/gcc.texi

То же самое для gccint.html, cpp.htmlи т. д. Makefile gccигнорируют переменную MAKEINFOFLAGS.

0
28.01.2021, 23:49
1 ответ

Вы можете настроить вероятность того, что любой данный процесс будет выбран жертвой OOM killer, изменив значение в виртуальном файле /proc/<pid>/oom_score_adj. Чем ближе значение к 1000, тем больше вероятность того, что процесс будет выбран OOM killer.

Логика, которую OOM killer использует для выбора жертвы, была изменена во многих различных версиях ядра. Современные версии ядра предпочитают убивать дочерний элемент по умолчанию, потому что обычный случай ошибки, например. веб-сервер запускает рабочие процессы, и в случае ошибки один рабочий процесс выходит из-под контроля и начинает потреблять память, лучшее корректирующее действие - убить дочерний процесс и предположить, что родительский процесс может справиться с ситуацией, когда он замечает, что дочерний процесс был убит. В случае с Apache он просто регистрирует отказ данного дочернего элемента и продолжает работать. С другой стороны, PostgreSQL (очень похож на ядро! )заметит, что дочерний процесс был убит, и автоматически уничтожит всех других дочерних процессов, а также перезапустит родительский процесс, чтобы убедиться, что полное состояние системы полностью известно. Ни в том, ни в другом случае уничтожение родительского процесса не привело бы к лучшему результату. Google Chrome с несколькими вкладками (, каждая вкладка работает как отдельный дочерний процесс ), работает аналогично, и одна вкладка, на которой не хватает ОЗУ, не должна останавливать весь браузер.

Проблема с oom_score_adjзаключается в том, что это НЕ множитель для логики выбора OOM killer, а дополнительная промилле общей системной оперативной памяти, учитываемая в отношении процесса. Например, если у вас 32 ГБ ОЗУ, а вкладка Chrome имеет oom_score_adjзначение 300 (, которое автоматически устанавливается хост-процессом Google Chrome ), а вкладка фактически потребляет 105 МБ ОЗУ, она будет довольно точно выбрана как Жертва OOM, потому что, когда убийца OOM выбирает жертву, реализация убийцы OOM ядра в настоящее время вычисляет «логическое использование памяти» этого дочернего элемента Chrome как 105 МБ + 300/1000 *32 ГБ = 9705 МБ.Очевидно, что система не освободит 9,7 ГБ ОЗУ, убив этот процесс, но если у вас нет еще большего процесса, он все равно будет выбран.

3
24.08.2021, 14:21

Теги

Похожие вопросы