作者:雪中侠客79_932 | 来源:互联网 | 2014-05-28 15:41
因为换了nginx就不再使用mod_wsgi来跑web.py应用了,现在用的是gevent-wsgi,效果还不错。但还是想试试别的,比如传说中超级猛的meinheld什么的。软硬件环境硬件:一台04年初购置的IBMX235服务器,CPU为Xeon2.4G两颗,内存1G,100M网卡。软件:Ubuntu
因为换了nginx就不再使用mod_wsgi来跑web.py应用了,现在用的是gevent-wsgi,效果还不错。但还是想试试别的,比如传说中超级猛的meinheld什么的。
软硬件环境
硬件:
一台04年初购置的IBM X235服务器,CPU为Xeon 2.4G两颗,内存1G,100M网卡。
软件:
Ubuntu Server 10.04 LTS
Apache 2.2.14
Nginx 0.7.65
Python 2.6.5
web.py 0.37
mako 0.7.2
sqlalchemy 0.7.8
gevent 0.13.7
gunicorn 0.14.6
meinheld 0.4.15
测试代码
有五个版本,分别是:
最基本的WSGI helloworld
def application(environ, start_response):
status = '200 OK'
resp = "Hello world!"
resp_headers = [('Content-type','text/plain;charset=utf-8')]
start_response(status, resp_headers)
return [resp]
最基本的web.py your IP
class yourip:
def GET(self):
return "Your IP is : %s" % web.ctx.ip
加了mako模板的web.py
class onlymako(BaseHandler):
@expose("yourip")
def GET(self):
return dict(yourip=web.ctx.ip)
加了数据库的web.py
class onlydb:
def GET(self):
created = web.ctx.provider.once_access(web.ctx.ip)
return "You have logged : %s" % created
和同时加了数据库和mako模板的web.py —— 这也是最接近实际应用的情况
class makodb(BaseHandler):
@expose("index")
def GET(self):
created = web.ctx.provider.once_access(web.ctx.ip)
return dict(created=created)
测试目标
五种运行环境:
web.py的测试环境app.run
web.py+gevent-WSGI
gunicorn默认(sync)
gunicorn+gevent
gunicorn+meinheld
gunicorn使用 -w 4
参数,经实际比较过,这个参数并不能有效增加rps,但在高并发测试情况下可以在一定程度上减少失败率。
测试方式
ApacheBench 2.3(Ubuntu Desktop 12.04)
RPS测试参数为 -n 200 -c 22 测五次取rps平均值。
之所以用这样比较小的参数,是因为再高了,其中某些测试就通不过了。
测试结果
RPS测试
|
WSGI helloworld
|
Web.py YourIP
|
Web.py+Mako
|
Web.py
+SQLAlchemy
(SQLite)
|
Web.py+Mako
+SQLAlchemy
(SQLite)
|
Web.py
+SQLAlchemy
(Postgresql)
|
Web.py+Mako
+SQLAlchemy
(Postgresql)
|
Web.py app.run
|
无
|
130
|
93
|
75*
|
45*
|
59
|
40
|
web.py+gevent
|
无
|
422
|
130
|
82
|
54
|
74
|
53
|
gunicorn default
|
854
|
439
|
136
|
93
|
66
|
90
|
62
|
gunicorn+gevent
|
695
|
291
|
115
|
74
|
56
|
78
|
56
|
gunicorn+meinheld
|
3565
|
682
|
160
|
84
|
65
|
98
|
64
|
其中加了“*”的数字发生了数据库错误,仅供参考。
另外,用同样的参数测了一下Apache2处理静态文件的rps为:1780,nginx为:2951。
===附加的分割线===
再附加一个在我的Atom小服务器上的部分测试结果:
Nginx处理静态文件的rps为:4000左右。
WSGI hello
world测试:gunicorn+meinheld约为:3800。gunicorn+gevent约为:1100。gunicorn
default约为:1400。
your
IP测试:gunicorn+meinheld约为:1000。gunicorn+gevent约为:450。gunicorn
default约为:700。
相比之下这个Atom小机器比IBM服务器猛好多。硬件发展速度真是太快了。
附软硬件环境:
Atom D525 1.6G双核,2GRAM,FreeBSD 9,Nginx 1.2.2,Python
2.7.3,其它同IBM服务器。
并且在这个Atom机器上
-w 参数对rps有明显贡献…看来是因为老服务器的问题才效果不明显,只是不确定是硬件问题还是OS问题。
结论
meinheld的确猛,处理最简单的WSGI比Apache2处理静态文件还要猛一倍,跟Nginx相当甚至更强。
app.run的rps比预想的要好很多,只是并发数真不行,-c 参数略加大就会出现大量失败测试。
gevent已经足够好了,不过居然比gunicorn的sync模式还慢真是有点不科学啊。
gunicorn的好处在于管理方便,并且可以灵活使用各种work_class,特别奇怪的一点是居然sync模式也这么快。
web.py的性能影响还是很明显的。
模板的影响也很明显——mako已经算是很快的模板了,真不知道用那些KID之类很慢的模板会是什么效果。
数据库的影响更大,不过pgsql的性能居然能跟sqlite差不多,真不知道是sqlite太慢还是pgsql太快…
本来前一阵我刚听说OpenResty这货的时候还是很有兴趣的,但是现在看到meinheld的表现以后,觉得还是算了吧,毕竟用OpenResty还要去学Lua…现在要学的东西太多,能用Python搞定的事情就不去麻烦Lua了。