python grpc截止日期超过了很大百分比的错误

Posted

技术标签:

【中文标题】python grpc截止日期超过了很大百分比的错误【英文标题】:python grpc deadline exceeded errors in large percentages 【发布时间】:2019-08-23 21:49:25 【问题描述】:

我在python grpc 客户端调用scala grpc 服务器时遇到很多超出期限的错误。

我正在报告来自客户端和服务器的指标,并且服务器报告的时间与客户端报告的时间之间存在很大差异,我认为这不能仅用网络延迟来解释(因为差异很大)。返回的对象大小相似,我认为序列化时间与网络时间相比可以忽略不计。

我已将超时设置为 20 毫秒

我的客户端代码很简单:

self.channel = grpc.insecure_channel(...)
self.stub = MyService_pb2_grpc.MyServiceStub(self.channel)
timeout = 0.02
try:
  start_ms = time.time()
  grpc_res = self.stub.getFoo(Request(...), timeout=timeout)
  end_ms = time.time()
  total_duration_ms = int((end_ms - start_ms) * 1000)
....
except Exception as e:
  status_code = str(e.code()).split('.')[1]
  logger.error('exception ....: %s', status_code) # around 20% deadline exceptions

我的服务器代码平均报告 5 毫秒,客户端代码平均报告 7ms,但如前所述,在 20ms 处达到 20% 的超时

有没有办法调试这个问题的根本原因,即较低级别的日志记录等?

【问题讨论】:

平均可能是 5-7ms,但是尾部延迟呢?在超过最后期限的情况下,这里的客户端代码似乎没有测量延迟。您在客户端和服务器之间有什么样的网络连接?你能用 iperf 之类的工具来描述它吗? grpc 服务是使用 SRV dns 的 ECS(也尝试使用负载均衡器)。客户端在负载非常低的 EC2 实例中运行。 ECS 和 EC2 在同一个 AZ。超过最后期限的情况下的延迟是不相关的,因为我试图只减轻最后期限。我尝试将截止日期提高到 30 毫秒,它解决了截止日期问题,但显然客户端的总体平均延迟上升了 在我们的例子中,我们使用带有 gevent 补丁的 grpcio,并且看到了类似的超出期限的错误,尽管大多数服务器端响应是在超时内做出的。你能找出原因吗? 【参考方案1】:

您可以尝试在环境变量下运行: GRPC_VERBOSITY=DEBUG GRPC_TRACE=all https://github.com/grpc/grpc/blob/master/doc/environment_variables.md

【讨论】:

以上是关于python grpc截止日期超过了很大百分比的错误的主要内容,如果未能解决你的问题,请参考以下文章

超过上下文截止日期 - 普罗米修斯

计算截止日期和距离设定截止日期还剩多少天

grpc-go源码剖析五十九之客户端一侧,是如何处理截止时间呢?

grpc-go源码剖析五十八之截止时间相关介绍

Python获取前N周时间开始日期和截止日期

如何在 Google App Engine 上为 BigQuery 设置截止日期