Відповіді:
Інший підхід полягає у відключенні перезапису пам'яті.
Щоб відновити деяку подобу розуму для управління пам’яттю:
- Вимкнути вбивцю OOM (
vm.oom-kill = 0
ввести /etc/sysctl.conf)- Відключити overcommit пам'яті (Поміщений
vm.overcommit_memory = 2
в/etc/sysctl.conf
)Ці параметри змусять Linux вести себе традиційним чином (якщо процес вимагає більше пам'яті, ніж доступно
Зауважте, що це потрійне значення:malloc()
, не вдасться, і очікується, що процес, що запитує пам'ять, впорається з цим збоєм).
- 0 = "Оцініть, якщо у нас достатньо оперативної пам'яті"
- 1 = "Завжди кажи так"
- 2 = "скажи" ні ", якщо у нас немає пам'яті"
Це змусить програму впоратися із втратою пам'яті, і, можливо, її журнали / coredump / тощо можуть дати вам щось корисне.
ПРИМІТКА. Коли у вашої системи не вистачить пам'яті, ви не зможете породити нові процеси! Можливо, ви заблоковані із системи.
echo 1 > /proc/sys/vm/oom_dump_tasks
що здається про максимум, який ви можете отримати ядро для відображення на помилках поза пам'яттю.
https://www.kernel.org/doc/Documentation/sysctl/vm.txt
Вмикає системний дамп задачі (виключаючи потоки ядра), який повинен вироблятися, коли ядро виконує вбивство OOM і включає в себе таку інформацію, як pid, uid, tgid, vm size, rss, nr_ptes, swapents, оцінка oom_score_adj та ім'я. Це корисно, щоб визначити, чому вбивця OOM викликали, визначити завдання, яке його викликало, і визначити, чому вбивця OOM обрала завдання, яке воно вбило.
Якщо для цього встановлено нуль, ця інформація придушується. У дуже великих системах з тисячами завдань може бути недоцільним скидання інформації про стан пам'яті для кожної з них. Такі системи не повинні примушувати застосовувати штрафи за ефективність в умовах OOM, коли інформація може не бути бажаною.
Якщо для цього встановлено значення, що не дорівнює нулю, ця інформація відображається всякий раз, коли вбивця OOM насправді вбиває завдання виправлення пам'яті.