分析 Tornado/Asyncio 时哪些功能是免费的?

Which functions are free when profiling Tornado/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'[=11=]')

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% 的计算时间,无论是在活动时还是在安静时。我应该关心它们,还是这些只是系统等待某事发生时的等待状态?

每当使用 IOLoop.add_callback 时,这两个堆栈总是成对出现。它不是空闲状态,它是开销,预计不会占用 40% 的时间。其他 60% 的时间应该让您了解正在发生的事情。在我看来,您可能遇到了某种无限循环或 运行 无限系列协程。

分析 asyncio 应用程序的问题在于,当协程上下文切换时,您不会在堆栈中看到它们,并且您可能很难确定哪个函数实际花费了时间。我肯定会建议 yappi。在 1.2.1 版本中,它可以在本地分析协程并准确告诉您在协程中花费了多少墙或 cpu 时间。

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