Назад | Перейти на главную страницу

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

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

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

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

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

  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

НОТА: Когда вашей системе не хватает памяти, вы не сможете запускать новые процессы! Вы можете быть заблокированы в системе.

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 и имя. Это помогает определить, почему был вызван убийца OOM, выявить мошенническую задачу, которая его вызвала, и определить, почему убийца OOM выбрал задачу, которую он выполнил для уничтожения.

Если он установлен на ноль, эта информация подавляется. В очень больших системах с тысячами задач может быть невозможно выгрузить информацию о состоянии памяти для каждой из них. Такие системы не должны подвергаться снижению производительности в условиях OOM, когда информация может быть нежелательной.

Если он установлен в ненулевое значение, эта информация отображается всякий раз, когда убийца OOM фактически завершает задачу, занимающую память.