如何在处理程序中对龙卷风处理程序进行基准测试?

时间:2014-07-21 23:40:32

标签: python tornado benchmarking

我编写了一个非常简单的龙卷风处理程序,用于测试远程部署的某些设备的上传速度。主要测试将在所述远程设备中运行(感谢cURL),我可以获得有关上传所用时间的详细报告。

Tornado处理程序唯一真正要做的就是接受一个具有多个字节的主体(这就是它)

class TestUploadHandler(tornado.web.RequestHandler):
   def post(self):
        logging.debug("Testing upload")
        self.write("")

所以,上面的代码有效,但它有点......几乎可耻: - D 为了让它多一点...... showable ,我我想展示一些更有用的日志,比如请求上传的时间或类似的东西。我不知道......有点多汁的东西。

有没有办法测量Tornado处理程序本身的上传速度?我已经搜索了如何对Tornado处理程序进行基准测试,但我似乎能够找到的是不同Web服务器之间的性能比较。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

嗯,计算上传本身花了多长时间非常简单:

import time

class TestUploadHandler(tornado.web.RequestHandler):
   def post(self):
        logging.debug("Testing upload")
        start = time.time()
        self.write({})
        end = time.time()
        print "Time to write was {} seconds.".format(end-start)

如果您想在多个处理程序中使用它,您还可以将计时代码移动到装饰器:

from functools import wrap
import time

def timer(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start  = time.time()
        ret = func(*args, **kwargs)
        end = time.time()
        print 'Function took {} seconds'.format(end-start)
        return ret 
    return wrapper

class TestUploadHandler(tornado.web.RequestHandler):
   @timer
   def post(self):
        logging.debug("Testing upload")
        self.write({})

修改

鉴于您正在尝试从服务器的角度衡量上传到服务器的时间,上述方法无法正常工作。看起来龙卷风最接近的是使用@tornado.web.stream_request_body装饰器,以便您将请求体作为流接收:

@tornado.web.stream_request_body
class ValueHandler(tornado.web.RequestHandler):
    def initialize(self):
        self.start = None

    def post(self):
        end = time.time()
        print self.request
        if self.start:
            print("Upload time %s" % end-self.start)
        self.write({})

    def data_received(self, data):
        if not self.start:
            self.start = time.time()

当收到请求正文的第一个块时,我们会节省时间(self.start)。收到完整正文后,我们会立即调用post方法,因此我们会获得end

但是我遇到了使大文件上传正常工作的问题。但它似乎适用于小文件(100MB以下)。