性能问题通过akka远程actor发送更大的消息

时间:2017-05-17 15:25:04

标签: scala akka akka-remote-actor

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

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

我在akka调试日志中看到了这个日志。这表明了什么?

  

DEBUG test-app akka.remote.EndpointWriter - 排除缓冲区   maxWriteCount:50,fullBackoffCount:546,smallBackoffCount:2,   noBackoffCount:1,adaptiveBackoff:2000

1 个答案:

答案 0 :(得分:2)

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

  • 发送缓冲区太小
  • 远程演员旁边的接收缓冲区太小
  • 网络问题

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

如果缓冲区大小不足,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 reference config