首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GRPC服务器响应延迟

GRPC服务器响应延迟
EN

Stack Overflow用户
提问于 2017-12-05 19:12:41
回答 2查看 6.7K关注 0票数 3

首先,是否有人对GRPC客户机-服务器实现v/s ( websocket+protobuf客户机-服务器实现)之间的吞吐量/延迟进行了性能比较?或者至少是类似的东西。

为了达到这个目标,我正在试用客户机服务器示例,并尝试将响应的延迟与类似的websocket客户机服务器进行比较。目前,我正在本地计算机上的客户端和服务器上尝试这一点。

websocket客户端服务器在服务器端有一个简单的while循环。对于grpc服务器,我注意到它使用异步执行模型。我怀疑它会为每个客户端请求创建一个新线程,从而导致额外的处理开销。例如,我正在测量的websocket响应延迟为6-7 ms,而grpc示例显示的延迟约为600至700 ms,相当于protobuf开销。

为了对grpc进行类似的比较,是否有一种同步运行grpc服务器的方法?我希望能够消除线程创建/调度的开销以及异步处理引入的其他此类内部开销。

我确实了解到,在我的websocket客户机-服务器示例中,grpc中涉及到一个protobuf开销。但是,我可以通过测量protobuf处理引入的开销来说明这一点。

另外,如果我不能同步运行grpc服务器,那么至少可以度量线程调度/异步处理开销吗?

我对JAVA比较陌生,所以请原谅我的无知。

EN

回答 2

Stack Overflow用户

发布于 2017-12-05 21:05:53

在Java中进行基准测试很容易出错。为了启动多个级别的JIT,您需要做很多秒的热身。您还需要时间使堆大小达到水平。在一个简单的一次性基准测试中,由于类加载,很容易看到最后运行的代码是最快的(独立于该代码是什么)。600毫秒对于gRPC延迟来说是一个非常大的数字;我们在Google上看到约300微秒中位延迟在两台机器之间使用TLS。我希望您没有热身,所以您正在计算Java加载gRPC所需的时间,并使用它的gRPC解释器来测量Java。

没有gRPC服务器的同步版本,即使存在同步版本,默认情况下,它仍将使用单独的线程运行。gRPC使用缓存的线程池,因此在初始请求之后,gRPC应该能够重用一个线程来调用服务。

线程之间跳转的成本通常很低,尽管它可以增加尾延迟。在一些进程中的NOOP基准测试中,我们看到RPC在8个进程中完成,使用额外的线程,而4个没有。但是,如果确实需要,可以使用serverBuilder.directExecutor()来避免线程跳转。请注意,由于服务处理可能会延迟I/O,因此大多数服务在使用该选项时会变慢,并且拖尾延迟。

票数 6
EN

Stack Overflow用户

发布于 2017-12-06 10:56:39

为了对grpc进行类似的比较,是否有一种同步运行grpc服务器的方法?我希望能够消除线程创建/调度的开销以及异步处理引入的其他此类内部开销。

您可以创建同步客户端。一般来说,异步的速度要快得多。(在Scala中测试)您可以简单地以一种非阻塞的方式使用所有资源。我将创建一个测试,测试服务器每秒可以处理多少个客户端的请求。您可以限制每个客户端的传入请求,以确保您的服务不会崩溃。异步也更适合于HTTP 2,HTTP 2提供多路复用。

作为基准,我可以推荐Metrics。您可以通过日志或http端点公开这些指标。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47660992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档