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

Posted

技术标签:

【中文标题】如何在处理程序中对龙卷风处理程序进行基准测试?【英文标题】:How can I benchmark a tornado handler within the handler? 【发布时间】:2014-09-12 15:20:57 【问题描述】:

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

Tornado 处理程序真正要做的唯一一件事就是接受一个包含多个字节的主体(差不多就是这样)

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

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

是否有任何方法可以测量 Tornado 处理程序本身的上传速度?我在 Google 上搜索了如何对 Tornado 处理程序进行基准测试,但我似乎只能找到不同 Web 服务器之间的性能比较。

提前谢谢你。

【问题讨论】:

您是否只是想测量post 方法需要多长时间才能完成? 是的...不会让处理程序看起来如此...空虚和荒凉的东西。一些有用的指标会很棒(例如请求需要多长时间):-) 【参考方案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 最接近的方法是使用 @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方法一收到完整的body就会被调用,所以我们得到end

不过,我在上传大文件时遇到了问题。不过,对于较小的文件(小于 100MB)似乎可以正常工作。

【讨论】:

我可能会使用这个。装饰器是对答案的一个很好的补充。您是否碰巧知道handlerrequest 或诸如此类的某处是否隐藏了更多 报告?我问是因为(在客户端)cURL 提供了一个很好的报告(请求何时开始,DNS 解析需要多长时间,上传本身需要多长时间......)我想知道是否有类似的东西在服务器端(我完全不知道)类似于...处理程序何时实例化处理完整上传流需要多长时间... 类似的事情?谢谢 @BorrajaX RequestHandler 没有类似的东西,据我所知。但是,如果您使用tornado.httpclient 发送请求,则返回的HTTPResponse 对象将具有time_info 属性,这是诊断时间的字典,它专门将curl.haxx.se/libcurl/c/curl_easy_getinfo.html 站点作为可用时间的参考. 等等,一旦调用了处理程序,服务器中的所有主体不都已经存在了吗?这是否意味着endstart 之间的差异几乎为零? @BorrajaX 是的,你是对的;我误解了你试图做的事情。我更新了我的答案,以展示如何尝试从 Tornado 的角度测量上传时间,但我不确定它的准确度。 赞成,因为我正在寻找一种方法来衡量对服务器的 GET/POST 请求需要多少时间来处理。

以上是关于如何在处理程序中对龙卷风处理程序进行基准测试?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spark 控制台中对性能进行基准测试?

在 C# 中对小代码示例进行基准测试,这个实现可以改进吗?

在 Python 中对运行时间进行基准测试

对具有许多同时请求的 django 应用程序进行基准测试,例如 ab

在 JMH 中对具有不同值的循环进行微基准测试

几款优秀的Linux基准测试工具