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

Scala 通过akka远程参与者发送较大消息的性能问题,scala,akka,akka-remote-actor,Scala,Akka,Akka Remote Actor,对远程参与者的并发请求的响应需要很长时间才能响应,即1个请求需要300毫秒,但100个并发请求几乎需要30秒才能完成!所以看起来请求是按顺序执行的!请求大小很小,但在序列化之前,JVM中的响应大小约为120 kB。但是这个反应有很深的嵌套case类 在同一台机器上的两个不同JVM上运行时,响应时间也是相似的。但在同一JVM中(即本地参与者)的响应速度很快。它是向一个远程参与者发出并发请求的单个客户端 我在akka调试日志中看到此日志。这意味着什么 调试测试应用程序akka.remote.Endp

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

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

我在akka调试日志中看到此日志。这意味着什么

调试测试应用程序akka.remote.EndpointWriter-使用 maxWriteCount:50,fullBackoffCount:546,smallBackoffCount:2, 无回退计数: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
 }
}
有关完整配置,请参阅