Вбивця OOM не працює?


41

Наскільки я розумію, коли система близько не має вільної пам'яті, ядро ​​повинно починати вбивати процеси, щоб відновити деяку пам'ять. Але в моїй системі цього взагалі не відбувається.

Припустимо простий скрипт, який просто виділяє набагато більше пам’яті, ніж наявний в системі (наприклад, масив з мільйонами рядків). Якщо я запускаю такий сценарій (як звичайний користувач), він просто отримує всю пам'ять, поки система повністю не застигне (працює тільки SISRQ REISUB).

Дивна частина тут полягає в тому, що коли комп'ютер замерзає, світлодіодний накопичувач включається і залишається таким чином, поки комп'ютер не перезавантажиться, чи у мене встановлений розділ підкачки, чи ні!

Тому мої запитання:

  1. Це нормальна поведінка? Як не дивно, що програма, виконана як звичайний користувач, може просто зламати систему таким чином ...
  2. Чи є спосіб, щоб я змусив Ubuntu просто вбити автоматично ті програми, коли вони отримують занадто багато (або найбільше) пам'яті?

Додаткова інформація

  • Ubuntu 12.04.3
  • Ядро 3.5.0-44
  • ОЗУ: ~ 3,7 Гб від 4 ГБ (спільне використання відеокарти). *

    $ tail -n+1 /proc/sys/vm/overcommit_*
    ==> /proc/sys/vm/overcommit_memory <==
    0
    
    ==> /proc/sys/vm/overcommit_ratio <==
    50
    
    $ cat /proc/swaps
    Filename                Type        Size    Used    Priority
    /dev/dm-1                               partition   4194300 344696  -1
    

Я не впевнений, чому це не працює. Спробуйте tail -n+1 /proc/sys/vm/overcommit_*додати результат. Дивіться також тут: Як налаштувати oom-killer
kiri

Отже, що відбувається з вашим простором своп? Чи можете ви розмістити деякий вихід vmstat, наприклад, #vmstat 1 100 чи щось подібне? а також покажіть нам cat / etc / fstab Що має статися при певному обсязі використання пам'яті, вам слід почати писати для заміни. Процеси вбивства не повинні відбуватися до тих пір, поки пам'ять та обмінні місця не будуть "заповнені".
j0h

також спробуйте #swapon -a
j0h

@ j0h З заміною, здається, він працює добре (через деякий час процес вийшов з ладу чимось на кшталт Allocation failed). Але без своп просто заморожує комп'ютер. Це має працювати так (вбивати лише при використанні swap)?
Салем

2
За допомогою SysRq ви також можете
звернутися до

Відповіді:


36

