当前位置: 首页 > 知识库问答 >
问题:

GRPC服务器响应延迟

吕向荣
2023-03-14

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

为了实现这一目标,我正在试用示例JAVA helloworld grpc客户机服务器,并尝试将响应的延迟与类似的websocket客户机服务器进行比较。目前,我正在本地机器上用客户端和服务器进行测试。

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

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

我确实理解grpc中涉及的协议开销在我的websocket客户端-服务器示例中是不存在的。但是,我可以通过测量协议处理引入的开销来解释这一点。

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

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

共有2个答案

乐正玺
2023-03-14

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

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

对于基准测试,我可以推荐指标。您可以通过日志或httpendpoint公开度量。

邵沛
2023-03-14

Java中的基准测试很容易出错。你需要做几秒钟的热身,才能让多层次的准时制发挥作用。您还需要时间来稳定堆大小。在一个简单的一次性基准测试中,由于类加载,很容易看到最后运行的代码是最快的(与代码无关)。600毫秒对于gRPC延迟来说是一个非常大的数字;我们在Google Compute Engine上看到两台机器之间的平均延迟约为300µs,使用TLS。我希望您没有热身,所以您正在计算Java加载gRPC所需的时间,并使用gRPC的解释器测量Java。

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

在线程之间跳转的成本通常很低,尽管它会增加尾部延迟。在一些进程内NOOP基准测试中,我们看到使用额外线程在8µs内完成RPC,而不使用额外线程在4µs内完成RPC。如果你真的想要,你可以使用serverBuilder。directExecutor()以避免线程跳转。请注意,由于服务处理可能会延迟I/O,大多数服务使用该选项会变得更慢,并且尾部延迟非常差。

 类似资料:
  • Response响应对象主要将JSP容器处理后的结果传回到客户端。可以通过response变量设置HTTP的状态和向客户端发送数据,如Cookie、HTTP文件头信息等。 一个典型的响应看起来就像下面这样: HTTP/1.1 200 OK Content-Type: text/html Header2: ... ... HeaderN: ... (空行) <!doctype ...> <ht

  • 正如前面的章节中讨论的那样,当一个 Web 服务器响应一个 HTTP 请求时,响应通常包括一个状态行、一些响应报头、一个空行和文档。一个典型的响应如下所示: HTTP/1.1 200 OK Content-Type: text/html Header2: ... ... HeaderN: ... (Blank Line) <!doctype ...> <html> <head>...</he

  • 服务器响应 如需获得来自服务器的响应,请使用 XMLHttpRequest 对象的 responseText 或 responseXML 属性。 属性 描述 responseText 获得字符串形式的响应数据。 responseXML 获得 XML 形式的响应数据。 responseText 属性 如果来自服务器的响应并非 XML,请使用 responseText 属性。 responseText

  • gRPC 官方文档中的 quickstart - php, 很容易给 PHPer 产生误导, 按照官网的文档, 运行起来 gRPC 服务就很麻烦, 更不用说整套的 RPC 服务了. 推荐阅读 tech| 再探 grpc, 讲解了在 PHP 中实现 gRPC 相关基础知识. hyperf 对 gRPC 支持做了更进一步的封装, hyperf-skeleton 项目为例, 详细讲解整个步骤: .pro

  • 我不是程序员,我需要你的帮助。 我有一个返回服务器响应的cURL函数-成功或错误: 400-错误响应: 200-成功响应: 我需要验证基于200或400状态码的响应。 如果状态为200,则继续正常操作。 如果状态为400(错误),则我需要跟踪错误消息(去掉所有标签)并仅回显错误消息(在上面的示例中-为了联系,请输入有效的电话号码。) 我该怎么做?请帮忙。 非常感谢。 卷曲代码:

  • 我正在用C++开发双向流gRPC。我想在服务器端设置一个超时限制,如果连接超过一个阈值,就关闭连接。 但是我发现的唯一超时机制是在客户端(https://grpc.io/blog/deadlines/#c)。我找不到任何API可以用于ServerContext(https://grpc.github.io/grpc/cpp/classgrpc_1_1_server_context.html)。有人