Грэм Дамплтон: Поиск медленног... Заметка
Planet Python на русском

Грэм Дамплтон: Поиск медленного кода с обёрткой

Конечная точка /order магазина Flask работает медленно, и цель — выявить узкое место. Традиционные методы с использованием секундомера требуют изменений в коде, создают несвязанные строки логов и плохо справляются с периодическими замедлениями. Профайлеры предоставляют слишком много деталей, скрывая информацию, специфичную для запроса.Используя существующую конфигурацию, начальное трассирование немедленно выявляет разбивку по времени. Запрос занимает 37,3 мс, представление — 36,3 мс, сервис — 35,9 мс, а реестр — 35,1 мс, в то время как шлюз — всего 8 мкс. Это указывает на то, что реестр является основной причиной замедления.Концепция "собственного времени" отличает операции, которые медленны сами по себе, от тех, которые медленны из-за своих дочерних элементов. Wrapture вычисляет это, показывая, что реестр медленный сам по себе, в то время как сервис и представление медленны, потому что они вызывают реестр.Тест с использованием wrapture.instrumentation и wrapture.timeline подтверждает это: OrderService.place имеет собственное время 173 мкс из 31,0 мс, в то время как Ledger.record отвечает за большую часть продолжительности. Такой уровень детализации недоступен из стандартных профайлеров.Для долгосрочного мониторинга коллектор Aggregate собирает статистику по многим запросам, включая общее, собственное, минимальное и максимальное время. Отчет, полученный после отправки тридцати запросов на сервер, подтверждает, что Ledger.record является основным источником замедления по собственному времени.Для отслеживания замедлений по арендаторам wrapture.annotate позволяет добавлять пользовательские данные, такие как "X-Tenant", к текущим событиям. Это позволяет фильтровать трассировки, чтобы определить, какие арендаторы испытывают более медленные запросы.Коллектор Counter предоставляет более дешевую альтернативу, подсчитывая только операции без сохранения продолжительности, что подходит для утверждений, основанных на бюджете, в наборах тестов (например, для обнаружения проблем с запросами N+1). Следующим шагом является передача этих событий в бэкенд трассировки.