Приложение Django с ASGI Uvicorn увеличивает задержки в 4 раза
Мы используем приложение Django (https://github.com/saleor/saleor) для работы с нашей электронной коммерцией. Мы используем ASGI с Uvicorn в производстве с 4 рабочими. Настройка инфраструктуры -
- 4 экземпляра 4-ядерных 16 ГБ машин для размещения приложения Django (Saleor).
- Приложение развернуто с помощью docker на всех инстансах.
- 2 инстанса по 4 ядра 16 ГБ для Celery.
- Хостируемое решение PostgresSQL с одной основной и одной репликой.
Saleor использует Django и Graphene для реализации GraphQL API. Один из API - createCheckout, который занимает от 150 до 250 мс в зависимости от сущностей полезной нагрузки. При проведении нагрузочного теста с 1 пользователем API постоянно дает одинаковые задержки. Когда количество одновременных пользователей увеличивается до 10, задержки возрастают в 4 раза (1 сек - 1,3 сек). При 20 пользователях она достигает более 10 секунд.
Среднее использование процессора не превышает 60%. Отслеживая задержки, мы обнаружили, что даже при одновременных запросах 20 пользователей, основные API не занимают более 150-250 мс. Это означает, что все задержки добавляются на уровне ASGI + Uvicorn.
Не совсем понимаю, что мы здесь упускаем. С точки зрения развертывания, мы следуем стандартной установке Django + ASGI + Uvicorn для производства. Любая помощь или предложения по этому поводу будут приняты с благодарностью.
У нас были похожие проблемы, когда в настройках saleor не был включен бегунок celery. Можете ли вы убедиться, что celery подключен через redis и что он обрабатывает запросы для каждого чекаута, как ожидалось? Если нет, то saleor не может выполнять асинхронные задачи и пытается выполнять их синхронно, добавляя большое количество задержек...