【问题标题】:Async python smooth latency异步python平滑延迟
【发布时间】:2020-12-15 18:15:41
【问题描述】:

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

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

有什么建议吗?可能我理解错了

【问题讨论】:

    标签: python asynchronous architecture python-asyncio grpc


    【解决方案1】:

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

    • 您有什么类型的工作量?是 I/O 密集型还是 CPU 密集型?

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

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

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

    【讨论】:

    • 这是正确的答案!抱歉回复晚了,我在问这个问题后一周内解决了我的问题,主要问题是 CPU-bound 阻塞代码,现在我使用 asgiref.sync_to_async 在 ThreadPoolExecutor 中运行所有 CPU-bound 代码,我加快了速度我的代码 60%+
    【解决方案2】:
    1. 每台服务器的请求之间都会存在延迟差异。但是,规模应该比您体验到的要低得多
    2. 您的问题没有服务器初始化代码,所以不知道使用了什么配置。我将从查看服务器的线程池大小开始。 根据docs,线程池实例是必需的参数,因此可以尝试设置不同的池大小。我的猜测是线程已经耗尽,然后延迟上升,因为请求正在等待线程释放

    【讨论】:

      猜你喜欢
      • 2016-02-02
      • 1970-01-01
      • 1970-01-01
      • 2019-03-13
      • 2018-08-01
      • 1970-01-01
      • 2018-09-26
      • 2019-01-15
      • 2020-09-02
      相关资源
      最近更新 更多