首页 > 解决方案 > 异步python平滑延迟

问题描述

我正在使用grpc.aio.server并且遇到一个问题,如果我尝试对我的服务进行负载测试,它会有一些请求滞后 10 秒,但请求是相似的。负载稳定(200rps),几乎所有请求的延迟都差不多。我可以接受更高的延迟,只要它是稳定的。我试过用谷歌搜索类似异步任务优先级的东西,但在我看来,这意味着等待很长时间的任务的优先级有问题,但它们已经完成或完整的请求任务正在等待开始很久。

例如,向 gRPC 服务发送了 1000 个请求,它们都具有相同的执行逻辑、相同的数据库实例、对数据库的相同查询、相同的时间从数据库中获取结果等等,一切都是一样的。我看到例如第 10 个请求延迟为 10 秒,但第 13 个请求延迟为 5 秒。我还可以在日志中看到,数据库查询的执行时间几乎相同。

有什么建议么?也许我理解错了

标签: pythonasynchronousarchitecturepython-asynciogrpc

解决方案


发生这种行为的原因有多种。您可以查看以下几点:

  • 你有什么类型的工作量?是 I/O 受限还是 CPU 受限?

  • 您的代码是否在某个时候阻塞了事件循环?每个请求的路径是完全异步的?该文档非常清楚地表明阻塞事件循环的代价是高昂的:

不应直接调用阻塞(CPU 绑定)代码。例如,如果一个函数执行 1 秒的 CPU 密集型计算,则所有并发的 asyncio 任务和 IO 操作都会延迟 1 秒。

  • 当你看到那些大延迟时,内存会发生什么?您可以使用工具运行内存分析并检查内存。很有可能看到延迟与尝试回收内存的 Python 内存管理器的激烈活动之间存在相关性。这是一篇关于内存管理的好文章,您可以查看。

推荐阅读