Поиск конкретного процесса Python, который был убит менеджером OOM в Linux.

Вопрос или проблема

Я пытаюсь выяснить, какой конкретный процесс или исполняемый файл Python был убит Linux OOM killer.

В /var/log/messages я вижу следующее:

Aug 18 03:19:11 169 kernel: [ 7747]     0  7748  3226957  2875051    5692        0             0 python

(заметьте, здесь просто указано имя = “python”)

и это:

Aug 18 03:19:11 169 kernel: Убит процесс 7748 (python) total-vm:12907828kB, anon-rss:11500204kB, file-rss:0kB

(снова заметьте, что просто указано, что процесс был “python”)

Идеально было бы, если бы журнальный файл для процесса содержал PID где-нибудь. Но предположим, что журналы переписались (или предположим, что процесс не записывает PID нигде).

Предоставляет ли Linux способ выяснить полную команду, которая была выполнена для процесса? Было бы неплохо настроить OOM killer в Linux так, чтобы он отображал полное имя в таблице процессов, например:

/usr/bin/python /usr/lib/python2.7/site-packages/foo.pyc

Или, может быть, в момент ошибки OOM Linux где-то сохраняет некоторые детали процесса? т.е. копирует процессы из /proc в X? (мечты)

ПРИМЕЧАНИЕ:

Этот вопрос очень похож на этот вопрос: https://stackoverflow.com/questions/624857/finding-which-process-was-killed-by-linux-oom-killer

Но он не охватывает то, что я пытаюсь выяснить.

Linux не поддерживает запрос такой информации в момент, когда OOM Killer собирается убить процесс или уже убил процесс.

Вы можете постоянно мониторить систему и записывать каждый процесс с меткой времени и PID, а также полной строкой команды, если хотите. См. https://stackoverflow.com/a/8255487/334451 для примера реализации.

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

Ответ или решение

В ситуации, когда вы пытаетесь определить, какой конкретный процесс Python был убит системным OOM-убийцей в Linux, важно учитывать несколько моментов, чтобы получить максимально подробную информацию о происшествии.

1. Почему OOM Killer убивает процессы?

OOM (Out of Memory) killer – это механизм в Linux, который активируется, когда система истощает доступную память. Он принудительно завершает процессы с самой высокой памятью, чтобы восстановить систему. В вашем случае, из сообщений системы можно увидеть, что был убит процесс с PID 7748, и он запускался как 'python'.

2. Вывод логов

Из предоставленного вами вывода логов в файле /var/log/messages, видно, что информация о процессе действительно ограничена до имени приложения (python), без указания полного пути или аргументов командной строки:

Killed process 7748 (python) total-vm:12907828kB, anon-rss:11500204kB, file-rss:0kB

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

3. Как можно решить проблему

Существуют несколько подходов, которые могут помочь вам получать более подробную информацию о процессах, которые могут быть убиты в будущем:

a. Логирование командной строки процессов

Одним из способов решения этой проблемы является создание системы логирования, которая будет фиксировать все процессы и их параметры в реальном времени. Это можно реализовать с помощью пользовательского скрипта или системных инструментов, таких как ps, top или proc.

Пример скрипта для логирования процессов:

#!/bin/bash
while true; do
    ps -eo pid,comm,args >> /var/log/process_log.txt
    sleep 60  # Запись каждые 60 секунд
done

Этот скрипт будет записывать PID, имя команды и аргументы всех активных процессов в файл process_log.txt.

b. Использование системных инструментов

Еще одним эффективным способом является использование системных инструментов для мониторинга, таких как Systemd, procfs, или cgroups. Например, запустив команду cat /proc/[PID]/cmdline, вы сможете получить полную команду запуском процесса, если PID известен.

c. Обвод OOM Killer

На уровне конфигурации можно рассмотреть настройку OOM Killer, чтобы он записывал больше информации при аварийных завершениях процессов:

  • Установите переменные окружения OOM_SCORE_ADJ для изменения приоритета процессов.
  • Настройте cgroups, чтобы контролировать использование памяти и избегать внезапных убиваний.

4. Заключение

К сожалению, в момент срабатывания OOM Killer Linux не предоставляет удобных средств для получения детальной информации о процессах, которые были убиты. Однако с помощью регулярного мониторинга и логирования процессов вы сможете фильтровать их данные и в дальнейшем идентифицировать проблемные процессы.

При разработке подхода к логированию всегда имейте в виду объем данных, которые вы собираете, так как длительное хранение может занимать значительное место на диске. Спланируйте систему хранения данных для оптимизации производительности и управления доступным пространством на диске.

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

Оцените материал
Добавить комментарий

Капча загружается...