Как найти узкое место в системе
Что проверяют
Умеете ли вы искать узкое место методично, от симптома к причине, а не угадывать и сразу «добавлять кеш». Следом почти всегда просят реальный случай: что тормозило, чем нашли и как доказали, что стало лучше.
Как отвечать
Покажите порядок действий. Сначала сформулируйте симптом цифрами: выросла p99 задержка, упала пропускная способность, растёт очередь. Затем сузьте круг по ресурсам, удобно по методу USE: для каждого ресурса смотрите загрузку, насыщение и ошибки.
- метрики: Micrometer и Spring Boot Actuator отдают в Prometheus данные JVM, HTTP и пулов, Grafana их показывает. Отдельно смотрите пул соединений: число ожидающих соединений в HikariCP часто объясняет «медленный сервис» лучше любого профайлера;
- трассировка: OpenTelemetry показывает, какой участок запроса съел время: свой код, база или соседний сервис;
- CPU и аллокации: async-profiler строит flame graph без искажений от safepoint bias. JDK Flight Recorder (
jcmd <pid> JFR.start) можно держать включённым на проде с небольшим оверхедом, запись разбирают в JDK Mission Control; - блокировки: несколько дампов потоков подряд через
jcmd <pid> Thread.print. Если одни и те же потоки висят вBLOCKEDна одном мониторе, узкое место найдено; - GC и память: логи через
-Xlog:gc*, при подозрении на утечку снимают heap dump и открывают в Eclipse MAT; - база:
pg_stat_statements,EXPLAIN ANALYZE, статистика Hibernate для поиска N+1.
После исправления прогоните тот же нагрузочный сценарий в Gatling, JMeter или k6 и сравните те же метрики. Для точечной проверки алгоритма подходит JMH.
Где спотыкаются
Начинают с профайлера на ноутбуке. Локально нет ни реальных данных, ни конкуренции за пул соединений, и профиль показывает совсем не то, что болит на проде.
Смотрят на средние значения. Среднее время ответа может не меняться, пока p99 выросла в разы, а жалуются пользователи именно из хвоста.
Путают загрузку CPU с работой. Сервис с CPU на 20% может упираться в пул потоков, блокировку или ожидание базы, и добавление ядер тогда ничего не даст.