Когда приложение пытается сделать memory allocation, а доступная память закончилась, в linux запускается процесс OOM Killer. Как можно понять из названия, он создан для того, чтобы УБИВАТЬ!11.
Но, естественно, убивает он не всё подряд, а подчиняясь определённым правилам:
Вот так идёт подсчёт очков:
Но, естественно, убивает он не всё подряд, а подчиняясь определённым правилам:
- Мы должны потерять минимум работы
- Мы должны освободить много памяти
- Мы не должны убивать невиновных в пожирании большого количества памяти
- Мы хотим убить как можно меньше процессов (в идеале - один)
- Результат работы должен быть предсказуемым
Вот так идёт подсчёт очков:
- Считаем RSS процесса
- Добавляем RSS всех дочерних процессов
- Если процесс долго живёт, то значение уменьшается
- Если у процесса niceness больше 0, то значение увеличивается.
- Если есть флаги CAP_SYS_ADMIN или CAP_SYS_RAWIO, результат уменьшается
- Смотрится знаечение /proc/<pid>/oom_adj, которое может задавать пользователь, чтобы повышаться сопротивляемость OOM Killer'у. Вроде как это уже deprecated и нужно использовать oomscore_adj.
Вопрос сразу возник (никогда раньше не задумывался)
ОтветитьУдалитьПрилага пытается сделать malloc, когда память кончилась.
По идее должен быть null/0/exception и т.п.
Вот когда мы получим cannot allocate memory, а когда разгневанный oom killer?
Вот тут расписано с примерами кода.
Удалитьhttp://linuxdevcenter.com/pub/a/linux/2006/11/30/linux-out-of-memory.html