Профилирование сценария по трейсам с прода
Проблема
На локальных машинах профилирование не имеет смысла, результаты оказываются совершенно другими, запросы к локальной базе могут тормозить, а на prod занимать 5мс и наоборот.
Решение
Для достоверного результата необходимо проводить тест на выделенном окружении с отдельной prod-like инфраструктурой. Требуется большая подготовка окружения и нагрузки в целом для правильных выводов.
Альтернативное решение
Часто на prod уже собираются трейсы, достаточно добавить их на ключевые части сценария, а дальше по каждой части собранных данных строить перцентиль выполнения этапа. Так собрав достаточно большой набор данных возможно будет указать на проблемы.
Ограничения
Почти все системы сбора трейсов собирают лишь малую часть данных от 1% до 5% и по ним можно не увидеть проблему или необходимо будет собирать большой объем данных для поиска проблем.
Практика
- Сначала добавляем разметку во все части вашего сценария, в рамках текущей задачи - несколько эндпоинтов
- Раскатываем код и начинаем собирать данные
- Строим аналитику по каждой операции из трейса, что ищем: максимальное время выполнения, 99 перцентиль
- По этим данным понятно же тормозит в сценарии
- Правим код, раскатываем и наблюдаем, повторяем алгоритм по необходимости
Конкретный пример
Тормозила операция проверка существования, найдена описанным способом, без проведения перфоманс тестов, при этом на локальном окружении были получены совершенно иные данные. Проблема проявляла себя только в узких промахах в кэш, тем не менее была обнаружена и расширен кэш. В главный трейс можно добавить лог входящего запроса и по нему воспроизвести проблему.
Поиск проблемы.
Результат оптимизации.