纯python实现的web: tornado性能测试以及实际使用解析

转载 2015年07月08日 14:49:29

测试环境:

服务器配置: 4 x Intel(R) Xeon(R) CPU E5405  @ 2.00GHz, 4G内存, 操作系统: CentOS 5.3 x86_64

nginx前端 + 4 tornado(0.2) web process

tornado: http://www.tornadoweb.org (已被墙)

测试场景:

http get请求,服务器端直接返回”hello world”

代码及nginx配置:

main.py:

 

#!/usr/bin/python
# -*- coding: utf-8 -*-
“””web main”””

from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from tornado.web import RequestHandler, Application, authenticated

#from rockps.auth import AuthHandler

class MainHandler(RequestHandler):
def get(self):
self.write(“hello world”)

settings = {
}

application = Application([
(r”/”, MainHandler),
], **settings)

if __name__ == “__main__”:
http_server = HTTPServer(application)
http_server.listen(8081)
IOLoop.instance().start()

 

nginx.conf:

 

user root;
worker_processes 1;

error_log /var/nginx_error.log;
pid /var/run/nginx.pid;

events {
worker_connections 51200;
use epoll;
}

http {
# Enumerate all the Tornado servers here
upstream frontends {
server 127.0.0.1:8081;
server 127.0.0.1:8082;
server 127.0.0.1:8083;
server 127.0.0.1:8084;
}

#include /etc/nginx/mime.types;
default_type application/octet-stream;

access_log /var/log/nginx/access22.log;

keepalive_timeout 65;
proxy_read_timeout 200;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
gzip on;
gzip_min_length 1000;
gzip_proxied any;
gzip_types text/plain text/html text/css text/xml
application/x-javascript application/xml
application/atom+xml text/javascript;

# Only retry if there was a communication error, not a timeout
# on the Tornado server (to avoid propagating “queries of death”
# to all frontends)
proxy_next_upstream error;

server {
listen 8085;

# Allow file uploads
client_max_body_size 50M;

location ^~ /static/ {
root /var/www;
if ($query_string) {
expires max;
}
}
location = /favicon.ico {
rewrite (.*) /static/favicon.ico;
}
location = /robots.txt {
rewrite (.*) /static/robots.txt;
}

location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://frontends;
}
}
}

 

测试结果:

 

点击率可以超过7000,但后面再加用户开始往下掉,请求开始出错,最合适的时候大概3500个用户

持续运行后,连接数稳在1万。

Python的web开发框架这么多,实在眼花缭乱,Tornado相比来说还算个新东西,文档也很少,是哪些特性吸引了知乎工程师呢

Tornado异步非阻塞的I/O模型的确让人耳目一新,Tornado的优势主要在于对大量Comet长轮询连接的维护上。这也是FriendFeed开发Tornado的原因—–因为FriendFeed需要实时更新Timeline,而Comet又是目前最好,最流行的方法。由于知乎也有大量长轮询连接需要维护,所以选择Tornado也就在情理之中了。
但是我们也要看到,Tornado不是万金油,由于Tornado的WEB服务器为单线程,一个Request如果阻塞了I/O,那么这个进程将一直挂起,既无法接受新的Request,也无法Finish正在阻塞的其它Request。虽然可以Spawn多个Tornado进程,但是进程这种重量级的东西,Spawn太多会消耗大量的内存资源。这种感觉很像PHP的FastCGI进程那种味道。所以如果是会阻塞I/O的Request一般都是利用Tornado内置的异步HTTP Client交给其它动态后端来做。
所以Tornado在生产中一般前面都要包一层nginx做反向代理,用nginx来做静态文件等大数据量的I/O操作。Tornado的I/O时间实在是太金贵了,在这上面耗不起。

@刘连响 提到的那个测试(kb.cnblogs.com/a/1591500/)在实际应用中并没有什么价值。因为实际应用中必然有逻辑处理,逻辑处理必然要阻塞I/O,这会使Tornado的性能大幅下降。测试可在网页代码self.write(“hello world”)前加一句time.sleep(0.01),假设每个Request阻塞I/O 10毫秒,再测试一下性能。
至于你提到的Tornado文档少的问题,我觉得你可以抽空阅读一下Tornado的代码,毕竟是个轻量级框架,代码不多,但是注释却很详细,很容易看懂。请记住,代码永远是最好的文档


http://blog.chedushi.com/archives/2033


相关文章推荐

小测几种python web server的性能

因为换了nginx就不再使用mod_wsgi来跑web.py应用了,现在用的是gevent-wsgi,效果还不错。但还是想试试别的,比如传说中超级猛的meinheld什么的。软硬件环境硬件:一台04年...
  • Raptor
  • Raptor
  • 2012-10-03 19:53
  • 11489

Python Tornado 使用经验

看原文 最近在做一个网站的后端开发。因为初期只有我一个人做,所以技术选择上很自由。在 web 服务器上我选择了Tornado。虽然曾经也读过它的源码,并做过一些小的 demo,但毕竟这是...

纯python实现的web: tornado性能测试

测试环境:  服务器配置: 4 x Intel(R) Xeon(R) CPU E5405  @ 2.00GHz, 4G内存, 操作系统: CentOS 5.3 x86_64 nginx前端...
  • huithe
  • huithe
  • 2011-11-07 17:30
  • 1815

对比Tornado和Twisted

做Python的人,一定知道两个性能优秀的异步网络框架:tornado,和twisted。那么,这两个著名的框架,又有什么异同呢? 我特意花了一些时间,分析了一下,如果有误,请大家指正: 下面是基...

tornado 异步模型学习和压测总结

压测工具、文档、代码请参考   https://github.com/robertzhai/python/tree/master/tornado-basic 1.异步下载天气信息,@tornado....

golang年度使用总结,简洁不简单

时间过得好快,从比较正式的使用go语言,已经差不多一年了。这期间,go从1.5发展到了1.7,自己因为兴趣+责任,来到了新的团队,再次从事曾经非常熟悉的开发工作,充实。在玩scala之后,用了go语言...

python常用web框架性能测试(django,flask,bottle,tornado)

测了一下django、flask、bottle、tornado 框架本身最简单的性能。对django的性能完全无语了。 django、flask、bottle 均使用gunicorn+gevent启...

python-web加载性能测试(初级)

首先不得不承认这只是一种很基础的web性能加载测试,因为之前一直没有专业的学过应该如何测试。原因是我们公司的网站快完成了,但是感觉打开的速度很慢啊,后来自己写了一个简单的python脚本主要模拟对we...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)