Tornado在使用过程,碰到过性能瓶颈。 当碰到Tornado中有比较耗时的任务的时候,请求一多就会阻塞整个服务。这个时候就需要查看到底是什么任务阻塞了服务,然后针对性的进行优化。

Tornado使用logging打印日志,我们可以指定当某个请求的处理时间超过设定时间的时候,打印这个请求的stack trace。

源码如下:

 def set_blocking_log_threshold(self, seconds):
        """Logs a stack trace if the `IOLoop` is blocked for more than
        ``s`` seconds.

        Equivalent to ``set_blocking_signal_threshold(seconds,
        self.log_stack)``
        """
        self.set_blocking_signal_threshold(seconds, self.log_stack)

如何使用呢,只需要在启动服务的时候设置block的时间即可,如下所示:

if __name__ == '__main__':

    app = create_app()

    server = tornado.httpserver.HTTPServer(app)
    server.listen(options.port)
    io_loop = tornado.ioloop.IOLoop.instance()
    io_loop.set_blocking_log_threshold(0.5)
    io_loop.start()

如果某个请求的处理时间超过0.5秒,就会打印该请求的栈。