Снижение производительности при первом обращении к конечным точкам gRPC с использованием protobuf-net c#
У меня есть сервер gRPC, работающий с использованием protobuf-net.gRPC с использованием .NET Core 3.1. Он использует платформу 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 млн лет, а последующие вызовы к той же конечной точке составляют около 1-2 мс.
Это из-за компиляции JIT-компилятора из IL->Native code? Если да, то есть ли способ обойти эту первую проблему с производительностью, кроме очевидных средств, таких как принудительный вызов конечных точек?
С Уважением
1 ответ
Это может быть связано с конструкцией gRPC, поскольку соединение канала не устанавливается до тех пор, пока не будет выполнен первый вызов RPC.
30-40 мс, вероятно, предназначены для открытия TCP-соединения + рукопожатия SSL + обмена кадрами настроек HTTP/2. Следующие вызовы RPC повторно используют этот канал/подключение и, таким образом, не имеют этих накладных расходов.
Для Java есть экспериментальный API getState , который клиент может вызвать с аргументом requestConnection = true сразу после создания канала, чтобы инициировать соединение. Не уверен, что он доступен на С#.