gRPC-задержка сервера Java при обработке запроса и отправке ответа под нагрузкой

#java #spring-boot #netty #grpc #grpc-java

#java #весенняя загрузка #netty #grpc #grpc-java

Вопрос:

Я запускаю тест производительности на своем унарном сервере gRPC с частотой ГГц, при загрузке около 100 Тыс. запросов время отклика велико (от 1 с до 1,5 с) для начальных нескольких тысяч запросов. После некоторой отладки я наблюдаю, что существует задержка около 500 мс между завершением перехватчика сервера gRPC и вызовом сервисного метода gRPC, и задержка около 500 мс между завершением сервисного метода и вызовом SimpleForwardingServerCallListener.onComplete. Что может быть причиной этой задержки, я настроил 8 потоков для сервера netty и 8 потоков для исполнителя контекста отмены gRPC.

Ответ №1:

Опубликовал тот же вопрос на github java-grpc, ниже приведен поток. https://github.com/grpc/grpc-java/issues/7372

TL; DR

Большое количество одновременных пользователей (num users >> num gRPC worker threads) означало бы, что система переподписана и не может обрабатывать запросы, создавая таким образом отставание запросов, подлежащих обработке. Это вызывает задержку в обработке запроса, даже если запрос принят потоком цикла событий gRPC. Например. Общее время обработки одного запроса = 375 мс между завершением перехватчика сервера gRPC (ServerInterceptor.interceptCall) и вызовом службы gRPC = 162 мс Время обработки запроса службой gRPC = 65 мс Время между завершением службы gRPC и вызовом SimpleForwardingServerCallListener.onComplete = 148 мс

382/61 = 6,2, поэтому система в 6,2 раза переподписана. 100/6.2 = 16, что было бы ближе к максимальному количеству одновременных RPC, которые он может обрабатывать.