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