0

我有一个使用 .NET Core 3.1 的 protobuf-net.gRPC 运行的 gRPC 服务器。它在后台使用 ASP.NET Core 框架和 Kestrel 来运行 HTTP 服务器。我注意到与在同一端点上的后续调用相比,第一次在此服务器上命中的 gRPC 端点在 ASP NET Core 中间件中花费的时间要多得多。

Time taken from 
Microsoft.AspNetCore.Routing.EndpointMiddleware[ExecutedEndPoint] : Executing endpoint 'gRPC - /grpc.....'

Until hitting the actual endpoint function in my gRPC server

第一次花费的时间相当长,大约 30-40 Ma,而随后对同一端点的调用大约是 1-2 ms。

这是因为 JIT 编译器是从 IL->Native 代码编译的吗?如果是这样,除了强制调用端点等显而易见的方法之外,还有其他方法可以解决这个首次性能问题吗?

问候

4

1 回答 1

0

这可能是由于 gRPC 设计造成的,因为在发出第一个 RPC 调用之前不会建立通道的连接。

30-40 毫秒可能用于打开 TCP 连接 + SSL 握手 + HTTP/2 设置帧交换。以下 RPC 调用重用此通道/连接,因此没有此开销。

对于 Java,有一个实验性 API getState,客户端可以在创建通道后立即使用 requestConnection = true 参数调用它以启动连接。不确定它是否在 C# 中可用。

于 2021-09-07T23:19:49.510 回答