З офіційної /proc/sys/vm/*документації :

oom_kill_allocating_task

Це дозволяє або забороняє вбивати завдання, що спрацьовує OOM, у ситуаціях, що не мають пам'яті.

Якщо для цього встановлено нульове значення, вбивця OOM просканує весь список завдань і вибере завдання на основі евристики для вбивства. Зазвичай це вибирає шахрайське завдання, пов'язане з пам’яттю, яке звільняє велику кількість пам’яті при вбиванні.

Якщо для цього встановлено ненульове значення, вбивця OOM просто вбиває завдання, яке викликало стан поза пам'яті. Це дозволяє уникнути дорогого сканування списку завдань.

Якщо вибрано panic_on_oom, він має перевагу над тим, яке значення використовується в oom_kill_allocating_task.

Значення за замовчуванням - 0.

Щоб підсумувати, під час встановлення oom_kill_allocating_taskна 1, замість сканування вашої системи шукати процеси для вбивства, що є дорогим і повільним завданням, ядро ​​просто знищить процес, через який система вийшла з пам'яті.

З мого власного досвіду, коли спрацьовує OOM, ядро ​​не має більше «сили», щоб зробити таке сканування, що робить систему абсолютно непридатною.

Крім того, було б більш очевидним просто вбити завдання, яке спричинило проблему, тому я не розумію, чому це встановлено 0за замовчуванням.

Для тестування ви можете просто записати у відповідний псевдофайл у /proc/sys/vm/, який буде скасовано при наступному перезавантаженні:

echo 1 | sudo tee /proc/sys/vm/oom_kill_allocating_task

Для постійного виправлення, написати наступне /etc/sysctl.confабо в новий файл під іншим /etc/sysctl.d/, з .confрозширенням ( /etc/sysctl.d/local.confнаприклад):

vm.oom_kill_allocating_task = 1

2
Чи завжди в Ubuntu було встановлено 0? Тому що я пам’ятаю, що він вбивав автоматично, але з кількох версій він перестав це робити.
skerit

1
@skerit Це я насправді не знаю, але він був встановлений на 0 у ядрах, які я використовував ще в 2010 році (Debian, Liquorix та GRML).
Teresa e Junior

"Крім того, було б очевиднішим просто вбити завдання, яке спричинило проблему, тому я не розумію, чому це встановлено 0за замовчуванням." - оскільки процес, який вимагав пам'ять, не обов'язково є тим, що "викликав проблему". Якщо процес A піднімає 99% пам'яті системи, але процес B, який використовує 0,9%, трапляється тим, що викликає вбивцю OOM невдало, B не "спричинив проблему", і це не має сенсу вбити Б. Отримавши це, оскільки політика ризикує повністю непроблематичними процесами з низькою пам’яттю бути вбиті випадково через невикористане використання пам’яті іншого процесу.
Марк Амері

1
@MarkAmery Справжня проблема полягає в тому, що Linux, замість того, щоб просто вбити необхідний процес, починає бити як затримка, навіть якщо vm.admin_reserve_kbytesвона збільшиться, скажімо, до 128 Мб . Налаштування, vm.oom_kill_allocating_task = 1здається, полегшує проблему, насправді не вирішує її (і Ubuntu вже займається вилковими бомбами за замовчуванням).
Teresa e Junior

1
Можливо, більш елегантнийsudo sysctl -w vm.oom_kill_allocating_task=1
Пабло А

9

Оновлення: помилка виправлена.

Відповіді Терези достатньо, щоб вирішити проблему, і це добре.

Крім того, я подав звіт про помилку, оскільки це, безумовно, порушена поведінка.


Я не знаю, чому ви поступили, але це також схоже на помилку ядра. Я сьогодні зламав великий сервер університету і вбив деякі процеси, які тривали тижнями ... Дякую, що подав звіт про помилку!
shapecatcher

7
Можливо, це було зафіксовано у 2014 році, у 2018 році (та 18.04) вбивця ООМ знову нічого не робить.
skerit

0

Ви можете спробувати earlyoom , убивцю OOM, який працює в просторі користувачів і намагається вбити найбільший процес у ситуації OOM.


-1

Перш за все, я рекомендую оновлення до 13.10 (чисте встановлення, збережіть ваші дані).

Якщо ви не хочете оновлювати, змініть vm.swappiness на 10 і якщо у вас виникнуть проблеми з вашим операційним пакетом, встановіть zRAM.


2
Я не був тим, хто прихильнив вас, але, як правило, зниження vm.swappinessшкоди приносить більше шкоди, ніж користі, навіть більше в системах, що страждають від низької кількості пам'яті.
Teresa e Junior

Не коли ви стискаєте оперативної пам’яті спочатку, а потім уникаєте використання диска, який відбувається набагато повільніше і може призвести до замерзання комп'ютера.
Brask

Теоретично, zRAM - це приємна річ, але вона голодна в процесорі і взагалі не варта витрат. Пам'ять, як правило, дешевше електроенергії. А на ноутбуці, де оновлення оперативної пам’яті дорожче, використання процесора переважно небажане.
Teresa e Junior

Що він просить, це мати більш стабільну систему zRAM і зміна простоти змусить його систему використовувати більше ресурсів процесора так, але те, що він обмежений atm і має помилки, - це пам'ять, він хоче виправити проблему, а не теоретичний урок того, що відбувається при встановленні zRAM.
Brask

З його запитання видно, що він може написати неправильний сценарій, який їсть більше, ніж слід (і я це вже робив сам). У такій ситуації ви можете спостерігати за тим, як сценарій захоплює гігабайти оперативної пам’яті за кілька секунд, і zRAM не прийде на допомогу, оскільки сценарій ніколи не буде достатньо задоволений.
Teresa e Junior
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.