WSGI服务器的性能分析:将uWSGI重新放回原位

上周,发表了一篇长达两年的文章的翻译, 《 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有几种:
前两个uWSGIuWSGIbase (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


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


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


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


后期2018低
uWSGI和CherryPy在延迟方面无疑是赢家。



这张图片类似于2016年。



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



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



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



单位和CherryPy-没有错误!
Bjoern开始捐赠1000种化合物。
但是由于有了新的uWSGI怪异之处,开始了200个连接,我们得到了50个错误,并且这个数目不再增加。 这一点需要详细考虑。


所有数据都在这里收集
所有代码更改都可以在RP中看到。


结论


uWSGI还不错,甚至还不错!
如果您不喜欢WRK测试结果,请尝试使用其他工具。

Source: https://habr.com/ru/post/zh-CN428047/


All Articles