🖥 Datadog научила профилировщик Python понимать asyncio: флеймграфы со «стеками из стеков» и оверхед меньше на 60%
Главная боль профилирования asyncio в том, что каждая задача выглядит как независимый стек. Время в запросе к Cassandra повисает в воздухе, и непонятно, какой именно путь в приложении его породил.
Инженеры Datadog решили это так: профилировщик отслеживает, какая задача кого ждёт, строит дерево зависимостей и начиная с листьев надстраивает фреймы родителей поверх фреймов потомков. Код, разбитый на отдельные задачи, и обычные корутины в одной задаче теперь дают сопоставимые флеймграфы. Если задача живёт дольше создателя, время засчитывается создателю, пока он работает, а затем тому, кто её ждёт.
Цена такого подхода высокая: к стоимости на поток добавляется O(n_tasks), а серверы держат много задач, поэтому адаптивный сэмплинг местами падал до минимальной одной выборки в секунду.
Резервуарное сэмплирование задач команда отвергла, потому что для дерева нужны метаданные всех задач.
Оверхед срезали тремя шагами. Убрали C++ исключения из пути сэмплирования, это около 15%. Интернировали строки имён функций и файлов, ещё около 25%. Заменили process_vm_readv, по системному вызову на каждый маленький объект, на memcpy с обработчиком сигнала для восстановления после ошибок памяти, это около 50% для синхронного кода.
В сумме на сервисах с выкаченными изменениями оверхед упал более чем на 60%.
В проде профилировщик нашёл бесконечный цикл в библиотеке pylzstring, которую затем починили в апстриме, и внутреннюю библиотеку, строившую большие debug-строки при логгере уровня INFO. Отдельно ИИ-агент через MCP и Dynamic Instrumentation оптимизировал функ
ции на NumPy и снизил CPU в них на 15-30%. Улучшения доступны в свежих версиях ddtrace. Автор отмечает, что похожий подход принят в Tachyon, профилировщике CPython 3.15, но сравнения не делает, как и абсолютных цифр оверхеда.
Источник: https://www.datadoghq.com/blog/engineering/async-python-profiler/
Post #5744
1.23K

- 👍 6
- ❤ 5
- 🔥 3
- 🤩 1