Skip to content

Commit

Permalink
expose the max direct memory allowed in jvm info, and guess better th…
Browse files Browse the repository at this point in the history
…en receive buffer size predictor size based on it
  • Loading branch information
kimchy committed Jul 31, 2012
1 parent bbc45fe commit 8dcee09
Show file tree
Hide file tree
Showing 7 changed files with 68 additions and 12 deletions.
4 changes: 4 additions & 0 deletions bin/elasticsearch.bat
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ if NOT "%ES_HEAP_NEWSIZE%" == "" (
set JAVA_OPTS=%JAVA_OPTS% -Xmn%ES_HEAP_NEWSIZE% set JAVA_OPTS=%JAVA_OPTS% -Xmn%ES_HEAP_NEWSIZE%
) )


if NOT "%ES_DIRECT_SIZE%" == "" (
set JAVA_OPTS=%JAVA_OPTS% -XX:MaxDirectMemorySize=%ES_DIRECT_SIZE%
)

set JAVA_OPTS=%JAVA_OPTS% -Xss256k set JAVA_OPTS=%JAVA_OPTS% -Xss256k


REM Enable aggressive optimizations in the JVM REM Enable aggressive optimizations in the JVM
Expand Down
9 changes: 5 additions & 4 deletions bin/elasticsearch.in.sh
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@ if [ "x$ES_HEAP_NEWSIZE" != "x" ]; then
JAVA_OPTS="$JAVA_OPTS -Xmn${ES_HEAP_NEWSIZE}" JAVA_OPTS="$JAVA_OPTS -Xmn${ES_HEAP_NEWSIZE}"
fi fi


# max direct memory
if [ "x$ES_DIRECT_SIZE" != "x" ]; then
JAVA_OPTS="$JAVA_OPTS -XX:MaxDirectMemorySize=${ES_DIRECT_SIZE}"
fi

# reduce the per-thread stack size # reduce the per-thread stack size
JAVA_OPTS="$JAVA_OPTS -Xss256k" JAVA_OPTS="$JAVA_OPTS -Xss256k"


Expand All @@ -34,10 +39,6 @@ JAVA_OPTS="$JAVA_OPTS -Djava.awt.headless=true"
# Force the JVM to use IPv4 stack # Force the JVM to use IPv4 stack
# JAVA_OPTS="$JAVA_OPTS -Djava.net.preferIPv4Stack=true" # JAVA_OPTS="$JAVA_OPTS -Djava.net.preferIPv4Stack=true"


# Enable aggressive optimizations in the JVM
# - Disabled by default as it might cause the JVM to crash
# JAVA_OPTS="$JAVA_OPTS -XX:+AggressiveOpts"

JAVA_OPTS="$JAVA_OPTS -XX:+UseParNewGC" JAVA_OPTS="$JAVA_OPTS -XX:+UseParNewGC"
JAVA_OPTS="$JAVA_OPTS -XX:+UseConcMarkSweepGC" JAVA_OPTS="$JAVA_OPTS -XX:+UseConcMarkSweepGC"


Expand Down
6 changes: 6 additions & 0 deletions src/deb/default/elasticsearch
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@
# Heap Size (defaults to 256m min, 1g max) # Heap Size (defaults to 256m min, 1g max)
#ES_HEAP_SIZE=2g #ES_HEAP_SIZE=2g


# Heap new generation
#ES_HEAP_NEWSIZE=

# max direct memory
#ES_DIRECT_SIZE=

# Maximum number of open files, defaults to 65535. # Maximum number of open files, defaults to 65535.
#MAX_OPEN_FILES=65535 #MAX_OPEN_FILES=65535


Expand Down
8 changes: 8 additions & 0 deletions src/deb/init.d/elasticsearch
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -62,6 +62,12 @@ ES_HOME=/usr/share/$NAME
# Heap Size (defaults to 256m min, 1g max) # Heap Size (defaults to 256m min, 1g max)
#ES_HEAP_SIZE=2g #ES_HEAP_SIZE=2g


# Heap new generation
#ES_HEAP_NEWSIZE=

