您的位置:首页 > 编程语言 > Python开发

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

2015-07-08 14:49 1041 查看


测试环境:

服务器配置: 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: