Якщо пам'ять вичерпно використовується процесами, в тій мірі, в якій це може загрожувати стабільності системи, тоді вбивця OOM виходить на світ.
ПРИМІТКА. Завдання Вбивці OOM - це продовження процесів вбивства, поки не буде звільнено достатньо пам'яті для безперебійного функціонування решти процесу, яку намагається запустити Ядро.
Убивця OOM повинен вибрати найкращі процеси для вбивства. Найкраще тут стосується того процесу, який звільнить максимум пам'яті після вбивства, а також є найменш важливим для системи.
Основна мета - знищити найменшу кількість процесів, що мінімізує завданий збиток і одночасно максимізує кількість звільненої пам'яті.
Щоб полегшити це, ядро підтримує значення oom_score
для кожного з процесів. Ви можете побачити oom_score
кожен із процесів у /proc
файловій системі під pid
каталогом.
$ cat /proc/10292/oom_score
Чим вища цінність oom_score
будь-якого процесу, тим вища ймовірність того, що вбивця ООМ буде вбита в ситуації поза пам'яттю.
Як OOM_Score
розраховується?
У наборі патчів Девіда стара евристика badness () майже повністю зникла. Натомість обчислення перетворюється на просте запитання, який відсоток наявної пам'яті використовується процесом. Якщо системі в цілому не вистачає пам’яті, то «наявна пам’ять» - це сума всієї оперативної пам’яті та місця обміну, доступного для системи.
Якщо замість цього, ситуація з OOM викликається вичерпанням пам'яті, дозволеної даній групі cpuset / control, то "наявна пам'ять" - це загальна кількість, виділена цій контрольній групі. Аналогічний розрахунок проводиться, якщо перевищені межі, накладені політикою пам'яті. У кожному випадку використання пам'яті процесу вважається сумою його резидентного набору (кількість сторінок ОЗУ, яку він використовує) та його використання.
Цей підрахунок отримує в результаті число відсотків у десять разів; процес, який використовує кожен доступний йому байт пам'яті, матиме оцінку 1000, тоді як процес, що не використовує пам'яті взагалі, отримає нульовий бал. Євристичних перетворень до цього показника дуже мало, але код все ж віднімає невелику кількість (30) від кількості кореневих процесів, враховуючи, що вони дещо цінніші, ніж процеси, що належать користувачеві.
Ще одне налаштування, яке застосовується, полягає в тому, щоб додати значення, збережене в змінній oom_score_adj кожного процесу, яке можна регулювати через / proc. Цей регулятор дозволяє регулювати привабливість кожного процесу для вбивці OOM у користувальницькому просторі; встановлення його до -1000 призведе до відключення вбивств OOM повністю, тоді як встановлення значення +1000 є еквівалентом малювання великої цілі в пов'язаному процесі.
Список літератури
http://www.queryhome.com/15491/whats-happening-kernel-starting-killer-choose-which-process
https://serverfault.com/a/571326