З вашого коментаря, здається, що система просто поміняється.
У Linux є вбивця OOM, який викликається, коли система перезавантажила пам'ять, а тепер закінчилася.
Linux за замовчуванням виконує перезавантаження пам'яті, що в основному означає, що це дає програмам більше пам'яті, ніж система насправді. Це робиться за умови, що програми насправді не будуть використовувати всю пам'ять, яку вони вимагають. Однак, коли в системі не вистачає пам'яті, вона вже казала різним запущеним процесам, що у них є пам'ять, тому вона вже не може просто відмовити. Замість цього потрібно викликати вбивцю OOM. Вбивця OOM в основному знаходить процес, який, на думку ядра, полегшить стан поза пам'яті. Зазвичай це просто процес, що використовує найбільшу кількість пам'яті, але насправді алгоритм набагато складніший.
Оскільки ви overcommit_memory
встановили 0
режим (автоматичний режим), ядро виконує перезавантаження пам'яті. Отже, з вашої поясненої поведінки, здається, що система просто сильно змінюється.
Звідси є 2 варіанти.
Зменшити своп
У вашій системі не вистачає оперативної пам’яті, і тому ядро починає перекидати речі в своп. Якщо у вашій системі закінчується своп, то вона викликає вбивцю OOM. Однак оскільки у вас залишилося вільне місце для заміни, цього не відбувається.
Ваша оригінальна ідея, вручну вбийте процес.
Ви можете вручну вбити процес, якщо ви думаєте, що система занадто сильно змінюється і щось потрібно загинути. Це можна зробити через тригери ядра SysRq.
Ядро має те, що воно називає "магічним SysRq". Це трохи функціональності, яка дозволяє ядру виконувати якусь екстрену операцію. Це можуть бути такі речі, як "перекомпонувати всі томи лише для читання", "синхронізувати всі файлові системи" або "перезавантажити зараз". Один із таких варіантів - також викликати вбивцю OOM.
Якщо у вашому ядрі включена магія SysRq (опція ядра CONFIG_MAGIC_SYSRQ
), ви можете це зробити двома способами.
- Alt+ SysRq+ f
Просто натисніть ці 3 клавіші на клавіатурі.
echo f > /proc/sysrq-trigger
Це виконує точно те саме завдання, що і метод клавіатури, але робить це програмно.
Ви також можете повністю відключити своп, і це я роблю в більшості моїх систем, і саме з цієї причини. Зміна вигідна тим, що ядро буде попередньо замінювати дані, які не використовуються, дозволяючи більшій кількості вашого тарана використовувати для кешування. Але це призводить до цієї проблеми з примусовою заміною, яку ви бачите.
Я особисто думаю, що найкращим рішенням є якийсь варіант ядра викликати вбивцю OOM при примусовій заміні. В основному дозволяйте попереджувальному swap працювати, але якщо ядро змушене перенести щось на своп, оскільки ви поза оперативною пам'яттю, тоді попросіть вбивцю OOM.
На жаль, це лише моє особисте бажання. Це не робить.