Форум сайта python.su
Python-cкрипт запущен как embedded в приложении на C++, обеспечивает логику сервера.
Я написал тест, который стучиться к этому серверу, выполняет запрос, получает ответ. Например, 300 обращений за 3 секунды.
Нашёл неясную проблему. Когда выполняются запросы, нагрузка на процессор поднимается до 35%. После того, как все запросы отработаны, нагрузка с процессора не спадает. Как теперь определить, чем занимается сервер? (предварительно считаем, что проблема в Python-скриптах, а не в C++ части)
Офлайн
ps waux
Офлайн
он на нескольких страницах. если кратко, то:
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
Офлайн
у тебя VDS ?
Офлайн
у меня сервер это отдельная машина в локальной сети
Офлайн
Очень интересный вопрос
Как первый шаг я рекомендую cProfile.run_ctx
Для начала получите среднюю температуру по больнице. Потом начнете подстраивать.
Обратите внимание: у профайлера есть .enable/.disable и .dump_stats (который по ходу дела отключает профайлер).
Я писал небольшой код, который мог отдать статистику у работающей программы по запросу.
Он висел как web interface - помогало.
Было несколько открытий чудных.
Отредактировано (Май 24, 2010 17:00:09)
Офлайн
Андрей Светлов, спасибо за мысль сделать запрос, который будет возвращать какую-то системную инфу.
как cProfile использовать помочь пока не придумал…
Офлайн
ну как же. Видеть, сколько времени каждая функция заняла и что при этом вызывала - небесполезно.
Офлайн
Обработка запроса выполняется нелинейно. Начинается в главном потоке, потом уходит во второстепенный ожидать, пока база что-то вернёт. Далее обратно в главный. У меня возникло ничем не обоснованное предположение, что cProfile потерялся бы в момент обращения к треду.
В-общем, что я сделал:
1. Попробовал отключить вообще всё. Чтобы сервер получал запрос и в ответ получал “рыбу”. Сервер перестал съедать проц. Т.е. проблема в моих Python-скриптах.
2. Включил обратно всё. И отключил только запрок к базе. Проблема не решилась (нагрузка осталась).
3. Отключил механизм составления запроса к базе. Проц по прежнему съедается.
….
и т.д.
т.е. методом последовательных приближений пришёл к тому месту в коде, отключив/включив которое (это одна строка) исчезает или остаётся нагрузка (после завершения обработки запросов).
В-общем, проблема оказалась в том, что для некоторого ключевого объекта включалось “логирование” состояния. Состояние сохранялось в некий стек внутри объекта. Причём ссылка на объект сохранялась, и объект продолжать жить, когда уже отработал и должен был быть удалён. Чем больше тестовых запросов я отправлял на сервер, тем больше съедалось ресурсов.
Чувствую себя лузером. Потерял 3 дня…
Офлайн
разобрались и хорошо.
запустив cProfile в вашем случае смогли бы увидеть, что ваше “логирование” или то, что его вызывает исполнялось неприлично долго. Дальше все просто.
инструменты стоит знать.
Офлайн