如何在处理器内部基准测试一个龙卷风处理器?
我写了一个非常简单的 Tornado 处理器,目的是测试一些远程设备的上传速度。主要的测试会在这些远程设备上进行,借助 cURL,我可以获取关于上传所需时间的详细报告。
这个 Tornado 处理器主要的工作就是接受一个包含字节数的请求体(就这么简单)。
class TestUploadHandler(tornado.web.RequestHandler):
def post(self):
logging.debug("Testing upload")
self.write("")
所以,上面的代码是可以工作的,但感觉有点……有点丢人:-D。为了让它看起来更好一点,我想添加一些更有用的日志,比如请求上传所花的时间之类的。我不知道……想要一些更有趣的东西。
有没有办法在 Tornado 处理器内部测量上传速度呢?我在网上查过如何评估 Tornado 处理器的性能,但我找到的都是不同网络服务器之间的性能比较。
提前谢谢你。
1 个回答
2
好吧,测量上传花了多长时间其实很简单:
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
方法就会被调用,这时我们就能得到 end
的时间。
不过,我在处理大文件上传时遇到了一些问题。对于小一点的文件(小于100MB),这个方法似乎还不错。