C# gRPC电话每小时都会出现峰值

C# gRPC电话每小时都会出现峰值,c#,go,grpc,C#,Go,Grpc,我有一个运行着大约7台服务器(C#)的网站。还有一个运行着3个实例的gRPC服务(golang)。每个web服务器都连接并调用gRPC服务。这项服务每分钟大约有8000个电话 对该服务的调用不是很关键,因此最近我们将调用的截止时间缩短到20毫秒。在这里,我们注意到了一些奇怪的事情。在一天中,每小时都会出现“超过截止日期”错误的高峰。它正好发生在第0分钟,即下午2点,下午3点,下午4点等等 为什么会发生这种情况 我说gRPC每小时重置一次连接,但仅此而已 所以我的问题是gRPC是否每小时内部刷新

我有一个运行着大约7台服务器(C#)的网站。还有一个运行着3个实例的gRPC服务(golang)。每个web服务器都连接并调用gRPC服务。这项服务每分钟大约有8000个电话

对该服务的调用不是很关键,因此最近我们将调用的截止时间缩短到20毫秒。在这里,我们注意到了一些奇怪的事情。在一天中,每小时都会出现“超过截止日期”错误的高峰。它正好发生在第0分钟,即下午2点,下午3点,下午4点等等

为什么会发生这种情况

我说gRPC每小时重置一次连接,但仅此而已


所以我的问题是gRPC是否每小时内部刷新一次连接。如果是,则无论如何都有可能调整此行为。如果没有,那么有人能告诉我如何调试为什么会发生这种情况。

没有,grpc go不会刷新连接。它启动断开连接的唯一时间是配置“最大空闲”(max idle)并且连接空闲时间超过该时间限制。默认情况下,这是禁用的,因此在这种情况下,它不太可能是罪魁祸首。

我建议从一个gRPC服务器实例收集30秒的运行时跟踪,这样它在所谓的峰值之前有15秒,之后有15秒。可以通过执行类似于
curl'的操作来获得跟踪http://endpoint/debug/pprof/trace?seconds=30'>runtime.trace
然后,您可以分析它是否存在任何异常,如GC中的峰值。关于如何使用跟踪,请参见
go-tool-trace--help
。除了从中提取一些现成的东西外,
-http
标志还允许使用Chromium-s内置的可视化工具查看跟踪。有关更多信息,请参阅。如果异常仅在小时内出现,并且重新启动它不会改变峰值,那么寻找一些外部系统因素会更有意义,例如占用太多资源的cron作业。虽然我对C#实现一无所知,但大多数系统都会在截止日期前增加抖动,以防止出现这样的峰值。如果您在客户端上设置20毫秒的截止时间,那么它可能不够长,无法覆盖您需要建立新连接的时间。@kostix我按照您的建议运行了跟踪。我在gRPC服务器上找不到任何不同的行为。我还记录了服务器上每次通话的时间,一切似乎都很好。我想我会研究JimB的建议,并留意客户的问题side@JimB你是对的。有一个计划的windows服务正在运行。它的配置错误,导致每小时运行数百个light作业实例。感谢您的帮助。在客户端,您可以查看的另一件事是grpc调试日志,它应该在连接遇到错误时显示。(如果您使用的是最近一两周的最新版本,它现在会记录所有连接状态更改,而不管原因如何。)