Я развернул новое приложение, созданное на 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
Какие тесты я могу сделать, чтобы выяснить, что вызывает мои проблемы с производительностью?