axe
Май 24, 2010 15:00:36
Python-cкрипт запущен как embedded в приложении на C++, обеспечивает логику сервера.
Я написал тест, который стучиться к этому серверу, выполняет запрос, получает ответ. Например, 300 обращений за 3 секунды.
Нашёл неясную проблему. Когда выполняются запросы, нагрузка на процессор поднимается до 35%. После того, как все запросы отработаны, нагрузка с процессора не спадает. Как теперь определить, чем занимается сервер? (предварительно считаем, что проблема в Python-скриптах, а не в C++ части)
sypper-pit
Май 24, 2010 15:16:06
axe
Май 24, 2010 15:54:03
он на нескольких страницах. если кратко, то:
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
Май 24, 2010 16:15:58
у тебя VDS ?
axe
Май 24, 2010 16:37:31
у меня сервер это отдельная машина в локальной сети
Андрей Светлов
Май 24, 2010 16:59:30
Очень интересный вопрос
Как первый шаг я рекомендую cProfile.run_ctx
Для начала получите среднюю температуру по больнице. Потом начнете подстраивать.
Обратите внимание: у профайлера есть .enable/.disable и .dump_stats (который по ходу дела отключает профайлер).
Я писал небольшой код, который мог отдать статистику у работающей программы по запросу.
Он висел как web interface - помогало.
Было несколько открытий чудных.
axe
Май 25, 2010 13:41:06
Андрей Светлов, спасибо за мысль сделать запрос, который будет возвращать какую-то системную инфу.
как cProfile использовать помочь пока не придумал…
Андрей Светлов
Май 25, 2010 14:06:37
ну как же. Видеть, сколько времени каждая функция заняла и что при этом вызывала - небесполезно.
axe
Май 26, 2010 14:30:45
Обработка запроса выполняется нелинейно. Начинается в главном потоке, потом уходит во второстепенный ожидать, пока база что-то вернёт. Далее обратно в главный. У меня возникло ничем не обоснованное предположение, что cProfile потерялся бы в момент обращения к треду.
В-общем, что я сделал:
1. Попробовал отключить вообще всё. Чтобы сервер получал запрос и в ответ получал “рыбу”. Сервер перестал съедать проц. Т.е. проблема в моих Python-скриптах.
2. Включил обратно всё. И отключил только запрок к базе. Проблема не решилась (нагрузка осталась).
3. Отключил механизм составления запроса к базе. Проц по прежнему съедается.
….
и т.д.
т.е. методом последовательных приближений пришёл к тому месту в коде, отключив/включив которое (это одна строка) исчезает или остаётся нагрузка (после завершения обработки запросов).
В-общем, проблема оказалась в том, что для некоторого ключевого объекта включалось “логирование” состояния. Состояние сохранялось в некий стек внутри объекта. Причём ссылка на объект сохранялась, и объект продолжать жить, когда уже отработал и должен был быть удалён. Чем больше тестовых запросов я отправлял на сервер, тем больше съедалось ресурсов.
Чувствую себя лузером. Потерял 3 дня…
Андрей Светлов
Май 26, 2010 23:15:58
разобрались и хорошо.
запустив cProfile в вашем случае смогли бы увидеть, что ваше “логирование” или то, что его вызывает исполнялось неприлично долго. Дальше все просто.
инструменты стоит знать.