通过 akka 远程参与者发送较大消息的性能问题



对远程参与者的并发请求的响应需要很长时间才能响应,也就是 1 个请求需要 300 毫秒,但 100 个并发请求需要近 30 秒才能完成!因此,看起来请求几乎是按顺序执行的!请求大小很小,但在序列化之前,JVM 中的响应大小约为 120 kB。但响应具有深度嵌套的案例类。

在同一台机器上的两个不同的 JVM 上运行时,响应时间也相似。但是在同一个JVM(即本地参与者(中响应很快。它是单个客户端向一个远程参与者发出并发请求。

我在 akka 调试日志中看到此日志。这说明什么?

DEBUG test-app akka.remote.EndpointWriter - Drained buffer with 最大写入计数: 50, 完全退避计数: 546, 小回退计数: 2, no回退计数: 1 , 自适应退避: 2000

日志显示写入发送缓冲区失败。这可能表明

  • 发送缓冲区太小
  • 远程参与者端的接收缓冲区太小
  • 网络问题

发送缓冲区大小和接收缓冲区大小直接限制了并发请求和响应的数量!增加客户端和服务器上的发送缓冲区和接收缓冲区大小,以支持客户端和服务器所需的并发性。

如果缓冲区大小不足,netty 将等待缓冲区被清除,然后再尝试重写到缓冲区。默认情况下,也会有一个退避时间,这也可以配置。

这些设置位于 remote.netty.tcp 下:

akka {
 remote {
  netty.tcp {
   # Sets the send buffer size of the Sockets,
   # set to 0b for platform default
   send-buffer-size = 1024000b
   # Sets the receive buffer size of the Sockets,
   # set to 0b for platform default
   receive-buffer-size = 2048000b
  }
  # Controls the backoff interval after a refused write is reattempted.
  # (Transports may refuse writes if their internal buffer is full)
  backoff-interval = 1 ms
 }
}

有关完整配置,请参阅 Akka 参考配置。

最新更新