在Centos下对Tornado的性能进行测试(Stress Testing)
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
在之前的一篇文章中我们在1g1核的惨淡硬件环境下对 uwsgi + django 和 gunicorn+ django 的后端服务进行性能测试得出结论单台django在简单读库操作下只能抗住大约200左右的并发:在Centos下使用Siege对Django服务进行压力测试
这一次我们在相同的背景下对三大框架中以性能著称于世的Tornado进行并发测试看看它的性能到底有多高。
Tornado是一个用Python编写的异步HTTP服务器同时也是一个web开发框架。
Tornado 优秀的大并发处理能力得益于它的 web server 从底层开始就自己实现了一整套基于 epoll 的单线程异步架构。
那么到底啥是特么的异步非阻塞呢
同步、异步编程差异
你打电话问书店老板有没有《python开发》这本书如果是同步通信机制书店老板会说你稍等”我查一下"然后开始查啊查等查好了可能是5秒也可能是一天告诉你结果返回结果。
而异步通信机制书店老板直接告诉你我查一下啊查好了打电话给你然后直接挂电话了不返回结果。然后查好了他会主动打电话给你。在这里老板通过“回电”这种方式来回调。
阻塞与非阻塞的差异
还是你打电话问书店老板有没有《python开发》这本书你如果是阻塞式调用你会一直把自己“挂起”直到得到这本书有没有的结果
如果是非阻塞式调用你不管老板有没有告诉你你自己先一边去干别的了 当然你也要偶尔过几分钟check一下老板有没有返回结果。
大部分Web应用都是阻塞性质的也就是说当一个请求被处理时这个进程就会被挂起直至请求完成比如Django,而Tornado的思想是当我们在等待结果的时候不阻塞转而我们给框架一个回调函数作为参数让框架在收到结果的时候通过回调函数继续操作。这样服务器就可以被解放去接受其他客户端的请求了。
首先安装Tornado
pip3 install tornado
编写main.py
import tornado.ioloop
import tornado.web
import pymysql
db = pymysql.Connection(host='127.0.0.1', database='md', user='root', password='mysql',charset='utf8')
class MainHandler(tornado.web.RequestHandler):
def initialize(self,db):
self.db = db
def get(self):
cur = db.cursor()
cur.execute("select id from news where id = 1 ")
res = cur.fetchone()
print(res)
self.write("Hello, world")
def make\_app():
#路由
return tornado.web.Application(\[
(r"/", MainHandler,dict(db=db)),
\])
if \_\_name\_\_ == "\_\_main\_\_":
app = make\_app()
app.listen(8000)
tornado.ioloop.IOLoop.current().start()
逻辑很简单从数据库中读取一条数据通过接口返回服务监听8000端口
运行服务
python3 main.py
Tornado不同于Django它本身是框架同时也是一款服务器所以不需要uwsgi这种网络模型服务。
开启压测命令每秒255个请求持续一分钟
siege -c255 -t60S -v -b 127.0.0.1:8000
可以看到每秒处理近800个请求毫无压力和Django根本就不是一个量级的对于高并发问题我们通常用C10K这一概念来描述。C10K—— Concurrently handling ten thousandconnections即并发10000个连接。对于单台服务器而言根本无法承担而采用多台服务器分布式又意味着高昂的成本django并发数200左右而Tornado能承担近800左右无疑在成本上节约了很多。