Производительность GRP C по сравнению с производительностью WCF - PullRequest
0 голосов
/ 18 июня 2020

У нас есть устаревшее приложение, которое работает поверх WCF, поэтому мы пытаемся отказаться от него и найти другую технологию. Одна из проблем заключается в том, что нам нужна производительность по сети, поэтому часть оценки GRP C - это оценка того, как быстро он работает, а также сколько одновременных клиентов мы можем запустить.

Итак, с этой целью, мы моделируем множество вызовов с относительно небольшим объемом передаваемых данных, но большим количеством вызовов. В этом отношении WCF оказался значительно лучше, чем GRP C, что очень неожиданно. Возможно, что-то не так с тем, как тест был разработан и реализован?

Код сервера:

public override Task<TestReply> Test(TestRequest request, ServerCallContext context)
{
  var ret = new char[request.Size];
  var a = (int)'a';
  for (var i = 0; i < request.Size; i++)
  {
    ret[i] = (char)(a + (i % 26));
  }
  return Task.FromResult(new TestReply { Message = new string(ret) });
}

Код клиента:

static void Main(string[] args)
{
   AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
   using var channel = GrpcChannel.ForAddress("http://remote_server:8001", new GrpcChannelOptions { Credentials = ChannelCredentials.Insecure });

   var client = new Greeter.GreeterClient(channel);
   string TestMethod(int i)
   {
      var request = new TestRequest {Size = i};
      return client.Test(request).Message;
   }

   var start = DateTime.Now;
   for (var i = 0; i < 15625; i++)
   {
      var val = TestMethod(10);
   }
   var end = DateTime.Now;
}

Если мы запустим один экземпляр клиента, это занимает чуть менее 7 секунд. Если мы запустим 64 экземпляра одновременно, каждый займет в среднем 23 секунды. Частично проблема заключается в том, что запуск 64 экземпляров также требует большой нагрузки на ЦП как на клиенте, так и на сервере. С 64 клиентами клиент увидит использование ЦП 85-95%, а сервер - 70-80%.

Для сравнения, WCF запустит один экземпляр этого кода за 2,4 секунды, а 64 - за в среднем 9 секунд, и при этом никогда не будет значительной загрузки ЦП.

Неправильно ли мы используем GRP C? Что-то не так с тестом? Что мы можем сделать, чтобы GRP C работал немного быстрее / компактнее?

...