Гуникорн не отвечает

Я использую Gunicorn для работы с приложением Django, он работал нормально, пока я не изменил свой тайм-аут с 30 до 900000, я должен был сделать это, потому что у меня был usecase, в котором огромный файл должен был загружаться и обрабатываться ( процесс занимает более 30 м в некоторых случаях), но после этого изменения Gunicorn не реагирует через несколько часов, я думаю, проблема в том, что все рабочие (будучи 30) будут заняты некоторыми запросами после этого количества времени, странно, что это происходит даже если я не запускаю этот длинный запрос вообще, и это происходит с обычным исследованием в django admin. Я хочу знать, есть ли способ отслеживать запросы на пулеметы и видеть, что рабочие заняты тем, что просит, я хочу узнать запросы, которые делают их занятыми. Я пробовал --log-file=- --log-level=debug, но он ничего не говорит о запросах, мне нужны более подробные журналы.

Ответ 1

Из последних документов Gunicorn, на линии cmd/ script вы можете использовать:

--log-file - ("-" means log to stderr)
--log-level debug

или в файле конфигурации, который вы можете использовать:

errorlog = '-'
accesslog = '-'
loglevel = 'debug'

но нет упоминания о формате параметра, указанном в вашем вопросе:

--log-file=- 
--log-level=debug

Доступ к журналу по умолчанию для доступа - "Нет" (ref), поэтому снято в темноте, но это может объяснить, почему не принимаются подробная информация о журнале. Ниже приведен пример конфигурационного файла config docs.

Кроме того, вы можете захотеть просмотреть изменение конфигурации ведения журнала в Django.

Ответ 2

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

У меня есть script на моем сайте, который может занять 5+ минут, и вот хороший шаблон, который я использую:

  • Когда запрос сначала приходит, запускает задачу и просто возвращает HTTP 202 Accepted. Его целью является "Запрос принят для обработки, но обработка не завершена".
  • Попросите свой фронт-опрос одинаковую конечную точку (каждые 30 секунд должно быть достаточно). Пока задача не завершена, верните 202
  • В конце концов, когда он завершит возврат 200, наряду с любыми данными, которые могут понадобиться интерфейсу.

Для моего сайта мы хотим обновить данные более 10 минут. Я передаю заголовок Accept-Datetime, чтобы указать, сколько лет данных является приемлемым. Если наша локальная кешированная копия старше этого, мы запускаем цикл задачи.