我有一个使用protobuf-net.gRPC的gRPC服务器,它使用.NET Core3.1。它使用HTTP框架和ASP.NET幕后运行HTTP。我注意到,第一次访问此服务器上的gRPC端点时,与同一端点上的后续调用相比,它们在ASP中间件上花费的时间要多得多。
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-2ms。
这是因为JIT编译器从IL->Native代码编译而来的吗?如果是这样的话,除了强制调用端点等显而易见的方法之外,是否有其他方法可以绕过这个首次性能问题?
问候
发布于 2021-09-07 23:19:50
这可能是由于gRPC的设计,因为通道的连接直到发出第一个RPC调用时才建立。
30-40ms可能是为了打开TCP连接+ SSL握手+ HTTP/2设置帧交换。下面的RPC调用重用了这个通道/连接,因此没有这个开销。
对于Java,有一个实验性的API getState,客户端可以在通道创建之后立即使用requestConnection = true参数调用它来发起连接。不确定它是否在C#中可用。
https://stackoverflow.com/questions/69090370
复制相似问题