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