Профилирование
Тема дорожной карты · Observability
Профилирование — это техника наблюдаемости, измеряющая, какие функции, методы или строки кода потребляют больше всего процессорного времени, памяти или других ресурсов среды выполнения в работающей программе. Профилировщик периодически сэмплирует стек вызовов процесса (сэмплирующий профилировщик) или инструментирует каждый вход и выход функции (трассирующий профилировщик), чтобы построить статистическую картину того, где тратится время. Результат обычно визуализируется в виде флейм-графа — диаграммы, где ширина каждой полоски представляет относительное время, затраченное в данной функции, а вертикальная ось показывает глубину стека вызовов. Профилирование незаменимо для диагностики регрессий производительности, невидимых только для метрик: метрики говорят, что сервис работает медленно, а профилирование указывает, какой именно путь выполнения кода ответственен за это. Типичные цели профилирования включают процессорное время, выделение памяти в куче (профилирование памяти), конкуренцию мьютексов, блокировку горутин (в Go) и ожидание ввода-вывода — каждая из них фиксируется отдельным типом профиля в инструментах вроде pprof и Grafana Pyroscope.
Как это работает
Профилирование — 4-й столп observability: always-on профилирование CPU, памяти, lock contention, goroutines/threads. Инструменты: Pyroscope (теперь часть Grafana, поддерживает много языков), Polar Signals Parca, datadog-profiler, async-profiler (JVM), pprof (Go встроен). Найдите медленную функцию в production без повторного запуска с прицепленным профайлером. Flame graphs — каноническая визуализация. Overhead sampling обычно < 5%.
Когда применять
Включите continuous profiling для любого сервиса с performance-sensitive кодом (latency-sensitive API, batch-jobs). Pyroscope/Parca — open-source выбор; включите per-language профайлеры (net/http/pprof для Go, pyflame / py-spy для Python, async-profiler для JVM). Профайлите в production — staging показывает другие паттерны. Комбинируйте с traces для "какой span = какая функция".
Типичные ошибки
Ловушки Профилирование: overhead профайлинга не трекается (иногда > 10% — sampling rate важен); профили без service-контекста (какая версия? какая env?); профайлят всё, но никогда не читают данные ("они у нас есть" != "мы их используем"); flame graphs без фильтрации (одна гигантская башня прячет всё остальное).