Django REST Framework在Gunicorn上运行缓慢

时间:2018-10-02 06:51:28

标签: django performance django-rest-framework gunicorn

我部署了在 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

我可以执行哪些测试来找出导致性能问题的原因?

0 个答案:

没有答案