2015-05-03 4 views
4

Предположим, я отключил все связанные с oom функции (без убийцы OOM). Процесс занял всю доступную память, и он все еще пытается прочитать несколько байтов из файла mmapped disk, который не находится в кэшах страниц. Будет ли этот процесс получать сигнал OOM, чтобы он мог оперативно освободить память и повторить попытку позже?Возможно ли, что процесс userland обрабатывает ошибку OOM в Linux?

ответ

0

Это зависит от многих условий.

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.

Для регистрации уведомляющего устройства приложение должно:

+0

Спасибо за это длинное объяснение if-else. BTW. В режиме 2 флаг MAP_NORESERVE игнорируется. И «мы просто ложимся спать», вы имеете в виду системную паузу? – Amos

+0

Возможно ли, что процесс userland обрабатывает эту страницу? – Amos

+0

> В режиме 2 флаг MAP_NORESERVE игнорируется. В описании «man 5 proc» описано, как обрабатывается MAP_NORESERVE, а MAP_NORESERVE игнорируется в режиме 0, но не в режиме 2. – fghj

0

Если вы отключили oom-killer, тогда процесс не получит сигнал, но вызовы malloc() потерпят неудачу после исчерпания памяти.

+0

Thanks. В основном мне любопытно, что произойдет, если вы читаете страницу из нераскрытого файлового диска mmapped? – Amos

+0

Интересный вопрос, я признаю, что не знаю ответа. Глупый вопрос: Вы пробовали? – hek2mgl

 Смежные вопросы

  • Нет связанных вопросов^_^