# max direct memory
#ES_DIRECT_SIZE=

# Additional Java OPTS # Additional Java OPTS
#ES_JAVA_OPTS= #ES_JAVA_OPTS=


Expand Down Expand Up @@ -99,6 +105,8 @@ DAEMON=$ES_HOME/bin/elasticsearch
DAEMON_OPTS="-p $PID_FILE -Des.default.config=$CONF_FILE -Des.default.path.home=$ES_HOME -Des.default.path.logs=$LOG_DIR -Des.default.path.data=$DATA_DIR -Des.default.path.work=$WORK_DIR -Des.default.path.conf=$CONF_DIR" DAEMON_OPTS="-p $PID_FILE -Des.default.config=$CONF_FILE -Des.default.path.home=$ES_HOME -Des.default.path.logs=$LOG_DIR -Des.default.path.data=$DATA_DIR -Des.default.path.work=$WORK_DIR -Des.default.path.conf=$CONF_DIR"


export ES_HEAP_SIZE export ES_HEAP_SIZE
export ES_HEAP_NEWSIZE
export ES_DIRECT_SIZE
export ES_JAVA_OPTS export ES_JAVA_OPTS


# Check DAEMON exists # Check DAEMON exists
Expand Down
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import org.elasticsearch.common.unit.ByteSizeValue; import org.elasticsearch.common.unit.ByteSizeValue;
import org.elasticsearch.http.*; import org.elasticsearch.http.*;
import org.elasticsearch.http.HttpRequest; import org.elasticsearch.http.HttpRequest;
import org.elasticsearch.monitor.jvm.JvmInfo;
import org.elasticsearch.transport.BindTransportException; import org.elasticsearch.transport.BindTransportException;
import org.jboss.netty.bootstrap.ServerBootstrap; import org.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.channel.*; import org.jboss.netty.channel.*;
Expand Down Expand Up @@ -131,9 +132,16 @@ public NettyHttpServerTransport(Settings settings, NetworkService networkService
this.tcpSendBufferSize = componentSettings.getAsBytesSize("tcp_send_buffer_size", settings.getAsBytesSize(TCP_SEND_BUFFER_SIZE, TCP_DEFAULT_SEND_BUFFER_SIZE)); this.tcpSendBufferSize = componentSettings.getAsBytesSize("tcp_send_buffer_size", settings.getAsBytesSize(TCP_SEND_BUFFER_SIZE, TCP_DEFAULT_SEND_BUFFER_SIZE));
this.tcpReceiveBufferSize = componentSettings.getAsBytesSize("tcp_receive_buffer_size", settings.getAsBytesSize(TCP_RECEIVE_BUFFER_SIZE, TCP_DEFAULT_RECEIVE_BUFFER_SIZE)); this.tcpReceiveBufferSize = componentSettings.getAsBytesSize("tcp_receive_buffer_size", settings.getAsBytesSize(TCP_RECEIVE_BUFFER_SIZE, TCP_DEFAULT_RECEIVE_BUFFER_SIZE));


long defaultReceiverPredictor = 512 * 1024;
if (JvmInfo.jvmInfo().mem().directMemoryMax().bytes() > 0) {
// we can guess a better default...
long l = (long) ((0.3 * JvmInfo.jvmInfo().mem().directMemoryMax().bytes()) / workerCount);
defaultReceiverPredictor = Math.min(defaultReceiverPredictor, Math.max(l, 64 * 1024));
}

// See AdaptiveReceiveBufferSizePredictor#DEFAULT_XXX for default values in netty..., we can use higher ones for us, even fixed one // See AdaptiveReceiveBufferSizePredictor#DEFAULT_XXX for default values in netty..., we can use higher ones for us, even fixed one
ByteSizeValue receivePredictorMin = componentSettings.getAsBytesSize("receive_predictor_min", componentSettings.getAsBytesSize("receive_predictor_size", ByteSizeValue.parseBytesSizeValue("512k"))); ByteSizeValue receivePredictorMin = componentSettings.getAsBytesSize("receive_predictor_min", componentSettings.getAsBytesSize("receive_predictor_size", new ByteSizeValue(defaultReceiverPredictor)));
ByteSizeValue receivePredictorMax = componentSettings.getAsBytesSize("receive_predictor_max", componentSettings.getAsBytesSize("receive_predictor_size", ByteSizeValue.parseBytesSizeValue("512k"))); ByteSizeValue receivePredictorMax = componentSettings.getAsBytesSize("receive_predictor_max", componentSettings.getAsBytesSize("receive_predictor_size", new ByteSizeValue(defaultReceiverPredictor)));
if (receivePredictorMax.bytes() == receivePredictorMin.bytes()) { if (receivePredictorMax.bytes() == receivePredictorMin.bytes()) {
receiveBufferSizePredictorFactory = new FixedReceiveBufferSizePredictorFactory((int) receivePredictorMax.bytes()); receiveBufferSizePredictorFactory = new FixedReceiveBufferSizePredictorFactory((int) receivePredictorMax.bytes());
} else { } else {
Expand All @@ -150,8 +158,8 @@ public NettyHttpServerTransport(Settings settings, NetworkService networkService
} }
this.maxContentLength = maxContentLength; this.maxContentLength = maxContentLength;


logger.debug("using max_chunk_size[{}], max_header_size[{}], max_initial_line_length[{}], max_content_length[{}]", logger.debug("using max_chunk_size[{}], max_header_size[{}], max_initial_line_length[{}], max_content_length[{}], receive_predictor[{}->{}]",
maxChunkSize, maxHeaderSize, maxInitialLineLength, this.maxContentLength); maxChunkSize, maxHeaderSize, maxInitialLineLength, this.maxContentLength, receivePredictorMin, receivePredictorMax);
} }


