【发布时间】:2018-12-13 01:32:31
【问题描述】:
我在 Java 应用程序中使用 gRPC(非阻塞存根),两个函数调用之间的响应时间约为 5-8 毫秒。我想减少它。你有什么建议?有可能吗?
【问题讨论】:
我在 Java 应用程序中使用 gRPC(非阻塞存根),两个函数调用之间的响应时间约为 5-8 毫秒。我想减少它。你有什么建议?有可能吗?
【问题讨论】:
gRPC Java 开销通常以 µs(亚毫秒)为单位。如果您看到几毫秒的延迟,一般预期的原因是:
服务延迟为毫秒。在服务器上,测量服务响应所需的时间。许多服务需要几毫秒来处理请求。
网络延迟为毫秒。从一台主机到另一台主机运行ping 以获得通信性能的下限。 (如果您有兴趣,netperf tcp_rr 是一个更好的选择。)
基准测试没有预热 JVM。当类加载发生时,第一个 RPC 将非常非常慢。之后,在 JIT 开始编译代码之前,JVM 将使用解释模式一段时间。然后,JIT 将逐步优化代码。因此,请确保有 30 多秒的持续 RPC 预热期。
Channels 未被重用。 DNS 查找、创建网络连接和执行 TLS 握手会增加延迟。但是,如果您将Channels 与多个 RPC 重复使用,那么以后的 RPC 将不需要支付这些延迟成本。
【讨论】:
executor(),请意识到它适用于该通道上的所有异步/未来调用。但这不足为奇。