纯python实现的web: tornado性能测试以及实际使用解析
来源:互联网 发布:美国零售数据公布时间 编辑:程序博客网 时间:2024/06/10 08:25
测试环境:
服务器配置: 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:
# -*- 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:
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: tornado性能测试以及实际使用解析
- 纯python实现的web: tornado性能测试
- 纯python实现的web: tornado性能测试
- python常用web框架性能测试(django,flask,bottle,tornado)
- Python实现WEB实际测试方法介绍
- [Python--]tornado.web.StaticFileHandler 实现文件下载
- tornado性能测试
- 利用ab测试工具对Tornado下使用mongodb驱动的性能简单测试分析
- Python的tornado框架性能研究
- Python:FriendFeed的Tornado Web Server
- Python:FriendFeed的Tornado Web Server
- 非阻塞的Python web框架tornado
- python web 框架tornado-4.4.2 安装测试
- 玩蛇记-使用tornado构建高性能Web应用
- 使用 Tornado 创建简单的 Web 服务
- python基于protobu+websocket+tornado实现多种二进制协议消息的接收发送和解析demo
- nginx+tornado与nginx+go的性能测试
- PythonStock(3):使用python tornado web进行开发
- TCP Retransmission
- C++管理指针成员
- 通过抽象工厂模式再理解java的上转型
- linux中的sleep
- C++顺序容器vector、deque、list
- 纯python实现的web: tornado性能测试以及实际使用解析
- uart过来数据不够,组包
- 软件开发过程学习笔记(六)之测试报告模板
- 单例模式
- Oracle高版本dmp导入到低版本
- 数字信号处理公式变程序(四)——巴特沃斯滤波器(下)
- abstract factory(抽象工厂) 对象创建型模式
- 类String的构造函数、析构函数和赋值函数
- 70天复习一次通过信息系统项目管理师考试经验和心得