Падение производительности Django IO bound с помощью gunicorn + gevent

Я работаю над приложением, связанным с IO (только простые запросы к базе данных для получения информации или ее обновления), написанным на Django. Поскольку приложение в основном использует запросы к базе данных и redis, я решил использовать gunicorn с рабочим классом async gevent, но самое странное, что хотя я запускаю gunicorn с gevent (также monkey исправил db для этой цели), я не вижу никакого прироста производительности от этого, на самом деле, как запросы/с, так и время ответа упали.

Предпринятые шаги

Для этого я сделал следующее:

  1. Установил greenlet, gevent & psycogreen, как указано в официальной документации.
  2. Пропатчил postgres с помощью psycogreen.gevent.patch_psycopg (пробовал wsgi.py, settings.py и post_fork в gunicorn), но безрезультатно.
  3. Попробовал запустить monkey.patch_all вручную gevent, тоже безрезультатно.

Это мой gunicorn.config.py:

import gunicorn

gunicorn.SERVER_SOFTWARE = ""
gunicorn.SERVER = ""
bind = "0.0.0.0:8000"
worker_class = 'gevent'
worker_connections = 1000 # Tested with different values
keepalive = 2 # Tested with different values
workers = 10 # Tested with different values
loglevel = 'info'
access_log_format = 'sport %(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"'


def post_fork(server, worker): # also tried pre_fork and on_starting
     from psycogreen.gevent import patch_psycopg

     patch_psycopg()

Result

Но приложение только стало медленнее, также обратите внимание, что я использую django_prometheus.db.backends.postgresql в качестве бэкенда db, django-redis (который использует gevent friendly redis-py) для кэша и никаких заметных других сторонних библиотек.

Тестовый метод

Для проверки и сравнения производительности я запустил приложение с несколькими различными конфигурациями и каждый раз проводил нагрузочный тест для одной конечной точки api (api просто запрашивает базу данных для списка объектов и сериализует его). Что касается технических характеристик, я запускаю приложение на своем ноутбуке Intel© Core™ i7-9750HF CPU @ 2.60GHz × 6 с 16GB памяти. Для нагрузочного теста я использую "hey" следующим образом:

hey -n 1000 -c 100 -t 0 <api>

Вот результат для синхронных и асинхронных тестов:

sync class result

Запросы/сек: 101.4230
99% за 1,6029 сек

gevent class result

Запросы/сек: 87.9190
99% за 5,2386 сек

Буду признателен, если у кого-то есть идеи, что может быть не так с моим конфигом или приложением.

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