Получить дамп ядра / отладки процесса, убитого oom-killer

10

Есть ли способ получить дамп ядра или отладить процесс, который был убит oom-killer?

Или даже установить oom-killer, чтобы попытаться убить процесс, используя вместо этого ABRT?

TrapAlice
источник

Ответы:

5

Другой подход - отключить чрезмерную загрузку памяти.

Чтобы восстановить некое подобие здравомыслия в управлении вашей памятью:

  1. Отключите OOM Killer (поместите vm.oom-kill = 0в /etc/sysctl.conf)
  2. Отключить переполнение памяти (положить vm.overcommit_memory = 2в /etc/sysctl.conf)

Эти настройки приведут к тому, что Linux будет вести себя традиционным образом (если процесс запрашивает больше памяти, чем доступно, malloc()произойдет сбой, и ожидается, что процесс, запрашивающий память, справится с этой ошибкой).

Обратите внимание, что это троичное значение:
  • 0 = "оцените, если у нас достаточно оперативной памяти"
  • 1 = "Всегда говори да"
  • 2 = "скажи нет, если у нас нет памяти"

Это заставит приложение справляться с исчерпанием самой памяти, и, возможно, его журналы / coredump / и т. Д. Могут дать вам что-то полезное.

ОБНОВЛЕНИЕ № 1

ПРИМЕЧАНИЕ. Когда в вашей системе заканчивается память, вы не сможете создавать новые процессы! Вы можете быть заблокированы из системы.

nishantjr
источник
Это ужасная идея. Большинство программ, работающих в вашей системе, вероятно, неправильно обрабатывают возвращаемое значение из-за ошибки выделения памяти. Это приведет к тому, что пути кода, которые практически никогда не будут выполняться никем, будут запущены, а в худшем случае могут даже привести к появлению уязвимостей в вашей системе из-за запуска этих непроверенных и неожиданных путей кода.
К.Дж. Цанакцидис
4
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 фактически убивает задачу захвата памяти.

HBruijn
источник