Я пытаюсь определить причину зависания процесса в Linux. Это телекоммуникационное приложение, работающее под довольно большой нагрузкой. Для каждого из 8 пролетов T1 существует отдельный процесс. Время от времени один из процессов перестает отвечать на запросы - примерно за 50 секунд до того, как событие будет отмечено в журнале обычно очень загруженного процесса.
Вероятно, не хватает какого-то системного ресурса. Очевидная вещь - загрузка ЦП - вроде нормально.
Какие утилиты Linux могут быть лучше всего для обнаружения и анализа подобных вещей и быть максимально ненавязчивыми в этом отношении, поскольку это высоконагруженная система? Казалось бы, это должны быть процессы, а не системные. Может быть, постоянный мониторинг / proc / pid / XX? Top здесь не показался бы слишком полезным.





Вы можете настроить рассматриваемую программу и посмотреть, какие системные вызовы она выполняет.
Если вы можете заметить этот «момент отсутствия реакции», вы можете использовать strace, чтобы подключиться к рассматриваемому процессу в течение этого времени и попытаться выяснить, где он «спит»:
strace -f -o LOG -p <pid>
Более легкий, но менее надежный метод:
Когда процесс зависает, используйте top / ps / gdp / strace / ltrace, чтобы узнать состояние процесса (например, ожидает ли он в "select" или потребляет 100% ЦП при вызове некоторой библиотеки)
Зная общий характер рассматриваемого вызова, настройте вызов strace для регистрации определенных системных вызовов или групп системных вызовов. Например, чтобы регистрировать только системные вызовы, связанные с доступом к файлам, используйте:
strace -e file -f -o LOG ....
Если ремень для вас слишком тяжелый инструмент, попробуйте отслеживать:
Использование памяти с помощью "vmstat 1> / some / log" - возможно, в это время процесс загружается (или выключается)
Использование ввода-вывода с vmstat / iotop - возможно, какой-то другой процесс сбивает диски
/ proc / interrupts - возможно, драйвер для вашей карты T1 испытывает проблемы?
Спасибо - strace звучит полезно. Поймать процесс в нужное время будет частью удовольствия. Я придумал схему, чтобы периодически записывать метку времени в общую память, а затем отслеживать ее с помощью другого процесса. Отправка SIGSTOP позволила бы мне хотя бы изучить стек приложения с помощью gdb. Я не знаю, много ли мне скажет strace по приостановленному процессу, но, может быть, я мог бы включить strace и посмотреть, что он скажет. Или включите strace и нажмите SIGCONT.
забыл добавить - есть также сопутствующий инструмент ltrace для отслеживания вызовов библиотеки (strace отслеживает только системные вызовы)