在对Tornado / Asyncio进行性能分析时,哪些功能是免费的?

时间:2018-07-29 16:38:37

标签: python tornado python-asyncio

我正在运行一个相当复杂的Tornado TCP服务器应用程序,并且我想了解花费时间以提高性能。我正在使用Tornado v5 +,因此Tornado得到了asyncio的支持。

我在事件循环线程上运行了一个统计探查器,发现像下面这样的堆栈是常见的:

tornado/ioloop.py::run_sync
asyncio/asyncio.py::start
asyncio/base_events.py::run_forever
asyncio/base_events.py::_run_once
asyncio/events.py::_run
torando/ioloop.py::<lambda>
torando/platform/asyncio.py::add_callback
asyncio/base_events.py::call_soon_threadsafe
asyncio/selector_events.py::_write_to_self
    csock.send(b'\0')

tornado/ioloop.py::run_sync
asyncio/asyncio.py::start
asyncio/base_events.py::run_forever
asyncio/base_events.py::_run_once
asyncio/events.py::selector_events.py::_read_from_self
    data = self._ssock_recv(4096)

无论处于活动状态还是安静状态,这些时间都会占用大约40%的计算时间。我应该担心它们吗,还是这些只是等待系统状态发生的等待状态?

2 个答案:

答案 0 :(得分:2)

每当使用IOLoop.add_callback时,这两个堆栈总是成对出现。这不是一个空闲状态,它是开销,并且不希望它占用40%的时间。其他60%的时间应该可以为您提供提示。在我看来,您可能遇到了某种无限循环或运行着一系列无限次协同程序的问题。

答案 1 :(得分:0)

对asyncio应用程序进行性能分析的问题是,在协程上下文切换时,您不会在堆栈中看到它们,并且可能很难确定哪个功能实际上是在花费时间。我肯定会建议yappi。通过1.2.1版,它可以本地分析协程并准确告诉您协程内部花费了多少时间在墙壁或CPU上。

有关此协程分析的详细信息,请参见here