На какие метрики обращать внимание при профилировании падающего приложения
Что проверяют
Различаете ли вы «тормозит» и «падает». Это разные расследования, и интервьюер смотрит, пойдёте ли вы за причиной остановки процесса или начнёте перечислять метрики производительности вообще.
Как отвечать
Сначала уточните, как именно падает. Варианты разные: процесс завершается сам с OutOfMemoryError, его убивает ядро по нехватке памяти, приложение живо, но перестало отвечать, или контейнер перезапускает оркестратор по упавшей проверке живости.
Дальше по памяти:
- куча: занято после полной сборки, а не пик. Пила, которая после каждой сборки не опускается, это утечка;
- работа сборщика мусора: доля времени в паузах и частота полных сборок. Приложение, проводящее в сборке большую часть времени, уже нерабочее, даже если формально живо;
- память вне кучи: metaspace, кэш скомпилированного кода, стеки потоков, прямые буферы. Процесс с нормальной кучей может быть убит по общему лимиту контейнера;
- потоки: число живых, их состояния, блокировки. Взрывной рост числа потоков и пул, целиком занятый ожиданием, дают зависание без единого исключения в логах.
Рядом смотрите долю ошибок по методам, время ответа по перцентилям и поведение пулов: соединений к базе, HTTP-клиента, очередей задач. Инструменты тоже назовите: заранее включённый сброс дампа кучи по ошибке нехватки памяти, логи сборщика мусора, дамп потоков, непрерывный профайлер на основе штатного механизма событий JVM.
Где спотыкаются
Смотрят средние значения. Среднее время ответа прячет ровно тот хвост, из-за которого копятся потоки и переполняется очередь, поэтому нужны перцентили и максимум.
Считают рост занятой кучи утечкой сам по себе. Сборщик не обязан освобождать память рано, важна не занятая память в пике, а уровень после полной сборки и его тренд за часы работы.
Собирают данные после перезапуска. Нужен именно падающий процесс: дамп кучи в момент ошибки, дамп потоков при зависании, логи сборщика за период до падения. Перезапустили в первую очередь, значит расследование начинается с нуля и ждёт следующего падения.