【发布时间】:2022-06-15 18:47:23
【问题描述】:
我实现了一个小型 Django 应用程序 (v4.0.4),其中包含一个 REST API — 用于检索一些数据的 GET 方法。接下来,我想使用 gunicorn+uvicorn 运行该项目,因为我在一篇文章中看到了比正常部署更多的基准性能。所以我决定使用wrk 工具来获得自己的基准。
这是我得到的:
| Command | Webserver | Protocol | Result (Req/Sec) |
|---|---|---|---|
python manage.py runserver 0.0.0.0:8000 |
Django Default | wsgi | 13.06 |
gunicorn bitpin.wsgi:application --bind 0.0.0.0:8000 -w 2 |
gunicorn | wsgi | 45.20 |
gunicorn bitpin.asgi:application --bind 0.0.0.0:8000 -w 2 -k uvicorn.workers.UvicornWorker |
uvicorn+gunicorn | asgi | 22.17 |
但是,上面的结果证明了其他东西!
是因为当我想使用asgi 时我必须使用async 方法来代替我的API 视图吗?如果是这样,我如何将 Django REST API 视图更改为 async 一个?
或者我可能错过了一些配置?
[注意]:
-
我使用以下命令运行基准测试:
wrk -t4 -c11 -d20s -H "Authorization: Token xxx" http://127.0.0.1:8000/api/v1/content/ -
值得一提的是,在这次测试中,我使用了两个workers
gunicorn,很明显workers越高,性能越好。
【问题讨论】:
-
如果您在 kubernetes 环境中将其作为启用了 HPA(水平自动缩放)的微服务运行,那么您可以使用 django 默认服务器。 kubernetes 将根据负载保持自动缩放(向上或向下),它将添加或减少 pod(如更多 uvicorn 工作人员),这将是动态的。 gunicorn/uvicorn 工人编号在启动时是固定的,不能即时更改。您很可能在谈论物理服务器,但我想如果其他人面临这种困境,我还是会在 k8s 环境中留下我的答案。
标签: django gunicorn wsgi uvicorn asgi