Статистическое профилирование в Python

Я хотел бы знать, что интерпретатор Python делает в моей производственной среде.

Некоторое время назад я написал простой инструмент под названием live-trace, который запускает поток демона, который собирает стековые трассы каждые N миллисекунд.

Но обработка сигналов в самом интерпретаторе имеет один недостаток:

Хотя обработчики сигналов Python вызываются асинхронно для пользователя Python, они могут происходить только между "атомарными" инструкциями интерпретатора Python. Это означает, что сигналы, поступающие во время длинных вычислений, реализованных исключительно на языке C (например, совпадения с регулярными выражениями в больших текстах), могут задерживаться на произвольное количество времени.

Источник: https://docs.python.org/2/library/signal.html

Как я могу обойти вышеуказанное ограничение и получить трассировку стека, даже если интерпретатор находится в некотором коде C в течение нескольких секунд?

Связанный: https://github.com/23andMe/djdt-flamegraph/issues/5

2 ответа

Решение

Вы пробовали Pyflame? Он основан на ptrace, поэтому на него не должны влиять тонкости обработки сигналов CPython.

Сейчас я использую py-spy со спидоскопом. Это очень крутое сочетание.

py-spy работает в Windows/Linux/macOS, может самостоятельно выводить графики пламени и активно внедряется, например. Поддержка профилирования подпроцесса была добавлена ​​в октябре 2019 года.

Может быть, перф-инструмент от Брендана Грегга может помочь

Другие вопросы по тегам