如何测量 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
稍后将开始处理新连接 - 当事件循环再次空闲时(如果它们此时没有超时)片刻)。
您应该始终避免冻结事件循环的情况。 在某处冻结事件循环意味着代码中所有位置的所有任务也被冻结!无论任务数量如何,任何一种循环冻结都会破坏使用异步方法的整个想法。任何类型的代码,如果事件循环被冻结,都会有性能问题。
如您所述,您可以使用 ProcessPoolExecutor
和 run_in_executor 来等待 CPU 绑定的内容,但您也可以使用 ThreadPoolExecutor
来避免冻结。
是否有测量异步事件循环指标的模块?或者对于异步事件循环,我们应该监控哪些指标以进行性能分析?
例如
- 事件循环中有多少任务?
- 有多少任务处于等待状态?
我不是要测量协程函数。 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
稍后将开始处理新连接 - 当事件循环再次空闲时(如果它们此时没有超时)片刻)。
您应该始终避免冻结事件循环的情况。 在某处冻结事件循环意味着代码中所有位置的所有任务也被冻结!无论任务数量如何,任何一种循环冻结都会破坏使用异步方法的整个想法。任何类型的代码,如果事件循环被冻结,都会有性能问题。
如您所述,您可以使用 ProcessPoolExecutor
和 run_in_executor 来等待 CPU 绑定的内容,但您也可以使用 ThreadPoolExecutor
来避免冻结。