Я хотел бы знать, что интерпретатор 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

13
guettli 28 Фев 2018 в 16:22

3 ответа

Лучший ответ

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

speedscope-view-of-py-spy-data

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

5
Quentin Pradet 2 Дек 2019 в 15:03

Может быть, perf-tool от Брендана Грегга может помочь

1
Italux 10 Мар 2018 в 15:42

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

6
Marius Gedminas 28 Фев 2018 в 18:29