Уведомления

Группа в Telegram: @pythonsu

#1 Май 24, 2010 15:00:36

axe
От:
Зарегистрирован: 2008-08-07
Сообщения: 256
Репутация: +  0  -
Профиль   Отправить e-mail  

Как определить, чем занимается embedded скрипт?

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

Нашёл неясную проблему. Когда выполняются запросы, нагрузка на процессор поднимается до 35%. После того, как все запросы отработаны, нагрузка с процессора не спадает. Как теперь определить, чем занимается сервер? (предварительно считаем, что проблема в Python-скриптах, а не в C++ части)



Офлайн

#2 Май 24, 2010 15:16:06

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

Как определить, чем занимается embedded скрипт?

ps waux
покажи

Офлайн

#3 Май 24, 2010 15:54:03

axe
От:
Зарегистрирован: 2008-08-07
Сообщения: 256
Репутация: +  0  -
Профиль   Отправить e-mail  

Как определить, чем занимается embedded скрипт?

он на нескольких страницах. если кратко, то:

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



Офлайн

#4 Май 24, 2010 16:15:58

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

Как определить, чем занимается embedded скрипт?

у тебя VDS ?

Офлайн

#5 Май 24, 2010 16:37:31

axe
От:
Зарегистрирован: 2008-08-07
Сообщения: 256
Репутация: +  0  -
Профиль   Отправить e-mail  

Как определить, чем занимается embedded скрипт?

у меня сервер это отдельная машина в локальной сети



Офлайн

#6 Май 24, 2010 16:59:30

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Как определить, чем занимается embedded скрипт?

Очень интересный вопрос

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

Было несколько открытий чудных.



Отредактировано (Май 24, 2010 17:00:09)

Офлайн

#7 Май 25, 2010 13:41:06

axe
От:
Зарегистрирован: 2008-08-07
Сообщения: 256
Репутация: +  0  -
Профиль   Отправить e-mail  

Как определить, чем занимается embedded скрипт?

Андрей Светлов, спасибо за мысль сделать запрос, который будет возвращать какую-то системную инфу.
как cProfile использовать помочь пока не придумал…



Офлайн

#8 Май 25, 2010 14:06:37

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Как определить, чем занимается embedded скрипт?

ну как же. Видеть, сколько времени каждая функция заняла и что при этом вызывала - небесполезно.



Офлайн

#9 Май 26, 2010 14:30:45

axe
От:
Зарегистрирован: 2008-08-07
Сообщения: 256
Репутация: +  0  -
Профиль   Отправить e-mail  

Как определить, чем занимается embedded скрипт?

Обработка запроса выполняется нелинейно. Начинается в главном потоке, потом уходит во второстепенный ожидать, пока база что-то вернёт. Далее обратно в главный. У меня возникло ничем не обоснованное предположение, что cProfile потерялся бы в момент обращения к треду.

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

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

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

Чувствую себя лузером. Потерял 3 дня…



Офлайн

#10 Май 26, 2010 23:15:58

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Как определить, чем занимается embedded скрипт?

разобрались и хорошо.
запустив cProfile в вашем случае смогли бы увидеть, что ваше “логирование” или то, что его вызывает исполнялось неприлично долго. Дальше все просто.
инструменты стоит знать.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version