Як вбивця ООМ вирішує, який процес вбити першим?


92

Ця відповідь пояснює дії, зроблені ядром, коли виникає ситуація OOM на основі значення sysctl vm.overcommit_memory.

Якщо overcommit_memoryвстановлено значення 0 або 1, overcommitувімкнено, а програмам дозволяється виділяти більше пам’яті, ніж реально доступно.

Тепер, що відбувається, коли у нас у цій ситуації не вистачає пам’яті? Як вбивця ООМ вирішує, який процес вбити першим?


1
Я вважаю, що значення 1 an 2 - не 0 і 1.
fpmurphy

Звідси serverfault.com/questions/606185/… , 0 і 1 - це правильні значення.
Rui F Ribeiro

1
Є прекрасний опис, доступний на linux-mm.org/OOM_Killer
Jarek Przygódzki

Відповідно до kernel.org/doc/Documentation/vm/overcommit-accounting 0, 1 і 2 - всі дійсні значення.
Дерек Льюїс

Відповіді:


109

Якщо пам'ять вичерпно використовується процесами, в тій мірі, в якій це може загрожувати стабільності системи, тоді вбивця 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


3
Чи не грає також приємність?
neverMind9
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.