【问题标题】:how to measure python asyncio event loop metrics?如何测量 python asyncio 事件循环指标?
【发布时间】:2019-01-08 22:15:54
【问题描述】:

是否有测量 asyncio 事件循环指标的模块?或者对于异步事件循环,我们应该监控哪些指标来进行性能分析?

例如

  • 事件循环中有多少个任务?
  • 有多少任务处于等待状态?

我不是要测量协程函数。 aiomonitor 有这个功能,但不是我需要的。

【问题讨论】:

    标签: python-asyncio metrics


    【解决方案1】:

    我几乎不相信待处理任务或任务摘要的数量会告诉你很多。假设您有 10000 个任务,其中 8000 个待处理:是不是很多,不是吗?谁知道呢。

    问题是 - 每个 asyncio 任务(或任何其他 Python 对象)可以消耗不同数量的不同机器资源。

    与其尝试监控 asyncio 特定对象,我认为监控一般指标会更好:

    • CPU 使用率
    • 内存使用情况
    • 网络 I/O(如果您正在处理它)
    • 硬盘 I/O(以防万一)

    对于asyncio,您可能应该始终使用asyncio.Semaphore 来限制当前正在运行的作业的最大数量,并实施一种方便的方法来更改信号量的值(例如,通过配置文件)。

    它将允许根据具体机器的可用资源和实际使用的资源来改变具体机器上的工作负载。

    更新:

    我的问题,在此期间 asyncio 是否仍会接受新连接 屏蔽?

    如果您的事件循环被某些 CPU 计算阻塞,asyncio 将在稍后开始处理新连接 - 当事件循环再次空闲时(如果此时它们没有超时)。

    您应该始终避免冻结事件循环的情况。冻结某处事件循环意味着代码中各处的所有任务也被冻结!无论任务数量如何,任何类型的循环冻结都会破坏使用异步方法的整个想法。冻结事件循环的任何类型的代码都会出现性能问题。

    如您所述,您可以使用 ProcessPoolExecutorrun_in_executor 来等待 CPU 绑定的内容,但您也可以使用 ThreadPoolExecutor 来避免冻结。

    【讨论】:

    • 我有一个基于 Sanic 的 REST 服务,它使用 asyncio + uvloop。一个端点处理程序会为一个请求调用几个协程,但一个协程受 CPU 限制,可能需要 1 秒。此协程运行时,异步事件循环被阻塞。我的问题是,asyncio 在此块期间仍会接受新连接吗?这就是为什么我认为事件循环中的任务数可能会给我一个答案。我知道 CPU 密集型任务应该在 ProcessPool 中执行。我试图解释我们当前的服务器在事件循环中运行 CPU 绑定任务的行为。
    • @Bewang 我更新了答案,添加了有关您所问内容的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多