Найти - Пользователи
Полная версия: Как определить, чем занимается embedded скрипт?
Начало » Python для экспертов » Как определить, чем занимается embedded скрипт?
1
axe
Python-cкрипт запущен как embedded в приложении на C++, обеспечивает логику сервера.
Я написал тест, который стучиться к этому серверу, выполняет запрос, получает ответ. Например, 300 обращений за 3 секунды.

Нашёл неясную проблему. Когда выполняются запросы, нагрузка на процессор поднимается до 35%. После того, как все запросы отработаны, нагрузка с процессора не спадает. Как теперь определить, чем занимается сервер? (предварительно считаем, что проблема в Python-скриптах, а не в C++ части)
sypper-pit
ps waux
покажи
axe
он на нескольких страницах. если кратко, то:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 23767 36.5 2.3 181252 49116 pts/17 Sl+ 13:30 73:24 myserver
sypper-pit
у тебя VDS ?
axe
у меня сервер это отдельная машина в локальной сети
Андрей Светлов
Очень интересный вопрос

Как первый шаг я рекомендую cProfile.run_ctx
Для начала получите среднюю температуру по больнице. Потом начнете подстраивать.
Обратите внимание: у профайлера есть .enable/.disable и .dump_stats (который по ходу дела отключает профайлер).
Я писал небольшой код, который мог отдать статистику у работающей программы по запросу.
Он висел как web interface - помогало.

Было несколько открытий чудных.
axe
Андрей Светлов, спасибо за мысль сделать запрос, который будет возвращать какую-то системную инфу.
как cProfile использовать помочь пока не придумал…
Андрей Светлов
ну как же. Видеть, сколько времени каждая функция заняла и что при этом вызывала - небесполезно.
axe
Обработка запроса выполняется нелинейно. Начинается в главном потоке, потом уходит во второстепенный ожидать, пока база что-то вернёт. Далее обратно в главный. У меня возникло ничем не обоснованное предположение, что cProfile потерялся бы в момент обращения к треду.

В-общем, что я сделал:
1. Попробовал отключить вообще всё. Чтобы сервер получал запрос и в ответ получал “рыбу”. Сервер перестал съедать проц. Т.е. проблема в моих Python-скриптах.
2. Включил обратно всё. И отключил только запрок к базе. Проблема не решилась (нагрузка осталась).
3. Отключил механизм составления запроса к базе. Проц по прежнему съедается.
….
и т.д.

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

В-общем, проблема оказалась в том, что для некоторого ключевого объекта включалось “логирование” состояния. Состояние сохранялось в некий стек внутри объекта. Причём ссылка на объект сохранялась, и объект продолжать жить, когда уже отработал и должен был быть удалён. Чем больше тестовых запросов я отправлял на сервер, тем больше съедалось ресурсов.

Чувствую себя лузером. Потерял 3 дня…
Андрей Светлов
разобрались и хорошо.
запустив cProfile в вашем случае смогли бы увидеть, что ваше “логирование” или то, что его вызывает исполнялось неприлично долго. Дальше все просто.
инструменты стоит знать.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB