Профилирование долгосрочного сервера Python - PullRequest
9 голосов
/ 22 марта 2012

У меня есть долго работающий витой сервер.

В тесте большой системы, в один конкретный момент несколько минут в тесте, когда некоторые клиенты входят в определенное состояние и определенныйпроисходит внешнее событие, , затем этот сервер занимает несколько минут 100% ЦП и работает очень медленно.Я хотел бы знать, что он делает.

Как получить профиль для определенного промежутка времени на долго работающем сервере?

Я мог бы легко отправить запуск сервера иостанавливать сообщения через HTTP, если есть способ включить или внедрить профилировщик во время выполнения?

При выборе я бы хотел профилирование на основе стека / call-graph, но даже выборочную выборкуможет дать понимание.

Ответы [ 3 ]

11 голосов
/ 22 марта 2012

yappi профилировщик может быть запущен и остановлен во время выполнения.

3 голосов
/ 22 марта 2012

Не очень Pythonic ответ, но, возможно, strace процесс дает некоторое представление (если вы работаете на Linux или подобном).

Использование строго Python, для таких вещей я использую трассировкузвонки, сохраняя их результаты в кольцевом буфере и используя сигнал (возможно, вы могли бы сделать это через HTTP-сообщение), чтобы сбросить этот кольцевой буфер.Конечно, трассировка замедляет все, но в вашем сценарии вы также можете включить трассировку с помощью HTTP-сообщения, так что она будет включена, только если ваша проблема активна.

1 голос
/ 20 марта 2019

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

  • pyflame будет подключаться к существующему процессу с помощью системного вызова ptrace (2) и создавать «графики пламени» процесса. Написано на Python.

  • py-spy работает, читая память процесса и выясняя стек вызовов Python. Он также предоставляет график пламени, а также «подобный сверху» интерфейс, чтобы показать, какая функция занимает больше всего времени. Он написан на Rust и Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...