Может ли кто-нибудь объяснить, что такое oom_badness () в OOM killer? - PullRequest
0 голосов
/ 31 марта 2020
/*
 * If any of p's children has a different mm and is eligible for kill,
 * the one with the highest oom_badness() score is sacrificed for its
 * parent.  This attempts to lose the minimal amount of work done while
 * still freeing memory.
 */

1 Ответ

1 голос
/ 31 марта 2020

Я думаю, что комментарии в исходном коде уже хорошо объясняют это:

/**
 * oom_badness - heuristic function to determine which candidate task to kill
 * @p: task struct of which task we should calculate
 * @totalpages: total present RAM allowed for page allocation
 *
 * The heuristic for determining which task to kill is made to be as simple and
 * predictable as possible.  The goal is to return the highest value for the
 * task consuming the most memory to avoid subsequent oom failures.
 */

Функция oom_badness() косвенно вызывается out_of_memory() , которая является функцией, ответственной за обработку критического состояния нехватки памяти. Когда out_of_memory() вызывается (например, распределителем страниц или обработчиком ошибок страницы ), он перебирает все задачи, чтобы определить их "плохость", и задачу с наибольшее значение принудительно уничтожается (фактическая цепочка вызовов составляет select_bad_process()oom_evaluate_task()oom_badness()).

«Плохость» задачи зависит от нескольких факторов:

  • Сколько страниц находится в его виртуальной памяти.
  • Сколько записей SWAP ему принадлежит.
  • Сколько памяти использует процесс ( общее число байт / размер страницы).
  • Если он был уже помечен для уничтожения , поскольку он отвечает за OOM, он получает максимально возможный балл.
  • Если это Процесс инициализации или поток ядра игнорируется.

В старых версиях ядра функция oom_badness() была более сложной, например, с учетом различных коэффициентов масштабирования и бонусов " «для привилегированных процессов , но оно было обновлено, чтобы сделать его» просто и максимально предсказуемо ".

...