通过 akka 远程参与者发送较大消息的性能问题
Performance issue sending larger messages via akka remote actors
对远程参与者的并发请求的响应需要很长时间才能响应,也就是 1 个请求需要 300 毫秒,但是 100 个并发请求需要将近 30 秒才能完成!所以看起来请求是按顺序执行的!请求大小很小,但序列化前 JVM 中的响应大小约为 120 kB。但是响应有很深的嵌套案例 class.
当 运行 在同一台机器上的两个不同 JVM 上时,响应时间也相似。但是在同一个 JVM(即本地参与者)中响应很快。它是单个客户端向一个远程参与者发出并发请求。
我在 akka 调试日志中看到了这个日志。这说明什么?
DEBUG test-app akka.remote.EndpointWriter - Drained buffer with
maxWriteCount: 50, fullBackoffCount: 546, smallBackoffCount: 2,
noBackoffCount: 1 , adaptiveBackoff: 2000
日志显示写入发送缓冲区失败。这可能表明
- 发送缓冲区太小
- 远程 actor 端的接收缓冲区太小
- 网络问题
发送缓冲区大小和接收缓冲区大小直接限制了并发请求数和响应数!增加客户端和服务器上的发送缓冲区和接收缓冲区大小,以支持客户端和服务器所需的并发性。
如果缓冲区大小不够,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。
对远程参与者的并发请求的响应需要很长时间才能响应,也就是 1 个请求需要 300 毫秒,但是 100 个并发请求需要将近 30 秒才能完成!所以看起来请求是按顺序执行的!请求大小很小,但序列化前 JVM 中的响应大小约为 120 kB。但是响应有很深的嵌套案例 class.
当 运行 在同一台机器上的两个不同 JVM 上时,响应时间也相似。但是在同一个 JVM(即本地参与者)中响应很快。它是单个客户端向一个远程参与者发出并发请求。
我在 akka 调试日志中看到了这个日志。这说明什么?
DEBUG test-app akka.remote.EndpointWriter - Drained buffer with maxWriteCount: 50, fullBackoffCount: 546, smallBackoffCount: 2, noBackoffCount: 1 , adaptiveBackoff: 2000
日志显示写入发送缓冲区失败。这可能表明
- 发送缓冲区太小
- 远程 actor 端的接收缓冲区太小
- 网络问题
发送缓冲区大小和接收缓冲区大小直接限制了并发请求数和响应数!增加客户端和服务器上的发送缓冲区和接收缓冲区大小,以支持客户端和服务器所需的并发性。
如果缓冲区大小不够,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。