【发布时间】:2017-09-25 09:45:54
【问题描述】:
我有一个运行大约 7 台服务器 (C#) 的网站。还有一个运行 3 个实例的 gRPC 服务(golang)。每个 Web 服务器都连接到 gRPC 服务并对其进行调用。该服务每分钟有大约 8000 个呼叫。
对该服务的调用并不那么关键,因此最近我们将调用的最后期限缩短到了 20 毫秒。在这里,我们注意到了一些奇怪的事情。全天每小时都会出现“超过最后期限”错误的峰值。它恰好发生在第 0 分钟,即下午 2 点、下午 3 点、下午 4 点等。
为什么会这样?
我遇到this link 说 gRPC 每小时都会重置连接,但仅此而已。
所以我的问题是 gRPC 是否每小时在内部刷新连接。如果是的话,无论如何都要调整这种行为。如果没有,那么有人可以就我如何调试为什么会发生这种情况给出一些指导。
【问题讨论】:
-
我建议从一个 gRPC 服务器实例收集 30 秒的运行时跟踪,以便它在所谓的峰值之前有 15 秒,之后有 15 秒。可以通过执行
curl 'http://endpoint/debug/pprof/trace?seconds=30' >runtime.trace之类的操作来获得跟踪,然后您可以分析它是否存在任何异常,例如 GC 中的尖峰。有关如何使用跟踪,请参阅go tool trace --help。除了从中提取 pprof 就绪的东西外,-http标志还允许使用 Chromium-s 内置可视化器查看跟踪。请参阅making.pusher.com/go-tool-trace 了解更多信息。 -
如果异常只在整点出现,并且重新启动它不会改变峰值,那么寻找一些外部系统因素会更有意义,比如占用太多时间的 cron 作业资源。尽管我对 C# 实现一无所知,但大多数系统都会在截止日期前添加抖动以防止出现此类峰值。如果您在客户端上设置了 20 毫秒的最后期限,那么它可能不足以涵盖您需要建立新连接的时间。
-
@kostix 我按照您的建议运行了跟踪。我在 gRPC 服务器上找不到任何不同的行为。我还记录了每次呼叫在服务器上的时间,一切似乎都很好。我想我会研究 JimB 的建议并注意客户端的问题
-
@JimB 你是对的。有一个计划的 Windows 服务正在运行。它以错误的方式配置,导致每小时运行数百个轻量级作业实例。感谢您的帮助。