1

在Centos下对Tornado的性能进行测试(Stress Testing)

 1 month ago
source link: https://v3u.cn/a_id_89
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

在Centos下对Tornado的性能进行测试(Stress Testing)

首页 - Python/2019-06-04
在Centos下对Tornado的性能进行测试(Stress Testing)

    在之前的一篇文章中,我们在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
20190604052300_12154.jpg

    可以看到,每秒处理近800个请求毫无压力,和Django根本就不是一个量级的,对于高并发问题,我们通常用C10K这一概念来描述。C10K—— Concurrently handling ten thousandconnections,即并发10000个连接。对于单台服务器而言,根本无法承担,而采用多台服务器分布式又意味着高昂的成本,django并发数200左右,而Tornado能承担近800左右,无疑,在成本上节约了很多。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK