Highlighter

среда, 4 апреля 2012 г.

Как работает OOM Killer

Когда приложение пытается сделать memory allocation, а доступная память закончилась, в linux запускается процесс OOM Killer. Как можно понять из названия, он создан для того, чтобы УБИВАТЬ!11.

Но, естественно, убивает он не всё подряд, а подчиняясь определённым правилам:
  • Мы должны потерять минимум работы
  • Мы должны освободить много памяти
  • Мы не должны убивать невиновных в пожирании большого количества памяти
  • Мы хотим убить как можно меньше процессов (в идеале - один)
  • Результат работы должен быть предсказуемым
Далее идёт подсчёт очков виновности процессов и процессы (или потоки), набравшие больше всего баллов, жестоко убиваются.

Вот так идёт подсчёт очков:
  1. Считаем RSS процесса
  2. Добавляем RSS всех дочерних процессов
  3. Если процесс долго живёт, то значение уменьшается
  4. Если у процесса niceness больше 0, то значение увеличивается.
  5. Если есть флаги CAP_SYS_ADMIN или CAP_SYS_RAWIO, результат уменьшается
  6. Смотрится знаечение /proc/<pid>/oom_adj, которое может задавать пользователь, чтобы повышаться сопротивляемость OOM Killer'у. Вроде как это уже deprecated и нужно использовать oomscore_adj.
Естественно, это не точный алгоритм, цель написанного - дать представление, от чего зависит выбор кандидата на убийство

2 комментария:

  1. Вопрос сразу возник (никогда раньше не задумывался)
    Прилага пытается сделать malloc, когда память кончилась.
    По идее должен быть null/0/exception и т.п.
    Вот когда мы получим cannot allocate memory, а когда разгневанный oom killer?

    ОтветитьУдалить
    Ответы
    1. Вот тут расписано с примерами кода.
      http://linuxdevcenter.com/pub/a/linux/2006/11/30/linux-out-of-memory.html

      Удалить