From fb886f0df960d8b80d0db8c61b479bb6f023ec1c Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Mon, 26 Sep 2016 11:57:37 +0200 Subject: [PATCH] configuration properties for frame size --- akka-remote/src/main/resources/reference.conf | 25 +++++++++++++++++++ .../akka/remote/artery/ArterySettings.scala | 13 +++++++--- .../akka/remote/artery/ArteryTransport.scala | 4 +-- 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/akka-remote/src/main/resources/reference.conf b/akka-remote/src/main/resources/reference.conf index 3692405d55..47352d7b1e 100644 --- a/akka-remote/src/main/resources/reference.conf +++ b/akka-remote/src/main/resources/reference.conf @@ -190,6 +190,31 @@ akka { log-sent-messages = off advanced { + + # Maximum serialized message size, including header data. + maximum-frame-size = 256 KiB + + # Direct byte buffers are reused in a pool with this maximum size. + # Each buffer has the size of 'maximum-frame-size'. + # This is not a hard upper limit on number of created buffers. Additional + # buffers will be created if needed, e.g. when using many outbound + # associations at the same time. Such additional buffers will be garbage + # collected, which is not as efficient as reusing buffers in the pool. + buffer-pool-size = 128 + + # Maximum serialized message size for the large messages, including header data. + # See 'large-message-destinations'. + maximum-large-frame-size = 2 MiB + + # Direct byte buffers for the large messages are reused in a pool with this maximum size. + # Each buffer has the size of 'maximum-large-frame-size'. + # See 'large-message-destinations'. + # This is not a hard upper limit on number of created buffers. Additional + # buffers will be created if needed, e.g. when using many outbound + # associations at the same time. Such additional buffers will be garbage + # collected, which is not as efficient as reusing buffers in the pool. + large-buffer-pool-size = 32 + # For enabling testing features, such as blackhole in akka-remote-testkit. test-mode = off diff --git a/akka-remote/src/main/scala/akka/remote/artery/ArterySettings.scala b/akka-remote/src/main/scala/akka/remote/artery/ArterySettings.scala index 3e68421f0b..d98319c8de 100644 --- a/akka-remote/src/main/scala/akka/remote/artery/ArterySettings.scala +++ b/akka-remote/src/main/scala/akka/remote/artery/ArterySettings.scala @@ -119,10 +119,15 @@ private[akka] final class ArterySettings private (config: Config) { val FlightRecorderDestination: String = getString("flight-recorder.destination") val Compression = new Compression(getConfig("compression")) - final val MaximumFrameSize = 1024 * 1024 - final val MaximumPooledBuffers = 128 - final val MaximumLargeFrameSize = MaximumFrameSize * 5 - final val InboundBroadcastHubBufferSize = MaximumPooledBuffers / 2 + final val MaximumFrameSize: Int = math.min(getBytes("maximum-frame-size"), Int.MaxValue).toInt + .requiring(_ >= 32 * 1024, "maximum-frame-size must be greater than or equal to 32 KiB") + final val BufferPoolSize: Int = getInt("buffer-pool-size") + .requiring(_ > 0, "buffer-pool-size must be greater than 0") + final val InboundBroadcastHubBufferSize = BufferPoolSize / 2 + final val MaximumLargeFrameSize: Int = math.min(getBytes("maximum-large-frame-size"), Int.MaxValue).toInt + .requiring(_ >= 32 * 1024, "maximum-large-frame-size must be greater than or equal to 32 KiB") + final val LargeBufferPoolSize: Int = getInt("large-buffer-pool-size") + .requiring(_ > 0, "large-buffer-pool-size must be greater than 0") } } diff --git a/akka-remote/src/main/scala/akka/remote/artery/ArteryTransport.scala b/akka-remote/src/main/scala/akka/remote/artery/ArteryTransport.scala index 81976057f4..89a58f37bf 100644 --- a/akka-remote/src/main/scala/akka/remote/artery/ArteryTransport.scala +++ b/akka-remote/src/main/scala/akka/remote/artery/ArteryTransport.scala @@ -353,8 +353,8 @@ private[remote] class ArteryTransport(_system: ExtendedActorSystem, _provider: R private val restartCounter = new RestartCounter(settings.Advanced.InboundMaxRestarts, settings.Advanced.InboundRestartTimeout) - private val envelopeBufferPool = new EnvelopeBufferPool(settings.Advanced.MaximumFrameSize, settings.Advanced.MaximumPooledBuffers) - private val largeEnvelopeBufferPool = new EnvelopeBufferPool(settings.Advanced.MaximumLargeFrameSize, settings.Advanced.MaximumPooledBuffers) + private val envelopeBufferPool = new EnvelopeBufferPool(settings.Advanced.MaximumFrameSize, settings.Advanced.BufferPoolSize) + private val largeEnvelopeBufferPool = new EnvelopeBufferPool(settings.Advanced.MaximumLargeFrameSize, settings.Advanced.LargeBufferPoolSize) private val inboundEnvelopePool = ReusableInboundEnvelope.createObjectPool(capacity = 16) // The outboundEnvelopePool is shared among all outbound associations