Предположим, я отключил все связанные с oom функции (без убийцы OOM). Процесс занял всю доступную память, и он все еще пытается прочитать несколько байтов из файла mmapped disk, который не находится в кэшах страниц. Будет ли этот процесс получать сигнал OOM, чтобы он мог оперативно освободить память и повторить попытку позже?Возможно ли, что процесс userland обрабатывает ошибку OOM в Linux?
ответ
Это зависит от многих условий.
1) как вы отключите oom-killer?
Давайте предположим, что вы пишете 2 в/Proc/системы/VM/overcommit_memory, которые означают:
2: всегда проверять, никогда overcommit (см человека 5 процедурный)
После этого называется ттар.
2) Какие флаги вы используете в "mmap"?
Давайте предположим, что вы используете MAP_NORESERVE, в другом случае (без MAP_NORESERVE) ттар просто возвращает ошибку, если не хватает физической памяти.
3) Какое у вас значение overcommit_ratio? Предположим, что это не ноль, если он равен нулю, а mmap возвращает ошибку, , и мы не можем быть в ситуации, когда «нет страниц для файла».
Если все эти предположения верны, то вы пришли: мм/oom_kill.c :: pagefault_out_of_memory,
и снова новое условие:
4) Может быть, мы в контрольной группе с ОЫМ Disable?
Если да, то мы просто ложимся спать.
И наконец ООМ-убийца называется
О отключить ООМ
И по «мы просто пойти спать», вы имеете в виду паузу системы?
См линукс-источник/Документация/контрольные группы/memory.txt:
Если ООМ-убийца инвалидов, задачи по контрольной группе будет висеть/сна в OOM-waitqueue ПАМЯТЬ контрольной группы, когда они обращаются с просьбой к ответственности памяти.
Таким образом, процесс, в котором часть сгруппирована с отключенным oom-killer, ложится спать, не вся система.
Возможно ли, что процесс userland обрабатывает эту страницу?
1) Можно сделать это: https://lwn.net/Articles/550555/
2) Или вы можете просто смотреть ОЫЕ-киллер событие.
Смотрите снова линукс-источник/Documentation// memory.txt контрольные группы:
memory.oom_control файл предназначен для уведомления OOM и других элементов управления.
Группа памяти реализует оповещение OOM с использованием уведомления группы API (см. Cgroups.txt). Он позволяет регистрировать несколько уведомлений OOM и получать уведомления, когда происходит OOM.
Для регистрации уведомляющего устройства приложение должно:
Если вы отключили oom-killer
, тогда процесс не получит сигнал, но вызовы malloc()
потерпят неудачу после исчерпания памяти.
Спасибо за это длинное объяснение if-else. BTW. В режиме 2 флаг MAP_NORESERVE игнорируется. И «мы просто ложимся спать», вы имеете в виду системную паузу? – Amos
Возможно ли, что процесс userland обрабатывает эту страницу? – Amos
> В режиме 2 флаг MAP_NORESERVE игнорируется. В описании «man 5 proc» описано, как обрабатывается MAP_NORESERVE, а MAP_NORESERVE игнорируется в режиме 0, но не в режиме 2. – fghj