Issue #1861 - Limit total bytes pooled by ByteBufferPools.
Added a bytebufferpool module to be able to configure the ByteBufferPool used by ServerConnectors. Added JMX methods to the ByteBufferPool implementations. Signed-off-by: Simone Bordet <simone.bordet@gmail.com>
This commit is contained in:
parent
16933f8df2
commit
676b7ecaba
|
@ -22,6 +22,7 @@ import java.nio.ByteBuffer;
|
|||
import java.util.concurrent.atomic.AtomicLong;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.eclipse.jetty.util.annotation.ManagedAttribute;
|
||||
import org.eclipse.jetty.util.annotation.ManagedObject;
|
||||
import org.eclipse.jetty.util.annotation.ManagedOperation;
|
||||
|
||||
|
@ -80,7 +81,18 @@ abstract class AbstractByteBufferPool implements ByteBufferPool
|
|||
}
|
||||
}
|
||||
|
||||
@ManagedOperation(value = "Returns the memory occupied by this ByteBufferPool in bytes", impact = "INFO")
|
||||
@ManagedAttribute("The bytes retained by direct ByteBuffers")
|
||||
public long getDirectMemory()
|
||||
{
|
||||
return getMemory(true);
|
||||
}
|
||||
|
||||
@ManagedAttribute("The bytes retained by heap ByteBuffers")
|
||||
public long getHeapMemory()
|
||||
{
|
||||
return getMemory(false);
|
||||
}
|
||||
|
||||
public long getMemory(boolean direct)
|
||||
{
|
||||
AtomicLong memory = direct ? _directMemory : _heapMemory;
|
||||
|
|
|
@ -19,8 +19,11 @@
|
|||
package org.eclipse.jetty.io;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.Arrays;
|
||||
import java.util.Objects;
|
||||
import java.util.function.IntFunction;
|
||||
|
||||
import org.eclipse.jetty.util.annotation.ManagedAttribute;
|
||||
import org.eclipse.jetty.util.annotation.ManagedObject;
|
||||
|
||||
/**
|
||||
|
@ -196,6 +199,26 @@ public class ArrayByteBufferPool extends AbstractByteBufferPool
|
|||
return bucket;
|
||||
}
|
||||
|
||||
@ManagedAttribute("The number of pooled direct ByteBuffers")
|
||||
public long getDirectByteBufferCount()
|
||||
{
|
||||
return getByteBufferCount(true);
|
||||
}
|
||||
|
||||
@ManagedAttribute("The number of pooled heap ByteBuffers")
|
||||
public long getHeapByteBufferCount()
|
||||
{
|
||||
return getByteBufferCount(false);
|
||||
}
|
||||
|
||||
private long getByteBufferCount(boolean direct)
|
||||
{
|
||||
return Arrays.stream(bucketsFor(direct))
|
||||
.filter(Objects::nonNull)
|
||||
.mapToLong(Bucket::size)
|
||||
.sum();
|
||||
}
|
||||
|
||||
// Package local for testing
|
||||
ByteBufferPool.Bucket[] bucketsFor(boolean direct)
|
||||
{
|
||||
|
|
|
@ -26,6 +26,7 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||
import java.util.function.Function;
|
||||
|
||||
import org.eclipse.jetty.util.BufferUtil;
|
||||
import org.eclipse.jetty.util.annotation.ManagedAttribute;
|
||||
import org.eclipse.jetty.util.annotation.ManagedObject;
|
||||
|
||||
/**
|
||||
|
@ -182,6 +183,25 @@ public class MappedByteBufferPool extends AbstractByteBufferPool
|
|||
return bucket;
|
||||
}
|
||||
|
||||
@ManagedAttribute("The number of pooled direct ByteBuffers")
|
||||
public long getDirectByteBufferCount()
|
||||
{
|
||||
return getByteBufferCount(true);
|
||||
}
|
||||
|
||||
@ManagedAttribute("The number of pooled heap ByteBuffers")
|
||||
public long getHeapByteBufferCount()
|
||||
{
|
||||
return getByteBufferCount(false);
|
||||
}
|
||||
|
||||
private long getByteBufferCount(boolean direct)
|
||||
{
|
||||
return bucketsFor(direct).values().stream()
|
||||
.mapToLong(Bucket::size)
|
||||
.sum();
|
||||
}
|
||||
|
||||
// Package local for testing
|
||||
ConcurrentMap<Integer, Bucket> bucketsFor(boolean direct)
|
||||
{
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
|
||||
<Configure>
|
||||
<New id="byteBufferPool" class="org.eclipse.jetty.io.ArrayByteBufferPool">
|
||||
<Arg type="int"><Property name="jetty.byteBufferPool.minCapacity" default="0"/></Arg>
|
||||
<Arg type="int"><Property name="jetty.byteBufferPool.factor" default="1024"/></Arg>
|
||||
<Arg type="int"><Property name="jetty.byteBufferPool.maxCapacity" default="65536"/></Arg>
|
||||
<Arg type="int"><Property name="jetty.byteBufferPool.maxQueueLength" default="-1"/></Arg>
|
||||
<Arg type="long"><Property name="jetty.byteBufferPool.maxHeapMemory" default="-1"/></Arg>
|
||||
<Arg type="long"><Property name="jetty.byteBufferPool.maxDirectMemory" default="-1"/></Arg>
|
||||
</New>
|
||||
</Configure>
|
|
@ -26,6 +26,10 @@
|
|||
<Configure id="Server" class="org.eclipse.jetty.server.Server">
|
||||
<Arg name="threadpool"><Ref refid="threadPool"/></Arg>
|
||||
|
||||
<Call name="addBean">
|
||||
<Arg><Ref refid="byteBufferPool"/></Arg>
|
||||
</Call>
|
||||
|
||||
<!-- =========================================================== -->
|
||||
<!-- Add shared Scheduler instance -->
|
||||
<!-- =========================================================== -->
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
|
||||
|
||||
[description]
|
||||
Configures the ByteBufferPool used by ServerConnectors.
|
||||
|
||||
[xml]
|
||||
etc/jetty-bytebufferpool.xml
|
||||
|
||||
[ini-template]
|
||||
### Server ByteBufferPool Configuration
|
||||
## Minimum capacity to pool ByteBuffers
|
||||
#jetty.byteBufferPool.minCapacity=0
|
||||
|
||||
## Maximum capacity to pool ByteBuffers
|
||||
#jetty.byteBufferPool.maxCapacity=65536
|
||||
|
||||
## Capacity factor
|
||||
#jetty.byteBufferPool.factor=1024
|
||||
|
||||
## Maximum queue length for each bucket (-1 for unbounded)
|
||||
#jetty.byteBufferPool.maxQueueLength=-1
|
||||
|
||||
## Maximum heap memory retainable by the pool (-1 for unlimited)
|
||||
#jetty.byteBufferPool.maxHeapMemory=-1
|
||||
|
||||
## Maximum direct memory retainable by the pool (-1 for unlimited)
|
||||
#jetty.byteBufferPool.maxDirectMemory=-1
|
|
@ -11,6 +11,7 @@ logging
|
|||
|
||||
[depend]
|
||||
threadpool
|
||||
bytebufferpool
|
||||
|
||||
[lib]
|
||||
lib/servlet-api-3.1.jar
|
||||
|
|
Loading…
Reference in New Issue