异步 python 平滑延迟
Async python smooth latency
我正在使用 grpc.aio.server
,但我遇到了一个问题,如果我尝试对我的服务进行负载测试,它会有一些请求滞后 10 秒,但这些请求是相似的。负载稳定(200rps),几乎所有请求的延迟几乎相同。我可以接受更高的延迟,只要它稳定即可。我试过 google 类似异步任务优先级的东西,但在我看来,这意味着等待很长时间的任务的优先级有问题,但它们已经完成或完整的请求任务正在等待开始很久了。
例如,向 gRPC 服务发送了 1000 个请求,它们都具有相同的执行逻辑、相同的数据库实例、相同的数据库查询、相同的时间从数据库获取结果等,一切都是相同的。我看到了,例如第 10 个请求延迟为 10 秒,但第 13 个请求延迟为 5 秒。我还可以在日志中看到,数据库查询的执行时间几乎相同。
有什么建议吗?可能我理解错了
- 每台服务器的请求之间都会有延迟差异。然而,规模应该比你体验的要低得多
- 您的问题没有服务器初始化代码,所以无法知道使用了什么配置。我将从查看服务器的线程池大小开始。
根据 docs,线程池实例是必需的参数,因此可以尝试设置不同的池大小。我的猜测是线程已经耗尽,然后延迟上升,因为请求正在等待线程释放
发生这种行为的原因有多种。以下是您可以查看的一些内容:
您有什么类型的工作量?是 I/O 绑定还是 CPU 绑定?
您的代码是否在某些时候阻塞了事件循环?每个请求的路径是完全异步的? doc 非常清楚地指出阻塞事件循环的代价很高:
Blocking (CPU-bound) code should not be called directly. For example, if a function performs a CPU-intensive calculation for 1 second, all concurrent asyncio Tasks and IO operations would be delayed by 1 second.
我正在使用 grpc.aio.server
,但我遇到了一个问题,如果我尝试对我的服务进行负载测试,它会有一些请求滞后 10 秒,但这些请求是相似的。负载稳定(200rps),几乎所有请求的延迟几乎相同。我可以接受更高的延迟,只要它稳定即可。我试过 google 类似异步任务优先级的东西,但在我看来,这意味着等待很长时间的任务的优先级有问题,但它们已经完成或完整的请求任务正在等待开始很久了。
例如,向 gRPC 服务发送了 1000 个请求,它们都具有相同的执行逻辑、相同的数据库实例、相同的数据库查询、相同的时间从数据库获取结果等,一切都是相同的。我看到了,例如第 10 个请求延迟为 10 秒,但第 13 个请求延迟为 5 秒。我还可以在日志中看到,数据库查询的执行时间几乎相同。
有什么建议吗?可能我理解错了
- 每台服务器的请求之间都会有延迟差异。然而,规模应该比你体验的要低得多
- 您的问题没有服务器初始化代码,所以无法知道使用了什么配置。我将从查看服务器的线程池大小开始。 根据 docs,线程池实例是必需的参数,因此可以尝试设置不同的池大小。我的猜测是线程已经耗尽,然后延迟上升,因为请求正在等待线程释放
发生这种行为的原因有多种。以下是您可以查看的一些内容:
您有什么类型的工作量?是 I/O 绑定还是 CPU 绑定?
您的代码是否在某些时候阻塞了事件循环?每个请求的路径是完全异步的? doc 非常清楚地指出阻塞事件循环的代价很高:
Blocking (CPU-bound) code should not be called directly. For example, if a function performs a CPU-intensive calculation for 1 second, all concurrent asyncio Tasks and IO operations would be delayed by 1 second.