Django REST Framework медленно работает на Gunicorn - PullRequest
0 голосов
/ 02 октября 2018

Я развернул новое приложение, созданное на Django REST Framework , работающее с Gunicorn .

Приложение развернуто на 4 разных серверах, и они прослушивают порт(8001), который используется балансировщиком нагрузки HAProxy.

К сожалению, у меня много проблем с производительностью: на обработку многих запросов уходит несколько секунд, даже 30 или 60 секунд.

Иногда даже базовая конечная точка входа (например, https://my.api/api/v2, которая в основном возвращает список доступных конечных точек) требуется 10/20 секунд для ответа .

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

И я не думаю, что проблема заключается в базе данных, потому что вызов https://my.api/api/v2 как гость (не зарегистрирован ни у какого пользователя) не должен делать никаких запросов к базе данных.

Это тест производительности, выполненный с hey (* 1028)* на базовой конечной точке без авторизации :

me@staging2:~$ hey -n 10000 -c 100 https://my.api/api/v2/

Summary:
  Total:    38.9165 secs
  Slowest:  18.6772 secs
  Fastest:  0.0041 secs
  Average:  0.3099 secs
  Requests/sec: 256.9604

  Total data:   20870000 bytes
  Size/request: 2087 bytes

Response time histogram:
  0.004 [1] |
  1.871 [9723]  |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  3.739 [0] |
  5.606 [175]   |■
  7.473 [0] |
  9.341 [35]    |
  11.208 [29]   |
  13.075 [0]    |
  14.943 [0]    |
  16.810 [0]    |
  18.677 [37]   |


Latency distribution:
  10% in 0.0054 secs
  25% in 0.0122 secs
  50% in 0.0322 secs
  75% in 0.2378 secs
  90% in 0.3417 secs
  95% in 0.3885 secs
  99% in 8.5935 secs

Details (average, fastest, slowest):
  DNS+dialup:   0.0021 secs, 0.0041 secs, 18.6772 secs
  DNS-lookup:   0.0001 secs, 0.0000 secs, 0.0123 secs
  req write:    0.0001 secs, 0.0000 secs, 0.0153 secs
  resp wait:    0.3075 secs, 0.0039 secs, 18.6770 secs
  resp read:    0.0001 secs, 0.0000 secs, 0.0150 secs

Status code distribution:
  [200] 10000 responses

Это моя конфигурация Gunicorn:

bind = '0.0.0.0:8001'
backlog = 2048

workers = 1
worker_class = 'sync'
worker_connections = 1000
timeout = 120
keepalive = 5

spew = False

daemon = False
pidfile = None
umask = 0
user = None
group = None
tmp_upload_dir = None

errorlog = '-'
loglevel = 'debug'
accesslog = '-'
access_log_format = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"'

И Gunicorn в настоящее время работает со следующей командой:

/path/to/application/bin/python3 /path/to/application/bin/gunicorn --env DJANGO_SETTINGS_MODULE=settings.production -c /path/to/application/settings/gunicorn_conf.py --user=deployer --log-file=/path/to/application/django-application-gunicorn.log --chdir /path/to/application/django-application --daemon wsgi:application

Какие тесты я могу сделать, чтобы выяснить, что вызывает мои проблемы с производительностью?

...