public void httpServerAdapter(HttpServerAdapter httpServerAdapter) { public void httpServerAdapter(HttpServerAdapter httpServerAdapter) {
Expand Down
21 changes: 21 additions & 0 deletions src/main/java/org/elasticsearch/monitor/jvm/JvmInfo.java
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -67,6 +67,12 @@ public class JvmInfo implements Streamable, Serializable, ToXContent {
info.mem.heapMax = memoryMXBean.getHeapMemoryUsage().getMax() < 0 ? 0 : memoryMXBean.getHeapMemoryUsage().getMax(); info.mem.heapMax = memoryMXBean.getHeapMemoryUsage().getMax() < 0 ? 0 : memoryMXBean.getHeapMemoryUsage().getMax();
info.mem.nonHeapInit = memoryMXBean.getNonHeapMemoryUsage().getInit() < 0 ? 0 : memoryMXBean.getNonHeapMemoryUsage().getInit(); info.mem.nonHeapInit = memoryMXBean.getNonHeapMemoryUsage().getInit() < 0 ? 0 : memoryMXBean.getNonHeapMemoryUsage().getInit();
info.mem.nonHeapMax = memoryMXBean.getNonHeapMemoryUsage().getMax() < 0 ? 0 : memoryMXBean.getNonHeapMemoryUsage().getMax(); info.mem.nonHeapMax = memoryMXBean.getNonHeapMemoryUsage().getMax() < 0 ? 0 : memoryMXBean.getNonHeapMemoryUsage().getMax();
try {
Class<?> vmClass = Class.forName("sun.misc.VM");
info.mem.directMemoryMax = (Long) vmClass.getMethod("maxDirectMemory").invoke(null);
} catch (Throwable t) {
// ignore
}
info.inputArguments = runtimeMXBean.getInputArguments().toArray(new String[runtimeMXBean.getInputArguments().size()]); info.inputArguments = runtimeMXBean.getInputArguments().toArray(new String[runtimeMXBean.getInputArguments().size()]);
info.bootClassPath = runtimeMXBean.getBootClassPath(); info.bootClassPath = runtimeMXBean.getBootClassPath();
info.classPath = runtimeMXBean.getClassPath(); info.classPath = runtimeMXBean.getClassPath();
Expand Down Expand Up @@ -276,6 +282,8 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
builder.field(Fields.NON_HEAP_INIT_IN_BYTES, mem.nonHeapInit); builder.field(Fields.NON_HEAP_INIT_IN_BYTES, mem.nonHeapInit);
builder.field(Fields.NON_HEAP_MAX, mem.nonHeapMax().toString()); builder.field(Fields.NON_HEAP_MAX, mem.nonHeapMax().toString());
builder.field(Fields.NON_HEAP_MAX_IN_BYTES, mem.nonHeapMax); builder.field(Fields.NON_HEAP_MAX_IN_BYTES, mem.nonHeapMax);
builder.field(Fields.DIRECT_MAX, mem.directMemoryMax().toString());
builder.field(Fields.DIRECT_MAX_IN_BYTES, mem.directMemoryMax().bytes());
builder.endObject(); builder.endObject();


builder.endObject(); builder.endObject();
Expand All @@ -300,6 +308,8 @@ static final class Fields {
static final XContentBuilderString NON_HEAP_INIT_IN_BYTES = new XContentBuilderString("non_heap_init_in_bytes"); static final XContentBuilderString NON_HEAP_INIT_IN_BYTES = new XContentBuilderString("non_heap_init_in_bytes");
static final XContentBuilderString NON_HEAP_MAX = new XContentBuilderString("non_heap_max"); static final XContentBuilderString NON_HEAP_MAX = new XContentBuilderString("non_heap_max");
static final XContentBuilderString NON_HEAP_MAX_IN_BYTES = new XContentBuilderString("non_heap_max_in_bytes"); static final XContentBuilderString NON_HEAP_MAX_IN_BYTES = new XContentBuilderString("non_heap_max_in_bytes");
static final XContentBuilderString DIRECT_MAX = new XContentBuilderString("direct_max");
static final XContentBuilderString DIRECT_MAX_IN_BYTES = new XContentBuilderString("direct_max_in_bytes");
} }


public static JvmInfo readJvmInfo(StreamInput in) throws IOException { public static JvmInfo readJvmInfo(StreamInput in) throws IOException {
Expand Down Expand Up @@ -359,6 +369,7 @@ public static class Mem implements Streamable, Serializable {
long heapMax = 0; long heapMax = 0;
long nonHeapInit = 0; long nonHeapInit = 0;
long nonHeapMax = 0; long nonHeapMax = 0;
long directMemoryMax = 0;


Mem() { Mem() {
} }
Expand Down Expand Up @@ -395,6 +406,14 @@ public ByteSizeValue getNonHeapMax() {
return nonHeapMax(); return nonHeapMax();
} }


public ByteSizeValue directMemoryMax() {
return new ByteSizeValue(directMemoryMax);
}

public ByteSizeValue getDirectMemoryMax() {
return directMemoryMax();
}

public static Mem readMem(StreamInput in) throws IOException { public static Mem readMem(StreamInput in) throws IOException {
Mem mem = new Mem(); Mem mem = new Mem();
mem.readFrom(in); mem.readFrom(in);
Expand All @@ -407,6 +426,7 @@ public void readFrom(StreamInput in) throws IOException {
heapMax = in.readVLong(); heapMax = in.readVLong();
nonHeapInit = in.readVLong(); nonHeapInit = in.readVLong();
nonHeapMax = in.readVLong(); nonHeapMax = in.readVLong();
directMemoryMax = in.readVLong();
} }


@Override @Override
Expand All @@ -415,6 +435,7 @@ public void writeTo(StreamOutput out) throws IOException {
out.writeVLong(heapMax); out.writeVLong(heapMax);
out.writeVLong(nonHeapInit); out.writeVLong(nonHeapInit);
out.writeVLong(nonHeapMax); out.writeVLong(nonHeapMax);
out.writeVLong(directMemoryMax);
} }
} }
} }
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import org.elasticsearch.common.transport.TransportAddress; import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.common.unit.ByteSizeValue; import org.elasticsearch.common.unit.ByteSizeValue;
import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.monitor.jvm.JvmInfo;
import org.elasticsearch.threadpool.ThreadPool; import org.elasticsearch.threadpool.ThreadPool;
import org.elasticsearch.transport.*; import org.elasticsearch.transport.*;
import org.elasticsearch.transport.support.TransportStreams; import org.elasticsearch.transport.support.TransportStreams;
Expand Down Expand Up @@ -176,17 +177,24 @@ public NettyTransport(Settings settings, ThreadPool threadPool, NetworkService n
this.maxCumulationBufferCapacity = componentSettings.getAsBytesSize("max_cumulation_buffer_capacity", null); this.maxCumulationBufferCapacity = componentSettings.getAsBytesSize("max_cumulation_buffer_capacity", null);
this.maxCompositeBufferComponents = componentSettings.getAsInt("max_composite_buffer_components", -1); this.maxCompositeBufferComponents = componentSettings.getAsInt("max_composite_buffer_components", -1);


long defaultReceiverPredictor = 512 * 1024;
if (JvmInfo.jvmInfo().mem().directMemoryMax().bytes() > 0) {
// we can guess a better default...
long l = (long) ((0.3 * JvmInfo.jvmInfo().mem().directMemoryMax().bytes()) / workerCount);
defaultReceiverPredictor = Math.min(defaultReceiverPredictor, Math.max(l, 64 * 1024));
}

// See AdaptiveReceiveBufferSizePredictor#DEFAULT_XXX for default values in netty..., we can use higher ones for us, even fixed one // See AdaptiveReceiveBufferSizePredictor#DEFAULT_XXX for default values in netty..., we can use higher ones for us, even fixed one
ByteSizeValue receivePredictorMin = componentSettings.getAsBytesSize("receive_predictor_min", componentSettings.getAsBytesSize("receive_predictor_size", ByteSizeValue.parseBytesSizeValue("512k"))); ByteSizeValue receivePredictorMin = componentSettings.getAsBytesSize("receive_predictor_min", componentSettings.getAsBytesSize("receive_predictor_size", new ByteSizeValue(defaultReceiverPredictor)));
ByteSizeValue receivePredictorMax = componentSettings.getAsBytesSize("receive_predictor_max", componentSettings.getAsBytesSize("receive_predictor_size", ByteSizeValue.parseBytesSizeValue("512k"))); ByteSizeValue receivePredictorMax = componentSettings.getAsBytesSize("receive_predictor_max", componentSettings.getAsBytesSize("receive_predictor_size", new ByteSizeValue(defaultReceiverPredictor)));
if (receivePredictorMax.bytes() == receivePredictorMin.bytes()) { if (receivePredictorMax.bytes() == receivePredictorMin.bytes()) {
receiveBufferSizePredictorFactory = new FixedReceiveBufferSizePredictorFactory((int) receivePredictorMax.bytes()); receiveBufferSizePredictorFactory = new FixedReceiveBufferSizePredictorFactory((int) receivePredictorMax.bytes());
} else { } else {
receiveBufferSizePredictorFactory = new AdaptiveReceiveBufferSizePredictorFactory((int) receivePredictorMin.bytes(), (int) receivePredictorMin.bytes(), (int) receivePredictorMax.bytes()); receiveBufferSizePredictorFactory = new AdaptiveReceiveBufferSizePredictorFactory((int) receivePredictorMin.bytes(), (int) receivePredictorMin.bytes(), (int) receivePredictorMax.bytes());
} }


logger.debug("using worker_count[{}], port[{}], bind_host[{}], publish_host[{}], compress[{}], connect_timeout[{}], connections_per_node[{}/{}/{}]", logger.debug("using worker_count[{}], port[{}], bind_host[{}], publish_host[{}], compress[{}], connect_timeout[{}], connections_per_node[{}/{}/{}], receive_predictor[{}->{}]",
workerCount, port, bindHost, publishHost, compress, connectTimeout, connectionsPerNodeLow, connectionsPerNodeMed, connectionsPerNodeHigh); workerCount, port, bindHost, publishHost, compress, connectTimeout, connectionsPerNodeLow, connectionsPerNodeMed, connectionsPerNodeHigh, receivePredictorMin, receivePredictorMax);
} }


public Settings settings() { public Settings settings() {
Expand Down

0 comments on commit 8dcee09

Please sign in to comment.