Долгосрочные запросы с gunicorn + nginx - PullRequest
3 голосов
/ 23 января 2012

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

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

Я проверил журнал 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 минут, чтобы убедиться.Вот часть сценария upstart, который запускает gunicorn.

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

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

Этот вопрос является кросс-постом от ServerFault .

Ответы [ 2 ]

3 голосов
/ 22 марта 2012

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

Кроме того, для таких плохо выполняющихся запросов обычно есть два решения:

  • Кэшированиерезультат и получить задание cron для вызова пользовательской команды управления django, которая выполняет вычисления и заполняет кэш.

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

0 голосов
/ 08 июня 2013

Вы пробовали Асинхронные рабочие в Гуникорне?

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

...