Кнопка «Вбий найбільший процес»


14

Цей ноутбук має SSD, і тому я вирішив опустити своп. У більшості випадків це добре працює, але іноді оперативна пам'ять стає трохи короткою, і комп'ютер стає дуже млявим і має тенденцію до замерзання. Чи є спосіб реалізувати кнопку "вбити найбільший процес", яка прямує до ядра, якщо я помічую заморожування досить швидко? Або тому, що це комп’ютер, евристика, коли він починає замерзати і знімати найбільший процес, був би непоганим.


Ви маєте на увазі команду "вбити найбільший процес"?
Рамеш

У Linux це є. Це називається вбивцею ООМ. Але ви повинні мати можливість перезавантажувати пам'ять (і вона увімкнена за замовчуванням у більшості дистрибутивів).
Патрік

@Patrick overcommit_memoryє 0, overcommit_ratioє 50.
Reactormonk

Відповіді:


12

З вашого коментаря, здається, що система просто поміняється.

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

Оскільки ви overcommit_memoryвстановили 0режим (автоматичний режим), ядро ​​виконує перезавантаження пам'яті. Отже, з вашої поясненої поведінки, здається, що система просто сильно змінюється.

Звідси є 2 варіанти.

Зменшити своп

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

Ваша оригінальна ідея, вручну вбийте процес.

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

Ядро має те, що воно називає "магічним SysRq". Це трохи функціональності, яка дозволяє ядру виконувати якусь екстрену операцію. Це можуть бути такі речі, як "перекомпонувати всі томи лише для читання", "синхронізувати всі файлові системи" або "перезавантажити зараз". Один із таких варіантів - також викликати вбивцю OOM.

Якщо у вашому ядрі включена магія SysRq (опція ядра CONFIG_MAGIC_SYSRQ), ви можете це зробити двома способами.

  1. Alt+ SysRq+ f
    Просто натисніть ці 3 клавіші на клавіатурі.
  2. echo f > /proc/sysrq-trigger
    Це виконує точно те саме завдання, що і метод клавіатури, але робить це програмно.

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

Я особисто думаю, що найкращим рішенням є якийсь варіант ядра викликати вбивцю OOM при примусовій заміні. В основному дозволяйте попереджувальному swap працювати, але якщо ядро ​​змушене перенести щось на своп, оскільки ви поза оперативною пам'яттю, тоді попросіть вбивцю OOM.
На жаль, це лише моє особисте бажання. Це не робить.


Я не знав про OOM Killer. Я думав про сценарій, який постійно контролює використання пам'яті за допомогою topабо psкоманди, і якщо вона перевищує певний поріг, вбиваючи цей процес за допомогою killкоманди.
Рамеш

Я не використовую жодного свопу.
Reactormonk

щоб побачити, який процес був убитий grep -E "oom-killer|Killed process" /var/log/syslog /var/log/syslog.1
oom

@Tass О, я повністю засклився на коментарі "Я вирішив опустити своп", вибачте :-(. Хоча інформація про "вбити процес вручну" все ще стоїть. Однак ви не повинні відчувати повільність, коли не вистачає пам'яті. Ви повинні відчути, що ядро ​​просто вбиває речі.
Патрік

@Patrick це відбувається, але через ~ 30 хвилин.
Reactormonk
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.