如何测量 python asyncio 事件循环指标?

how to measure python asyncio event loop metrics?

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

例如

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

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

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

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

  • CPU 用法
  • RAM 使用情况
  • 网络I/O(如果你正在处理它)
  • 硬盘驱动器I/O(如果你正在处理它)

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

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

更新:

My question, will asyncio still accept new connections during this block?

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

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

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