Ответы:
Другой подход - отключить чрезмерную загрузку памяти.
Чтобы восстановить некое подобие здравомыслия в управлении вашей памятью:
- Отключите OOM Killer (поместите
vm.oom-kill = 0
в /etc/sysctl.conf)- Отключить переполнение памяти (положить
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, rss, nr_ptes, swapents, oom_score_adj score и name. Это полезно, чтобы определить, почему был вызван убийца OOM, определить мошенническую задачу, которая его вызвала, и определить, почему убийца OOM выбрал задачу, которую он сделал, чтобы убить.
Если это установлено в ноль, эта информация подавляется. В очень больших системах с тысячами задач может оказаться невозможным сбросить информацию о состоянии памяти для каждой из них. Такие системы не должны принуждаться к снижению производительности в условиях OOM, когда информация может быть нежелательной.
Если для этого параметра установлено значение, отличное от нуля, эта информация отображается всякий раз, когда убийца OOM фактически убивает задачу захвата памяти.