python-asyncio - 如何测量 python asyncio 事件循环指标?
问题描述
是否有测量异步事件循环指标的模块?或者对于异步事件循环,我们应该监控哪些指标以进行性能分析?
例如
- 事件循环中有多少个任务?
- 等待状态有多少任务?
我不是要测量协程函数。aiomonitor 具有功能,但不完全是我需要的。
解决方案
我几乎不相信待处理任务或任务摘要的数量会告诉你很多。假设您有 10000 个任务,其中 8000 个待处理:是不是很多,不是吗?谁知道。
问题是 - 每个asyncio
任务(或任何其他 Python 对象)可以消耗不同数量的不同机器资源。
我认为与其尝试监控asyncio
特定对象,不如监控一般指标:
- CPU使用率
- 内存使用情况
- 网络 I/O(如果您正在处理它)
- 硬盘 I/O(如果您正在处理它)
你asyncio
应该总是使用asyncio.Semaphore来限制当前正在运行的作业的最大数量,并实现一种方便的方法来更改信号量的值(例如,通过配置文件)。
它将允许根据其可用和实际使用的资源来改变具体机器上的工作负载。
更新:
我的问题是,asyncio 在此块期间仍会接受新连接吗?
如果您的事件循环被某些 CPU 计算阻塞,asyncio
稍后将开始处理新连接 - 当事件循环再次空闲时(如果此时它们没有超时)。
您应该始终避免冻结事件循环的情况。冻结某处事件循环意味着代码中各处的所有任务也被冻结!无论任务数量如何,任何类型的循环冻结都会破坏使用异步方法的整个想法。冻结事件循环的任何类型的代码都会出现性能问题。
正如您所指出的,您可以使用ProcessPoolExecutor
run_in_executor来等待 CPU 绑定的东西,但您也可以使用它ThreadPoolExecutor
来避免冻结。