纯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


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

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

thinkphp 与 tornado 性能测试比较

100并发 执行100次thinkphp 报告Transactions: 10000 hits Availability: 100.00 % Elap...

tornado性能测试

测试环境:  服务器配置: 4 x Intel(R) Xeon(R) CPU E5405  @ 2.00GHz, 4G内存, 操作系统: CentOS 5.3 x86_64 nginx前端 + 4...
  • joeyon
  • joeyon
  • 2014年06月14日 17:02
  • 985

python网络爬虫(五):并发抓取

在进行单个爬虫抓取的时候,我们不可能按照一次抓取一个url的方式进行网页抓取,这样效率低,也浪费了cpu的资源。目前python上面进行并发抓取的实现方式主要有以下几种:进程,线程,协程。进程不在的讨...

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

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

python Tornado简单服务器搭建

官方网站http://old.sebug.net/paper/books/tornado/ FriendFeed使用了一款使用 Python 编写的,相对简单的 非阻塞式 Web 服务器。其...

tornado 多进程模式

https://www.douban.com/note/217901726/ 官方文档的helloworld实例中的启动方法: if __name__ == "__main__": ...

Tornado高并发处理方法

#!/bin/env python # -*- coding:utf-8 -*- import tornado.httpserver import tornado.ioloop import torn...

tornado用户指引(五)------- 一个并发的web爬虫

Queue Tornado的tornado.queue模块为基于协程的应用程序实现了一个异步的生产者/消费者模式。这与python标准库为多线程环境实现的queue模块类似。 一个协程执行到yield...

tornado 11、部署生产环境

一、后台运行  一般调试过程中我们使用python app.py运行网站,方便我们在命令行中看运行状况。 但在生产环境下我们需要后台运行网站。我们可以使用linux的nohup命令。nohup py...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:纯python实现的web: tornado性能测试以及实际使用解析
举报原因:
原因补充:

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