У меня есть приложение Django. Он использует Nginx, сидит на экземпляре EC2 и использует балансировщик нагрузки AWS перед этим. Nginx обслуживает статические файлы прямо с диска, а также использует proxy_pass
для всего остального для маршрутизации на сервер приложений WSGI.
Это выбор сервера WSGI, для которого я вижу удивительные результаты.
Когда я использую сервер разработки Django, ./manage.py runserver 0.0.0.0:8000
, среднее время ответа для итогового HTML-документа при /
составляет 60-70 мс :
Blocked: 1 ms
DNS resolution: 0 ms
Connecting: 0 ms
TLS setup: 0 ms
Sending: 0 ms
Waiting: 68 ms
Receiving: 0 ms
Теперь, когдаЯ заменяю его «правильным» сервером Gunicorn, среднее время ответа на тот же запрос / документ теперь составляет 1800 мс !
Blocked: 1 ms
DNS resolution: 0 ms
Connecting: 0 ms
TLS setup: 0 ms
Sending: 0 ms
Waiting: 1859 ms
Receiving: 0 ms
Здесь я запускаю Gunicorn как:
gunicorn \
--log-level DEBUG \
--bind 0.0.0.0:8000 \
--workers 4 \
project.wsgi
То же самое относится и к uwsgi, со средним временем отклика 1850 мс :
uwsgi --chdir=/home/ubuntu/project \
--module=project.wsgi:application \
--env DJANGO_SETTINGS_MODULE=project.settings \
--master \
--http-socket 0.0.0.0:8000 \
--processes=5 \
--max-requests=5000 \
--vacuum
И, в частности, время отклика не меняетсянезависимо от того, намного ли больше число работников, например, --workers 64
(и я бы этого не ожидал, поскольку речь идет не о параллельных запросах).
Что, вероятно, объясняет эту разницу? Я влюбился в какую-то распространенную ловушку?
Версии:
$ python -m django --version
2.2.6
$ gunicorn --version
gunicorn (version 19.9.0)
$ nginx -v
nginx version: nginx/1.14.0 (Ubuntu)