Категории

Язык
ЯП
Аспект языка

12 сентября 2018 г. 10:43 (ред. 12 сентября 2018 г. 10:50)
Об интересном инструменте, позволяющем профилировать запущенные процессы
Не так давно свет увидело очередное приложение для профилирования под названием py-spy.
Не смотря на то, что написано оно на Rust, а не на Питоне, автор предусмотрел возможность его установки из PyPI:

    $ pip install py-spy

Будучи профилировщиком, py-spy позволяет вам отследить, в каком месте кода ваше приложение проводит больше всего времени. Такая информация может быть полезна, например, при отладке или при поиске узких мест.

Приложение может и запустить скрипт, и подключиться к уже работающему процессу. Важно отметить, что его использование не требует модификации кода приложения, а исполняется профилировщик отдельным процессом (не встраивается в процесс приложения). При таких характеристиках py-spy можно использовать и с работающими боевыми процессами.

Этот профилировщик считывает память процесса напрямую, находит нити и далее для каждой расследует стек вызовов.

Внимание
Чтобы разбираться в структуре памяти приложения py-spy носит с собой инструкции для различных версий интерпретатора Питона — проверьте, что используемая вами версия интерпретатора поддерживается. Кроме того, на данном этапе недоступно отслеживание функций уровня C, Cython и пр.

Итак, допустим, что у вас имеется работающий процесс приложения. Вы находите идентификатор процесса (PID) и подключаетесь к нему:

    $ py-spy --pid 9362

Получаете интерактивный сеанс, в котором выводится информация о процессе. По умолчанию информация агрегируется по строкам кода, но имеется возможность агрегировать и по именам функций. Помимо этого, если хочется, можно изменить количество образцов (семплов), собираемое в секунду. Для тех, кому удобнее разбираться по графику, предсмотрена возможность представить процесс в виде изображения .svg.

Исходники профилировщика и дополнительная информация, на английском доступа в репозитории.

Удачного разбора полётов.