Blog地址:https://www.jiangdog.com/blog/tornado-motor-ab
背景
在利用Python开发web项目时,可以使用pymongo
、mongoengine
等库连接mongodb。当使用Tornado
框架时,为了利用其异步的特性,还可以使用motor
来作为数据库驱动。无论是mongoengine
还是motor
实际上应该都是对pymongo
的封装。
mongoengine
提供了ORM映射的功能,将Document
封装成类,通过实例的方法来操作Document
。motor
能够和Tornado
或协程配合使用,异步调用提升性能。
参考网上的文章并自己写了一些简单的代码来测试在使用Tornado
框架下,这三种数据库驱动的性能。
测试工具
使用ab
来做这次简单测试。
- CentOS下安装可以参考:How to install Apache Benchmark on CentOS?,实际上就是两条命令
yum provides /usr/bin/ab
yum install httpd-tools
- windows下安装:https://www.apachehaus.com/cgi-bin/download.plx 下载相应版本的apache安装包,并解压安装到指定目录。
ab基本参数介绍:
- -n 指定总共发起的请求数量。
- -c 同时发起的请求数量,并发请求数。
- -p 指定post方式提交的数据的文件,文件内容格式为
a=1&b=2
。 - -T 指定content-type
测试服务器配置及环境
服务器是利用了阿里云的基本的云服务器ECS实例:
- 1核 1GB 带宽1Mbps
- CentOS 7.2
mongodb和测试web服务都是安装或部署在该实例上:
- mongodb 3.4
- python 3.5.1
- tornado 4.4.2
- pymongo 3.6.0
- mongoengine 0.15.0
- motor 1.1
编写简单的服务端代码并利用ab进行测试
pymongo:
#!/usr/bin/python
# -*- coding:utf-8 -*-
import tornado.web
import tornado.gen
from pymongo import MongoClient
from tornado.httpserver import HTTPServer
class MessageListHandler(tornado.web.RequestHandler):
def get(self):
message_list = self.settings['db'].messages.find().sort([('_id', -1)]).limit(50)
self.render('msg_list.html', message_list=message_list)
class MessageAddHandler(tornado.web.RequestHandler):
def get(self):
self.render('msg_add.html')
def post(self):
msg = self.get_argument('msg')
res = self.settings['db'].messages.insert_one({
'msg': msg})
self.redirect('/message/list/')
class Application(tornado.web.Application):
def __init__(self):
handlers