Django/Gunicorn Запрос занимает много времени для начала обработки представления

Я ищу способы оптимизации времени запросов моего приложения и проделал большую работу по внедрению кэширования, уменьшению дублирующих вызовов БД и т.д. Однако, глядя на наши инструменты мониторинга, я вижу, что иногда кажется, что запрос занимает чрезвычайно много времени, чтобы даже начать обработку представления. Интересно, есть ли способ объяснить это? Это затрудняет установление последовательного SLO для запросов API.

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

  • Django = 3.2.15
  • Django Rest Framework = 3.13.1
  • gunicorn = 20.0.4

Команда "Старт"

      "gunicorn",
      "--workers=4",
      "--threads=8",
      "--bind=0.0.0.0:8000",
      "--worker-class=uvicorn.workers.UvicornWorker",
      "webapp.asgi:application"

Это работает на ECS с балансировкой нагрузки между 2 экземплярами c6g.xlarge (4 vCPU). enter image description here

Это может быть результатом очереди потоков unicorn, в то время как все потоки заняты обработкой вещей.

Ваша конфигурация такова

"--workers=4", "--threads=8",

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

Попробуйте увеличить эти числа и проверьте текущую нагрузку на ваш сервер.

Я бы предложил использовать возможности потоков, которые предлагает python.

Поэтому вместо того, чтобы запускать каждую задачу на вашем основном потоке, передайте задачи подпотокам основного потока, и это должно оставить ваш основной поток всегда готовым принять больше запросов, пока он не увязнет в вашей вычислительной мощности.


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

Вам следует отслеживать с помощью инструмента трассировки, сколько времени занимает обработка запроса при низком ~ нормальном трафике, и принимать решение на основе этих данных

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

Надеюсь, что вы найдете это полезным!

Вернуться на верх