Django 这性能,也慢的太夸张了.......

2020-03-16 19:16:11 +08:00
 black11black

如题,前几天看论坛讨论帖都觉得 django 不错,学前先测了测性能。。

配置:(平台 ubuntu )

django-admin startproject helloworld
# 编写一个 echo,访问 127.0.0.1:8080 回复"hello world"
gunicorn HelloWorld.wsgi -b 127.0.0.1:8080 -w 9

压测:

wrk -t16 -c500 -d10 http://127.0.0.1:8080

得到数据:

单进程 并发 794.46r/秒 ,平均延迟 140.74ms 九进程 并发 7700r/秒,平均延迟 28ms

虽然之前就想到 django 不会很快,毕竟 py 写服务性能也没那么重要,但是这也慢的太太太太太夸张了吧。。本地 echo 居然只有 700qps 的性能,本地 echo 延迟 0.1 秒,这。。。。。。。。。

对比一下 py 框架现在异步框架性能单线程 express 也能挑战一下的,就算 wsgi 跑的 flask,fork 的 rps 怎么也有两万,我用不到那么快,但是你也别慢的太夸张啊。。。。本地延迟这么高,干点啥畏首畏尾。。。。

是我哪里配置错了吗?

19440 次点击
所在节点    Django
94 条回复
black11black
2020-03-16 19:17:38 +08:00
Running 10s test @ http://127.0.0.1:8080
16 threads and 500 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 45.53ms 149.08ms 1.74s 95.35%
Req/Sec 529.59 279.84 1.80k 68.10%
77017 requests in 10.03s, 16.89MB read
Socket errors: connect 0, read 0, write 0, timeout 20
Requests/sec: 7677.28
Transfer/sec: 1.68MB


Running 10s test @ http://127.0.0.1:8080
16 threads and 500 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 140.74ms 187.12ms 1.75s 88.36%
Req/Sec 104.58 98.50 336.00 74.31%
8123 requests in 10.22s, 1.78MB read
Socket errors: connect 0, read 0, write 0, timeout 10
Requests/sec: 794.46
Transfer/sec: 178.44KB
assad
2020-03-16 19:25:03 +08:00
上个 Swoole
black11black
2020-03-16 19:33:37 +08:00
@assad ???????
yzongyue
2020-03-16 19:38:03 +08:00
我猜单线程比较慢的原因是 gunicorn 默认 syncworker,这时候请求一个处理完了才会处理下一个,并发太高了大部分时间都在排队
可以考虑把 worker 改成 gevent or meinheld
Qzier
2020-03-16 19:40:13 +08:00
搭配 meinheld 能快不少。
black11black
2020-03-16 19:50:59 +08:00
@yzongyue 我接触异步已经是 py3.4 以后的事了,一直是原生异步党,一直对猴子补丁观感不好,能不用尽量不用....不过好像 django 也没啥别的可用的,用 gevent 以后单线程 1500qps,fork 模式 10500qps,感觉勉强达到个 40 分水准吧。。。能用级别。
延迟还是居高不下,不是我说,linux 环境里本地 echo 还能跑到 2、300 毫秒的延迟实在是太夸张了。。。。facebook 以前怎么活下来的
springz
2020-03-16 19:54:07 +08:00
比 Laravel 好多了
black11black
2020-03-16 19:55:17 +08:00
@Qzier meinheld 确实比 gevent 快,单进程 2800,多进程 21424,勉强有个现代服务器的水准。。。。大佬知不知道这一套工具链 pypy 支不支持
cabing
2020-03-16 20:00:02 +08:00
但是处理不需要并发的业务撸的快。
black11black
2020-03-16 20:16:56 +08:00
@black11black pypy 测了一下,meinheld .so 载入错误跑不起,gevent,三分钟烤鸡后单线程 4275,多线程 11000,表现不如 cpython,多进程表现比较奇怪。
yuyueMJ
2020-03-16 20:24:07 +08:00
追求并发可以试下另一个 python 框架 falcon,自古两者难全。
black11black
2020-03-16 22:03:16 +08:00
@yuyueMJ 倒不是追求并发,没那么多高 PV 的业务,只是作为程序员天然地追求,性能稍微高一点,可以解锁很多适用场景。每秒五六百的 echo 数,流量几百 KB 基本属于完全不及格的水准。只是想学习前先了解一下 django 的性能如何。总的来说目前的看法是业务代码界的扛把子基本是性能的倒数第一,太尴尬了。

异步新框架性能也都不错,没什么难两全的,只是生态不好而已。
whoami9894
2020-03-16 22:15:45 +08:00
Django 和 flask 都是慢的真实,sanic 和 tornado 也好不到哪去。虽说是 io 密集操作,语言本身性能不是非常重要,但就是被隔壁 PHP7 吊起来打。原来看过有个 japronto 标榜的很强,基本都是 c 写的,但版本号还没上 0.2
vicalloy
2020-03-16 22:56:50 +08:00
异步 io 是为了解决 io 性能瓶颈的。我猜对于大多应用 Django 虽然慢,但瓶颈不在 io 这部分。
所以通常情况下不用这么介意这部分的性能。
black11black
2020-03-16 23:43:56 +08:00
@whoami9894 japronto 和 vibora 都是 demo 版本,写的时候异步 api 还没稳定,后来也没更了,sanic 和 tornado 不是一个量级的框架,没什么可讨论的
black11black
2020-03-16 23:46:58 +08:00
@vicalloy 对于绝大多数服务,你对 http 的本地 echo 的期望延迟应该在 1ms 左右,很难想象 100ms 你该如何构建应用。就像比如你搭建一些基于 TCP 的服务,单次 echo 在 500 微秒,你可以加一些控制协议实现整套流程在毫秒级别,反之如果单次 echo 很高,你加一些协议之后单次 echo 都要到秒级了,还怎么敢用
ClericPy
2020-03-16 23:48:21 +08:00
点进来以前以为会看到 channels 的...
black11black
2020-03-17 00:05:34 +08:00
@ClericPy 纯新,不熟悉 django。channels 好像以前听说过是个 django 版的异步项目?百度查了查怎么是关于 websocket 的
luckyrayyy
2020-03-17 00:06:35 +08:00
你试过 Java 的嘛……
sagaxu
2020-03-17 00:21:26 +08:00
django 空项目会装 7 个 middleware,先把它们去掉再测性能。另外可以试试 uwsgi,是不是比 gunicorn 更快。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/653352

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX