【问题标题】:Which functions are free when profiling Tornado/Asyncio?分析 Tornado/Asyncio 时哪些功能是免费的?
【发布时间】:2018-07-29 16:38:36
【问题描述】:

我正在运行一个相当复杂的 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% 的计算时间。我应该关心它们,还是这些只是系统等待某事发生时的等待状态?

【问题讨论】:

    标签: python tornado python-asyncio


    【解决方案1】:

    每当使用IOLoop.add_callback 时,这两个堆栈总是成对出现。这不是空闲状态,而是开销,预计不会占用 40% 的时间。其他 60% 的时间应该会给你一个关于正在发生的事情的线索。在我看来,也许你有某种无限循环或运行无限系列协程的东西。

    【讨论】:

    • 感谢您的回复。现在我知道要继续寻找。您对如何在我的应用程序代码中将这些调用连接回它们的源有任何建议吗?堆栈跟踪的一般性质使我处于猜测和检查调试状态。
    • 我对此没有任何技巧。通常,罪魁祸首会在其他配置文件中非常清楚地显示出来。如果这两个占用了 40% 的 cpu 时间,我希望看到调用它们的内容至少有 10% 的时间出现。如果没有,也许这只是一个分散的问题,没有什么可做的。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多