上周,发表了一篇长达两年的文章的翻译, 《 WSGI服务器性能分析:第二部分》 ,其中uWSGI毫无名望地被剥夺了名声。
迫切需要重新检查测试!

目标
我已经使用uWSGI很久了,我想证明它并不像2016年测试中描述的那样糟糕。
最初,我只是想重现测试,并找出uWSGI的问题所在。
该代码中没有使用的软件包和模块的版本。
因此,要运行测试并获得相似的结果-这是行不通的。
接下来是我寻求运行测试并在图形上比较结果的追求。
应读者要求,增加了NginX单元。
步骤
wrk 4.1.0
查找规格 , 补丁 , 收集
信息已添加到readme.rd。
码头工人统计
两年来,统计数据的输出发生了变化。
添加了第二个NAME
列,这破坏了统计分析器。
为了在两年内不会遇到类似的问题,我们将使用格式化的输出:
- docker stats > "$BASE/$1.$2.stats" & + docker stats --format "{{.CPUPerc}} {{.MemUsage}}" > "$BASE/$1.$2.stats" &
因此,我们将稍微简化解析器代码。
Debian
现在最新的 debian映像是9.5版,在Dokerfile中显示:
- FROM debian + FROM debian:9.5
2016年4月, 最新版本为8.4
尽管如此,Apache几乎保持不变:现在Apache的版本为2.4.25,2016年为Apache 2.4.10。
樱桃龙卷风uwsgi gunicorn bjoern meinheld mod_wsgi
说模块已更改是没有意义的。
指定当前版本:
- RUN pip install cherrypy tornado uwsgi gunicorn bjoern meinheld mod_wsgi + RUN pip install cherrypy==17.4.0 \ + uwsgi==2.0.17.1 \ + gunicorn==19.9.0 \ + bjoern=2.2.3 \ + meinheld==0.6.1 \ + mod_wsgi==4.6.5
龙卷风在那里做什么,用于启动龙卷风的wsgi文件在哪里启动? 删除工件。
将其放在单独的requirements.txt中并不是一件坏事,但是现在就让它保持原样。
cherrypy-> cheroot.wsgi
如上所示,当前版本为17.4.0。
2016年4月,可能使用了版本v5.1.0。
并且在2017年,版本9.0中发生了更改,这影响了服务器的导入:
- from cherrypy import wsgiserver - server = wsgiserver.CherryPyWSGIServer( + from cheroot.wsgi import Server as WSGIServer + server = WSGIServer(
套接字错误:读取100500
经过上述更改后,第一个全面测试开始了。
结果很好:uwsgi每秒不会产生3 ... 200,但是却产生7500 ... 5000个请求。
但是,在对获得的图形进行详细检查时,发现wrk将所有答案都检测为阅读错误。
检查了几十个uwsgi启动键后,发现打开http1.1时没有错误:-- http-keepalive和--http11-socket 。
此外,第一个每秒提供7500 ... 5000个查询,第二个稳定为29000个!
目前uWSGI中发生了什么变化
最有可能在2016年8月使用了uWSGI 2.0.12(20151230)版本。
之后,5月, uWSGI 2.0.13发布了 。
这是一个重大事件,但是直到2018年uWSGI 2.0.16发布,它都没有解决wrk版本的性能问题:
从2.1开始向后移植HTTP / 1.1支持(--http11-socket)
这就是为什么建议将uWSGI与NginX一起使用的原因,
为何在本文的框架中如此重要,可以从2012年的这张票中了解。
为什么会这样的结果
我尝试了以下版本:
- 对于Debian 8.4,2.0.12上的这9个版本由于最新的openssl而不会使用。
- Debian 8.4和9.5的2.0.13 ... 2.0.17
但是我无法得到每秒3 ... 200个查询的糟糕结果。
请注意应用程序启动行:
uwsgi --http:9808 --plugin python2 --wsgi-file app.py --processes ...
指定插件表示从存储库而不是pip安装uwsgi。
这可能表明作者对该堆栈没有必要的经验。
因此,我承认几种可能性:
- 每个uwsgi服务器的测试都是在不同的时间分别进行的。
- uwsgi的系统版本与通过pip安装的版本之间存在一些冲突。
- 作者在2016年的wrk版本具有一些可处理http1.0的功能
- uwsgi从一组不同的选项开始
- 定制文章,天花板上的数字。
现在有什么结果
图表上的uWSGI有几种:
前两个uWSGI和uWSGIbase (v2.0.17.1)在长期测试中及其竞争对手与参数一起运行:
--http11 :9808 --processes 5 --threads 2 --enable-threads
。
--http11 :9808 --processes 5
。
如实践所示,虚拟应用测试没有质的差异。
另外,2016 uWSGI版本:
uWSGI-v2.0.12th-old和uWSGI-v2.0.12nt-old-分别在debian 8.4容器中带有和不带有线程的v2.0.12。
--http :9808 --http-keepalive --processes 5 --threads 2 --enable-threads
--http :9808 --http-keepalive --processes 5

uWSGI排名第二,但不会随着负载的增加而降低结果。
第三名是NginX单元。

在低细分市场中,即使负载增加,uWSGI-v2.0.12也是最好的。

在这里,我们看到了Unit并没有表现出最好的一面。

uWSGI和CherryPy在延迟方面无疑是赢家。

这张图片类似于2016年。

在这里,我们看到了多大的uWSGI会随着负载的增加而占用内存。
单位还线性增加内存消耗。

而新的uWSGI,gunicorn,mod_wsgi肯定会“坚持下去”,这说明了很多。

300个打开的连接后,旧的uWSGI开始急剧增加错误。

单位和CherryPy-没有错误!
Bjoern开始捐赠1000种化合物。
但是由于有了新的uWSGI怪异之处,开始了200个连接,我们得到了50个错误,并且这个数目不再增加。 这一点需要详细考虑。
所有数据都在这里收集。
所有代码更改都可以在RP中看到。
结论
uWSGI还不错,甚至还不错!
如果您不喜欢WRK测试结果,请尝试使用其他工具。