Ухудшение производительности Django / Postgres после многократной обработки одного и того же запроса - PullRequest
0 голосов
/ 27 марта 2011

Я использую Django на Apache. У меня есть несколько клиентских компьютеров, которые должны вызвать urllib2.urlopen () и отправить некоторые данные, которые мой сервер обработает, и немедленно отправить ответ. Однако, когда я тестирую это, я обнаружил очень сложную проблему. У меня один клиент неоднократно отправлял одни и те же данные для обработки. В первый раз это занимает около ~ 20 секунд, во второй раз - около 40 секунд, в третий раз я получаю ошибку 504 (время ожидания шлюза). Если я пытаюсь отправить данные, появляется еще 504 ошибки. Я почти уверен, что это проблема Postgres, так как функция, обрабатывающая информацию, выполняет много обращений к базе данных, однако я не знаю, почему производительность Postgres так сильно снизилась. Я пробовал несколько приемов оптимизации базы данных, в том числе этот: (/1063100/postoyannoe-soedinenie-s-bazoi-dannyh-django), безрезультатно.

Заранее спасибо.

Редактировать: запросы не приходят одновременно. Они идут вплотную, и каждый запрос включает много SELECT и JOIN, а также есть несколько INSERT и UPDATE. Журналы ошибок apache показывают, что это просто простой тайм-аут, когда функция обработки опубликованных клиентом данных занимает более 90 секунд.

Ответы [ 2 ]

2 голосов
/ 27 марта 2011

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

Это можно сделать, установив свойство конфигурации log_min_duration.

Подробности в руководстве: http://www.postgresql.org/docs/current/static/runtime-config-logging.html#GUC-LOG-MIN-DURATION-STATEMENT

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

Это также может быть выдана блокировка. Возможно, первый вызов не завершает свою транзакцию должным образом, а последующие вызовы ожидают ресурса при ожидании.

Вы можете убедиться в этом, проверив системное представление pg_locks после первого вызова.

0 голосов
/ 27 марта 2011

Вы проверили Apache error_logs? Вы установили django DEBUG = True или ADMINS = ('email@addr.com',), чтобы вы могли получить подробный отчет об ошибке о фактической причине проблемы? Если так, то как насчет вставки некоторой информации здесь.

Почему вы уверены, что это postgres? Вы сделали диагностику, чтобы прийти к такому выводу? Если это так, пожалуйста, дайте нам знать.

Работаете ли вы с Apache mod_wsgi? Сколько процессов и потоков вы выделили для своего приложения django?

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

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

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