我部署了在 Django REST Framework 上与 Gunicorn 一起运行的新应用程序。
该应用程序部署在4台不同的服务器上,它们正在侦听HAProxy负载平衡器占用的端口(8001)。
不幸的是,我遇到了许多性能问题:许多请求要花几秒钟才能被送达,甚至需要30或60秒。
有时甚至是基本输入端点(例如https://my.api/api/v2,它基本上会返回可用端点的列表)需要10/20秒才能响应。>
我不认为问题出在负载均衡器上,因为我有延迟可以通过客户端直接连接到任何后端服务器,因此绕过了负载均衡器。
我认为问题不在于数据库,因为以访客身份(未用任何用户登录)对https://my.api/api/v2的调用不应进行任何数据库查询。
这是在未经授权的基本端点上用嘿(https://github.com/rakyll/hey)进行的性能测试:
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
我可以执行哪些测试来找出导致性能问题的原因?