2012-01-22 3 views
3

Я собрал сервер интеграции для нашего приложения, работающего на Django. Некоторые из функций все еще экспериментальны и приводят к слишком долгим запросам.Длинные запросы с пушкой/nginx

На данный момент я плохо себя чувствую, но мне нужно уметь интегрироваться. Всякий раз, когда мы используем функцию, которая ведет к длинному запросу, приложение зависает (как и ожидалось), а затем, спустя примерно полтора минуты, возвращает «502 - плохой шлюз». Остальное приложение работает нормально.

Я проверил журнал gunicorn, и всякий раз, когда это происходит, я получаю строку

2012-01-20 17:30:13 [23128] [DEBUG] GET /results/ 
2012-01-20 17:30:43 [23125] [ERROR] WORKER TIMEOUT (pid:23128) 
Traceback (most recent call last): 
    File "/home/demo/python_envs/frontend/lib/python2.6/site-packages/gunicorn/app/base.py", line 111, in run 
    os.setpgrp() 
OSError: [Errno 1] Operation not permitted 

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

description "..." 

start on runlevel [2345] 
stop on runlevel [!2345] 
#Send KILL after 5 seconds 
kill timeout 5 
respawn 

env VENV="/path/to/a/virtual/env/" 

#how to know the pid 
pid file $VENV/run/guniconr-8080.pid 

script 
exec sudo -u demo $VENV/bin/gunicorn_django --preload --daemon -w 4 -t 600 --log-level debug --log-file $VENV/run/gunicorn-8080.log -p $VENV/run/gunicorn-8080.pid -b localhost:8080 /path/to/settings.py 
end script 

Я запускаю версию для пушки, 0.13.4. Любая помощь будет принята с благодарностью.

Этот вопрос является cross-post from ServerFault.

ответ

3

Вы подключаетесь непосредственно к артиллеристу? Или между ними существует ngnix? Если я правильно помню, есть 90 секундных тайм-аутов в nginx.

Как и в стороне, для таких плохо исполняющих запросов, существует два решения:

  • кэшировать результат и получить работу хрон для вызова команды управления пользовательским Джанго, что делает расчет и заполняет кэш.

  • Асинхронная очередь задач, такая как сельдерей, выполняет фактический расчет, и вы делаете отдельный запрос, чтобы проверить, готова ли она.

+0

Как видно из названия, я использую nginx. Я установил тайм-аут на 10 минут для тестирования, но он истекает раньше (дольше, чем 90 секунд). –

+0

Не обращайте внимания, что, может быть, это не более 90 секунд ... у вас есть ссылка на то, где вы получили этот номер? –

+0

... также ... я понимаю, как работать с долгосрочными запросами в общем случае. Это встроенная функция, которую я должен иметь возможность развертывать с низкой производительностью на нашем сервере интеграции - на более совершенном оборудовании и после дальнейшей разработки запрос не смехотворно длителен. –

0

Вы попробовали Asynchronous workers в Gunicorn?

Особенно подходит для медленных запросов и др.

+0

Нет, но я уверен проблема была неправильной конфигурации. С тех пор мы позаботились о наших проблемах с производительностью, поэтому мне никогда не приходилось полностью решать эту проблему. Есть ряд причин, по которым я не могу использовать асинхронных рабочих Gunicorn прямо сейчас, хотя они могут быть вариантом в будущем. –

Смежные вопросы