Merge pull request #17675 from jasontedor/java-opts

Add JVM options configuration file
This commit is contained in:
Jason Tedor 2016-04-12 23:07:40 -04:00
commit a581d7cca4
23 changed files with 420 additions and 303 deletions

View File

@ -130,8 +130,7 @@ class NodeInfo {
} }
env = [ env = [
'JAVA_HOME' : project.javaHome, 'JAVA_HOME' : project.javaHome
'ES_GC_OPTS': config.jvmArgs // we pass these with the undocumented gc opts so the argline can set gc, etc
] ]
args.addAll("-E", "es.node.portsfile=true") args.addAll("-E", "es.node.portsfile=true")
env.put('ES_JAVA_OPTS', config.systemProperties.collect { key, value -> "-D${key}=${value}" }.join(" ")) env.put('ES_JAVA_OPTS', config.systemProperties.collect { key, value -> "-D${key}=${value}" }.join(" "))

View File

@ -145,6 +145,7 @@ subprojects {
configFiles = copySpec { configFiles = copySpec {
from '../src/main/resources/config' from '../src/main/resources/config'
MavenFilteringHack.filter(it, expansions)
} }
commonFiles = copySpec { commonFiles = copySpec {
@ -242,6 +243,7 @@ configure(subprojects.findAll { ['deb', 'rpm'].contains(it.name) }) {
up to date when the directory is created, which it would by default. And up to date when the directory is created, which it would by default. And
that'll happen when createEtc runs. */ that'll happen when createEtc runs. */
outputs.file "${packagingFiles}/etc/elasticsearch/elasticsearch.yml" outputs.file "${packagingFiles}/etc/elasticsearch/elasticsearch.yml"
outputs.file "${packagingFiles}/etc/elasticsearch/jvm.options"
outputs.file "${packagingFiles}/etc/elasticsearch/logging.yml" outputs.file "${packagingFiles}/etc/elasticsearch/logging.yml"
} }
@ -305,6 +307,7 @@ configure(subprojects.findAll { ['deb', 'rpm'].contains(it.name) }) {
} }
configurationFile '/etc/elasticsearch/elasticsearch.yml' configurationFile '/etc/elasticsearch/elasticsearch.yml'
configurationFile '/etc/elasticsearch/jvm.options'
configurationFile '/etc/elasticsearch/logging.yml' configurationFile '/etc/elasticsearch/logging.yml'
into('/etc') { into('/etc') {
from "${packagingFiles}/etc" from "${packagingFiles}/etc"

View File

@ -46,16 +46,6 @@ ES_GROUP=elasticsearch
# Directory where the Elasticsearch binary distribution resides # Directory where the Elasticsearch binary distribution resides
ES_HOME=/usr/share/$NAME ES_HOME=/usr/share/$NAME
# Heap size defaults to 256m min, 1g max
# Set ES_HEAP_SIZE to 50% of available RAM, but no more than 31g
#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=
@ -77,9 +67,6 @@ CONF_DIR=/etc/$NAME
# Maximum number of VMA (Virtual Memory Areas) a process can own # Maximum number of VMA (Virtual Memory Areas) a process can own
MAX_MAP_COUNT=262144 MAX_MAP_COUNT=262144
# Path to the GC log file
#ES_GC_LOG_FILE=/var/log/elasticsearch/gc.log
# Elasticsearch PID file directory # Elasticsearch PID file directory
PID_DIR="/var/run/elasticsearch" PID_DIR="/var/run/elasticsearch"
@ -101,11 +88,7 @@ PID_FILE="$PID_DIR/$NAME.pid"
DAEMON=$ES_HOME/bin/elasticsearch DAEMON=$ES_HOME/bin/elasticsearch
DAEMON_OPTS="-d -p $PID_FILE -Ees.default.path.logs=$LOG_DIR -Ees.default.path.data=$DATA_DIR -Ees.default.path.conf=$CONF_DIR" DAEMON_OPTS="-d -p $PID_FILE -Ees.default.path.logs=$LOG_DIR -Ees.default.path.data=$DATA_DIR -Ees.default.path.conf=$CONF_DIR"
export ES_HEAP_SIZE
export ES_HEAP_NEWSIZE
export ES_DIRECT_SIZE
export ES_JAVA_OPTS export ES_JAVA_OPTS
export ES_GC_LOG_FILE
export JAVA_HOME export JAVA_HOME
export ES_INCLUDE export ES_INCLUDE
@ -129,11 +112,6 @@ case "$1" in
start) start)
checkJava checkJava
if [ -n "$MAX_LOCKED_MEMORY" -a -z "$ES_HEAP_SIZE" ]; then
log_failure_msg "MAX_LOCKED_MEMORY is set - ES_HEAP_SIZE must also be set"
exit 1
fi
log_daemon_msg "Starting $DESC" log_daemon_msg "Starting $DESC"
pid=`pidofproc -p $PID_FILE elasticsearch` pid=`pidofproc -p $PID_FILE elasticsearch`

View File

@ -59,11 +59,7 @@ exec="$ES_HOME/bin/elasticsearch"
prog="elasticsearch" prog="elasticsearch"
pidfile="$PID_DIR/${prog}.pid" pidfile="$PID_DIR/${prog}.pid"
export ES_HEAP_SIZE
export ES_HEAP_NEWSIZE
export ES_DIRECT_SIZE
export ES_JAVA_OPTS export ES_JAVA_OPTS
export ES_GC_LOG_FILE
export ES_STARTUP_SLEEP_TIME export ES_STARTUP_SLEEP_TIME
export JAVA_HOME export JAVA_HOME
export ES_INCLUDE export ES_INCLUDE
@ -91,10 +87,7 @@ checkJava() {
start() { start() {
checkJava checkJava
[ -x $exec ] || exit 5 [ -x $exec ] || exit 5
if [ -n "$MAX_LOCKED_MEMORY" -a -z "$ES_HEAP_SIZE" ]; then
echo "MAX_LOCKED_MEMORY is set - ES_HEAP_SIZE must also be set"
return 7
fi
if [ -n "$MAX_OPEN_FILES" ]; then if [ -n "$MAX_OPEN_FILES" ]; then
ulimit -n $MAX_OPEN_FILES ulimit -n $MAX_OPEN_FILES
fi fi
@ -104,7 +97,6 @@ start() {
if [ -n "$MAX_MAP_COUNT" -a -f /proc/sys/vm/max_map_count ]; then if [ -n "$MAX_MAP_COUNT" -a -f /proc/sys/vm/max_map_count ]; then
sysctl -q -w vm.max_map_count=$MAX_MAP_COUNT sysctl -q -w vm.max_map_count=$MAX_MAP_COUNT
fi fi
export ES_GC_LOG_FILE
# Ensure that the PID_DIR exists (it is cleaned at OS startup time) # Ensure that the PID_DIR exists (it is cleaned at OS startup time)
if [ -n "$PID_DIR" ] && [ ! -e "$PID_DIR" ]; then if [ -n "$PID_DIR" ] && [ ! -e "$PID_DIR" ]; then

View File

@ -20,25 +20,12 @@
# Elasticsearch PID directory # Elasticsearch PID directory
#PID_DIR=/var/run/elasticsearch #PID_DIR=/var/run/elasticsearch
# Heap size defaults to ${heap.min} min, ${heap.max} max
# Set ES_HEAP_SIZE to 50% of available RAM, but no more than 31g
#ES_HEAP_SIZE=2g
# Heap new generation
#ES_HEAP_NEWSIZE=
# Maximum direct memory
#ES_DIRECT_SIZE=
# Additional Java OPTS # Additional Java OPTS
#ES_JAVA_OPTS= #ES_JAVA_OPTS=
# Configure restart on package upgrade (true, every other setting will lead to not restarting) # Configure restart on package upgrade (true, every other setting will lead to not restarting)
#ES_RESTART_ON_UPGRADE=true #ES_RESTART_ON_UPGRADE=true
# Path to the GC log file
#ES_GC_LOG_FILE=/var/log/elasticsearch/gc.log
################################ ################################
# Elasticsearch service # Elasticsearch service
################################ ################################
@ -67,7 +54,7 @@ ES_STARTUP_SLEEP_TIME=5
# The maximum number of bytes of memory that may be locked into RAM # The maximum number of bytes of memory that may be locked into RAM
# Set to "unlimited" if you use the 'bootstrap.mlockall: true' option # Set to "unlimited" if you use the 'bootstrap.mlockall: true' option
# in elasticsearch.yml (ES_HEAP_SIZE must also be set). # in elasticsearch.yml.
# When using Systemd, the LimitMEMLOCK property must be set # When using Systemd, the LimitMEMLOCK property must be set
# in /usr/lib/systemd/system/elasticsearch.service # in /usr/lib/systemd/system/elasticsearch.service
#MAX_LOCKED_MEMORY=unlimited #MAX_LOCKED_MEMORY=unlimited

View File

@ -6,14 +6,14 @@
# behavior, those variables are: # behavior, those variables are:
# #
# ES_CLASSPATH -- A Java classpath containing everything necessary to run. # ES_CLASSPATH -- A Java classpath containing everything necessary to run.
# JAVA_OPTS -- Additional arguments to the JVM for heap size, etc # ES_JVM_OPTIONS -- Path to file containing JVM options
# ES_JAVA_OPTS -- External Java Opts on top of the defaults set # ES_JAVA_OPTS -- External Java Opts on top of the defaults set
# #
# Optionally, exact memory values can be set using the `ES_JAVA_OPTS`.
# Note that the Xms and Xmx lines in the JVM options file must be
# commented out. Sample format include "512m", and "10g".
# #
# Optionally, exact memory values can be set using the following values, note, # ES_JAVA_OPTS="-Xms8g -Xmx8g" ./bin/elasticsearch
# they can still be set using the `ES_JAVA_OPTS`. Sample format include "512m", and "10g".
#
# ES_HEAP_SIZE -- Sets both the minimum and maximum memory to allocate (recommended)
# #
# As a convenience, a fragment of shell is sourced in order to set one or # As a convenience, a fragment of shell is sourced in order to set one or
# more of these variables. This so-called `include' can be placed in a # more of these variables. This so-called `include' can be placed in a
@ -44,6 +44,7 @@
# Check to see if you are trying to run this without building it first. Gradle # Check to see if you are trying to run this without building it first. Gradle
# will replace the project.name with _something_. # will replace the project.name with _something_.
if echo '${project.name}' | grep project.name > /dev/null ; then if echo '${project.name}' | grep project.name > /dev/null ; then
cat >&2 << EOF cat >&2 << EOF
Error: You must build the project with Maven or download a pre-built package Error: You must build the project with Maven or download a pre-built package
@ -53,6 +54,41 @@ EOF
exit 1 exit 1
fi fi
# TODO: remove for Elasticsearch 6.x
unsupported_environment_variable() {
if test -n "$1"; then
echo "$2=$1: $3"
fi
}
if test -n "$ES_MIN_MEM" ||
test -n "$ES_MAX_MEM" ||
test -n "$ES_HEAP_SIZE" ||
test -n "$ES_HEAP_NEWSIZE" ||
test -n "$ES_DIRECT_SIZE" ||
test -n "$ES_USE_IPV4" ||
test -n "$ES_GC_OPTS" ||
test -n "$ES_GC_LOG_FILE"; then
echo "Error: encountered environment variables that are no longer supported"
echo "Use jvm.options or ES_JAVA_OPTS to configure the JVM"
unsupported_environment_variable "$ES_MIN_MEM" ES_MIN_MEM "set -Xms$ES_MIN_MEM in jvm.options or add \"-Xms$ES_MIN_MEM\" to ES_JAVA_OPTS"
unsupported_environment_variable "$ES_MAX_MEM" ES_MAX_MEM "set -Xms$ES_MAX_MEM in jvm.options or add \"-Xms$ES_MAX_MEM\" to ES_JAVA_OPTS"
unsupported_environment_variable "$ES_HEAP_SIZE" ES_HEAP_SIZE "set -Xms$ES_HEAP_SIZE and -Xmx$ES_HEAP_SIZE in jvm.options or add \"-Xms$ES_HEAP_SIZE -Xmx$ES_HEAP_SIZE\" to ES_JAVA_OPTS"
unsupported_environment_variable "$ES_HEAP_NEWSIZE" ES_HEAP_NEWSIZE "set -Xmn$ES_HEAP_NEWSIZE in jvm.options or add \"-Xmn$ES_HEAP_SIZE\" to ES_JAVA_OPTS"
unsupported_environment_variable "$ES_DIRECT_SIZE" ES_DIRECT_SIZE "set -XX:MaxDirectMemorySize=$ES_DIRECT_SIZE in jvm.options or add \"-XX:MaxDirectMemorySize=$ES_DIRECT_SIZE\" to ES_JAVA_OPTS"
unsupported_environment_variable "$ES_USE_IPV4" ES_USE_IPV4 "set -Djava.net.preferIPv4Stack=true in jvm.options or add \"-Djava.net.preferIPv4Stack=true\" to ES_JAVA_OPTS"
unsupported_environment_variable "$ES_GC_OPTS" ES_GC_OPTS "set ${ES_GC_OPTS// / and } in jvm.options or add \"$ES_GC_OPTS\" to ES_JAVA_OPTS"
unsupported_environment_variable "$ES_GC_LOG_FILE" ES_GC_LOG_FILE "set -Xloggc:$ES_GC_LOG_FILE in jvm.options or add \"-Xloggc:$ES_GC_LOG_FILE\" to ES_JAVA_OPTS"
exit 1
fi
# end TODO: remove for Elasticsearch 6.x
parse_jvm_options() {
if [ -f "$1" ]; then
echo "$(grep "^-" "$1" | tr '\n' ' ')"
fi
}
CDPATH="" CDPATH=""
SCRIPT="$0" SCRIPT="$0"
@ -74,6 +110,17 @@ ES_HOME=`dirname "$SCRIPT"`/..
# make ELASTICSEARCH_HOME absolute # make ELASTICSEARCH_HOME absolute
ES_HOME=`cd "$ES_HOME"; pwd` ES_HOME=`cd "$ES_HOME"; pwd`
if [ -z "$ES_JVM_OPTIONS" ]; then
for jvm_options in "$ES_HOME"/config/jvm.options \
/etc/elasticsearch/jvm.options; do
if [ -r "$jvm_options" ]; then
ES_JVM_OPTIONS=$jvm_options
break
fi
done
fi
ES_JAVA_OPTS="$(parse_jvm_options "$ES_JVM_OPTIONS") $ES_JAVA_OPTS"
# If an include wasn't specified in the environment, then search for one... # If an include wasn't specified in the environment, then search for one...
if [ "x$ES_INCLUDE" = "x" ]; then if [ "x$ES_INCLUDE" = "x" ]; then
@ -114,10 +161,17 @@ fi
# works around https://bugs.launchpad.net/ubuntu/+source/jayatana/+bug/1441487 # works around https://bugs.launchpad.net/ubuntu/+source/jayatana/+bug/1441487
if [ "x$JAVA_TOOL_OPTIONS" != "x" ]; then if [ "x$JAVA_TOOL_OPTIONS" != "x" ]; then
echo "Warning: Ignoring JAVA_TOOL_OPTIONS=$JAVA_TOOL_OPTIONS" echo "Warning: Ignoring JAVA_TOOL_OPTIONS=$JAVA_TOOL_OPTIONS"
echo "Please pass JVM parameters via JAVA_OPTS instead" echo "Please pass JVM parameters via ES_JAVA_OPTS instead"
unset JAVA_TOOL_OPTIONS unset JAVA_TOOL_OPTIONS
fi fi
# JAVA_OPTS is not a built-in JVM mechanism but some people think it is
# so let us warn them that we are not observing the value of $JAVA_OPTS
if [ ! -z "JAVA_OPTS" ]; then
echo "Warning: Ignoring JAVA_OPTS=$JAVA_OPTS"
echo "Please pass JVM parameters via ES_JAVA_OPTS instead"
fi
# full hostname passed through cut for portability on systems that do not support hostname -s # full hostname passed through cut for portability on systems that do not support hostname -s
# export on separate line for shells that do not support combining definition and export # export on separate line for shells that do not support combining definition and export
HOSTNAME=`hostname | cut -d. -f1` HOSTNAME=`hostname | cut -d. -f1`
@ -126,10 +180,10 @@ export HOSTNAME
# manual parsing to find out, if process should be detached # manual parsing to find out, if process should be detached
daemonized=`echo $* | egrep -- '(^-d |-d$| -d |--daemonize$|--daemonize )'` daemonized=`echo $* | egrep -- '(^-d |-d$| -d |--daemonize$|--daemonize )'`
if [ -z "$daemonized" ] ; then if [ -z "$daemonized" ] ; then
exec "$JAVA" $JAVA_OPTS $ES_JAVA_OPTS -Des.path.home="$ES_HOME" -cp "$ES_CLASSPATH" \ exec "$JAVA" $ES_JAVA_OPTS -Des.path.home="$ES_HOME" -cp "$ES_CLASSPATH" \
org.elasticsearch.bootstrap.Elasticsearch "$@" org.elasticsearch.bootstrap.Elasticsearch "$@"
else else
exec "$JAVA" $JAVA_OPTS $ES_JAVA_OPTS -Des.path.home="$ES_HOME" -cp "$ES_CLASSPATH" \ exec "$JAVA" $ES_JAVA_OPTS -Des.path.home="$ES_HOME" -cp "$ES_CLASSPATH" \
org.elasticsearch.bootstrap.Elasticsearch "$@" <&- & org.elasticsearch.bootstrap.Elasticsearch "$@" <&- &
retval=$? retval=$?
pid=$! pid=$!

View File

@ -5,6 +5,30 @@ TITLE Elasticsearch ${project.version}
SET params='%*' SET params='%*'
rem TODO: remove for Elasticsearch 6.x
if not "%ES_MIN_MEM%" == "" set bad_env_var=1
if not "%ES_MAX_MEM%" == "" set bad_env_var=1
if not "%ES_HEAP_SIZE%" == "" set bad_env_var=1
if not "%ES_HEAP_NEWSIZE%" == "" set bad_env_var=1
if not "%ES_DIRECT_SIZE%" == "" set bad_env_var=1
if not "%ES_USE_IPV4%" == "" set bad_env_var=1
if not "%ES_GC_OPTS%" == "" set bad_env_var=1
if not "%ES_GC_LOG_FILE%" == "" set bad_env_var=1
if %bad_env_var% == 1 (
echo Error: encountered environment variables that are no longer supported
echo Use jvm.options or ES_JAVA_OPTS to configure the JVM
if not "%ES_MIN_MEM%" == "" echo ES_MIN_MEM=%ES_MIN_MEM%: set -Xms%ES_MIN_MEM% in jvm.options or add "-Xms%ES_MIN_MEM%" to ES_JAVA_OPTS
if not "%ES_MAX_MEM%" == "" echo ES_MAX_MEM=%ES_MAX_MEM%: set -Xms%ES_MAX_MEM% in jvm.options or add "-Xmx%ES_MAX_MEM%" to ES_JAVA_OPTS
if not "%ES_HEAP_SIZE%" == "" echo ES_HEAP_SIZE=%ES_HEAP_SIZE%: set -Xms%ES_HEAP_SIZE% and -Xmx%ES_HEAP_SIZE% in jvm.options or add "-Xms%ES_HEAP_SIZE% -Xmx%ES_HEAP_SIZE%" to ES_JAVA_OPTS
if not "%ES_HEAP_NEWSIZE%" == "" echo ES_HEAP_NEWSIZE=%ES_HEAP_NEWSIZE%: set -Xmn%ES_HEAP_NEWSIZE% in jvm.options or add "-Xmn%ES_HEAP_SIZE%" to ES_JAVA_OPTS
if not "%ES_DIRECT_SIZE%" == "" echo ES_DIRECT_SIZE=%ES_DIRECT_SIZE%: set -XX:MaxDirectMemorySize=%ES_DIRECT_SIZE% in jvm.options or add "-XX:MaxDirectMemorySize=%ES_DIRECT_SIZE%" to ES_JAVA_OPTS
if not "%ES_USE_IPV4%" == "" echo ES_USE_IPV4=%ES_USE_IPV4%: set -Djava.net.preferIPv4Stack=true in jvm.options or add "-Djava.net.preferIPv4Stack=true" to ES_JAVA_OPTS
if not "%ES_GC_OPTS%" == "" echo ES_GC_OPTS=%ES_GC_OPTS%: set %ES_GC_OPTS: = and % in jvm.options or add "%ES_GC_OPTS%" to ES_JAVA_OPTS
if not "%ES_GC_LOG_FILE%" == "" echo ES_GC_LOG_FILE=%ES_GC_LOG_FILE%: set -Xloggc:%ES_GC_LOG_FILE% in jvm.options or add "-Xloggc:%ES_GC_LOG_FILE%" to ES_JAVA_OPTS"
exit /b 1
)
rem end TODO: remove for Elasticsearch 6.x
:loop :loop
FOR /F "usebackq tokens=1* delims= " %%A IN (!params!) DO ( FOR /F "usebackq tokens=1* delims= " %%A IN (!params!) DO (
SET current=%%A SET current=%%A
@ -35,6 +59,17 @@ FOR /F "usebackq tokens=1* delims= " %%A IN (!params!) DO (
SET HOSTNAME=%COMPUTERNAME% SET HOSTNAME=%COMPUTERNAME%
if "%ES_JVM_OPTIONS%" == "" (
rem '0' is the batch file, '~dp' appends the drive and path
set ES_JVM_OPTIONS="%~dp0\..\config\jvm.options"
)
@setlocal
rem extract the options from the JVM options file %ES_JVM_OPTIONS%
rem such options are the lines beginning with '-', thus "findstr /b"
for /F "usebackq delims=" %%a in (`findstr /b \- "%ES_JVM_OPTIONS%"`) do set JVM_OPTIONS=!JVM_OPTIONS! %%a
@endlocal & set ES_JAVA_OPTS=%JVM_OPTIONS% %ES_JAVA_OPTS%
CALL "%~dp0elasticsearch.in.bat" CALL "%~dp0elasticsearch.in.bat"
IF ERRORLEVEL 1 ( IF ERRORLEVEL 1 (
IF NOT DEFINED nopauseonerror ( IF NOT DEFINED nopauseonerror (
@ -43,6 +78,6 @@ IF ERRORLEVEL 1 (
EXIT /B %ERRORLEVEL% EXIT /B %ERRORLEVEL%
) )
"%JAVA_HOME%\bin\java" %JAVA_OPTS% %ES_JAVA_OPTS% %ES_PARAMS% -cp "%ES_CLASSPATH%" "org.elasticsearch.bootstrap.Elasticsearch" !newparams! "%JAVA_HOME%\bin\java" %ES_JAVA_OPTS% %ES_PARAMS% -cp "%ES_CLASSPATH%" "org.elasticsearch.bootstrap.Elasticsearch" !newparams!
ENDLOCAL ENDLOCAL

View File

@ -10,91 +10,6 @@ EXIT /B 1
set SCRIPT_DIR=%~dp0 set SCRIPT_DIR=%~dp0
for %%I in ("%SCRIPT_DIR%..") do set ES_HOME=%%~dpfI for %%I in ("%SCRIPT_DIR%..") do set ES_HOME=%%~dpfI
REM ***** JAVA options *****
if "%ES_MIN_MEM%" == "" (
set ES_MIN_MEM=${heap.min}
)
if "%ES_MAX_MEM%" == "" (
set ES_MAX_MEM=${heap.max}
)
if NOT "%ES_HEAP_SIZE%" == "" (
set ES_MIN_MEM=%ES_HEAP_SIZE%
set ES_MAX_MEM=%ES_HEAP_SIZE%
)
REM min and max heap sizes should be set to the same value to avoid
REM stop-the-world GC pauses during resize, and so that we can lock the
REM heap in memory on startup to prevent any of it from being swapped
REM out.
set JAVA_OPTS=%JAVA_OPTS% -Xms%ES_MIN_MEM% -Xmx%ES_MAX_MEM%
REM new generation
if NOT "%ES_HEAP_NEWSIZE%" == "" (
set JAVA_OPTS=%JAVA_OPTS% -Xmn%ES_HEAP_NEWSIZE%
)
REM max direct memory
if NOT "%ES_DIRECT_SIZE%" == "" (
set JAVA_OPTS=%JAVA_OPTS% -XX:MaxDirectMemorySize=%ES_DIRECT_SIZE%
)
REM set to headless, just in case
set JAVA_OPTS=%JAVA_OPTS% -Djava.awt.headless=true
REM Force the JVM to use IPv4 stack
if NOT "%ES_USE_IPV4%" == "" (
set JAVA_OPTS=%JAVA_OPTS% -Djava.net.preferIPv4Stack=true
)
REM Add gc options. ES_GC_OPTS is unsupported, for internal testing
if "%ES_GC_OPTS%" == "" (
set ES_GC_OPTS=%ES_GC_OPTS% -XX:+UseParNewGC
set ES_GC_OPTS=%ES_GC_OPTS% -XX:+UseConcMarkSweepGC
set ES_GC_OPTS=%ES_GC_OPTS% -XX:CMSInitiatingOccupancyFraction=75
set ES_GC_OPTS=%ES_GC_OPTS% -XX:+UseCMSInitiatingOccupancyOnly
REM When running under Java 7
REM JAVA_OPTS=%JAVA_OPTS% -XX:+UseCondCardMark
)
set JAVA_OPTS=%JAVA_OPTS%%ES_GC_OPTS%
if "%ES_GC_LOG_FILE%" == "" goto nogclog
:gclog
set JAVA_OPTS=%JAVA_OPTS% -XX:+PrintGCDetails
set JAVA_OPTS=%JAVA_OPTS% -XX:+PrintGCTimeStamps
set JAVA_OPTS=%JAVA_OPTS% -XX:+PrintGCDateStamps
set JAVA_OPTS=%JAVA_OPTS% -XX:+PrintClassHistogram
set JAVA_OPTS=%JAVA_OPTS% -XX:+PrintTenuringDistribution
set JAVA_OPTS=%JAVA_OPTS% -XX:+PrintGCApplicationStoppedTime
set JAVA_OPTS=%JAVA_OPTS% -Xloggc:%ES_GC_LOG_FILE%
for %%F in ("%ES_GC_LOG_FILE%") do set ES_GC_LOG_FILE_DIRECTORY=%%~dpF
if NOT EXIST "%ES_GC_LOG_FILE_DIRECTORY%\." mkdir "%ES_GC_LOG_FILE_DIRECTORY%"
:nogclog
REM Causes the JVM to dump its heap on OutOfMemory.
set JAVA_OPTS=%JAVA_OPTS% -XX:+HeapDumpOnOutOfMemoryError
REM The path to the heap dump location, note directory must exists and have enough
REM space for a full heap dump.
REM JAVA_OPTS=%JAVA_OPTS% -XX:HeapDumpPath=$ES_HOME/logs/heapdump.hprof
REM Disables explicit GC
set JAVA_OPTS=%JAVA_OPTS% -XX:+DisableExplicitGC
REM Enable pre-touching of memory pages used by the JVM during hotspot
REM initialization
set JAVA_OPTS=%JAVA_OPTS% -XX:+AlwaysPreTouch
REM Ensure UTF-8 encoding by default (e.g. filenames)
set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF-8
REM Use our provided JNA always versus the system one
set JAVA_OPTS=%JAVA_OPTS% -Djna.nosys=true
REM check in case a user was using this mechanism REM check in case a user was using this mechanism
if "%ES_CLASSPATH%" == "" ( if "%ES_CLASSPATH%" == "" (
set ES_CLASSPATH=!ES_HOME!/lib/elasticsearch-${project.version}.jar;!ES_HOME!/lib/* set ES_CLASSPATH=!ES_HOME!/lib/elasticsearch-${project.version}.jar;!ES_HOME!/lib/*

View File

@ -11,82 +11,3 @@ EOF
fi fi
ES_CLASSPATH="$ES_HOME/lib/elasticsearch-${project.version}.jar:$ES_HOME/lib/*" ES_CLASSPATH="$ES_HOME/lib/elasticsearch-${project.version}.jar:$ES_HOME/lib/*"
if [ "x$ES_MIN_MEM" = "x" ]; then
ES_MIN_MEM=${heap.min}
fi
if [ "x$ES_MAX_MEM" = "x" ]; then
ES_MAX_MEM=${heap.max}
fi
if [ "x$ES_HEAP_SIZE" != "x" ]; then
ES_MIN_MEM=$ES_HEAP_SIZE
ES_MAX_MEM=$ES_HEAP_SIZE
fi
# min and max heap sizes should be set to the same value to avoid
# stop-the-world GC pauses during resize, and so that we can lock the
# heap in memory on startup to prevent any of it from being swapped
# out.
JAVA_OPTS="$JAVA_OPTS -Xms${ES_MIN_MEM}"
JAVA_OPTS="$JAVA_OPTS -Xmx${ES_MAX_MEM}"
# new generation
if [ "x$ES_HEAP_NEWSIZE" != "x" ]; then
JAVA_OPTS="$JAVA_OPTS -Xmn${ES_HEAP_NEWSIZE}"
fi
# max direct memory
if [ "x$ES_DIRECT_SIZE" != "x" ]; then
JAVA_OPTS="$JAVA_OPTS -XX:MaxDirectMemorySize=${ES_DIRECT_SIZE}"
fi
# set to headless, just in case
JAVA_OPTS="$JAVA_OPTS -Djava.awt.headless=true"
# Force the JVM to use IPv4 stack
if [ "x$ES_USE_IPV4" != "x" ]; then
JAVA_OPTS="$JAVA_OPTS -Djava.net.preferIPv4Stack=true"
fi
# Add gc options. ES_GC_OPTS is unsupported, for internal testing
if [ "x$ES_GC_OPTS" = "x" ]; then
ES_GC_OPTS="$ES_GC_OPTS -XX:+UseParNewGC"
ES_GC_OPTS="$ES_GC_OPTS -XX:+UseConcMarkSweepGC"
ES_GC_OPTS="$ES_GC_OPTS -XX:CMSInitiatingOccupancyFraction=75"
ES_GC_OPTS="$ES_GC_OPTS -XX:+UseCMSInitiatingOccupancyOnly"
fi
JAVA_OPTS="$JAVA_OPTS $ES_GC_OPTS"
# GC logging options
if [ -n "$ES_GC_LOG_FILE" ]; then
JAVA_OPTS="$JAVA_OPTS -XX:+PrintGCDetails"
JAVA_OPTS="$JAVA_OPTS -XX:+PrintGCTimeStamps"
JAVA_OPTS="$JAVA_OPTS -XX:+PrintGCDateStamps"
JAVA_OPTS="$JAVA_OPTS -XX:+PrintClassHistogram"
JAVA_OPTS="$JAVA_OPTS -XX:+PrintTenuringDistribution"
JAVA_OPTS="$JAVA_OPTS -XX:+PrintGCApplicationStoppedTime"
JAVA_OPTS="$JAVA_OPTS -Xloggc:$ES_GC_LOG_FILE"
# Ensure that the directory for the log file exists: the JVM will not create it.
mkdir -p "`dirname \"$ES_GC_LOG_FILE\"`"
fi
# Causes the JVM to dump its heap on OutOfMemory.
JAVA_OPTS="$JAVA_OPTS -XX:+HeapDumpOnOutOfMemoryError"
# The path to the heap dump location, note directory must exists and have enough
# space for a full heap dump.
#JAVA_OPTS="$JAVA_OPTS -XX:HeapDumpPath=$ES_HOME/logs/heapdump.hprof"
# Disables explicit GC
JAVA_OPTS="$JAVA_OPTS -XX:+DisableExplicitGC"
# Enable pre-touching of memory pages used by the JVM during hotspot
# initialization
JAVA_OPTS="$JAVA_OPTS -XX:+AlwaysPreTouch"
# Ensure UTF-8 encoding by default (e.g. filenames)
JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8"
# Use our provided JNA always versus the system one
JAVA_OPTS="$JAVA_OPTS -Djna.nosys=true"

View File

@ -3,6 +3,30 @@ SETLOCAL enabledelayedexpansion
TITLE Elasticsearch Service ${project.version} TITLE Elasticsearch Service ${project.version}
rem TODO: remove for Elasticsearch 6.x
if not "%ES_MIN_MEM%" == "" set bad_env_var=1
if not "%ES_MAX_MEM%" == "" set bad_env_var=1
if not "%ES_HEAP_SIZE%" == "" set bad_env_var=1
if not "%ES_HEAP_NEWSIZE%" == "" set bad_env_var=1
if not "%ES_DIRECT_SIZE%" == "" set bad_env_var=1
if not "%ES_USE_IPV4%" == "" set bad_env_var=1
if not "%ES_GC_OPTS%" == "" set bad_env_var=1
if not "%ES_GC_LOG_FILE%" == "" set bad_env_var=1
if %bad_env_var% == 1 (
echo Error: encountered environment variables that are no longer supported
echo Use jvm.options or ES_JAVA_OPTS to configure the JVM
if not "%ES_MIN_MEM%" == "" echo ES_MIN_MEM=%ES_MIN_MEM%: set -Xms%ES_MIN_MEM% in jvm.options or add "-Xms%ES_MIN_MEM%" to ES_JAVA_OPTS
if not "%ES_MAX_MEM%" == "" echo ES_MAX_MEM=%ES_MAX_MEM%: set -Xms%ES_MAX_MEM% in jvm.options or add "-Xmx%ES_MAX_MEM%" to ES_JAVA_OPTS
if not "%ES_HEAP_SIZE%" == "" echo ES_HEAP_SIZE=%ES_HEAP_SIZE%: set -Xms%ES_HEAP_SIZE% and -Xmx%ES_HEAP_SIZE% in jvm.options or add "-Xms%ES_HEAP_SIZE% -Xmx%ES_HEAP_SIZE%" to ES_JAVA_OPTS
if not "%ES_HEAP_NEWSIZE%" == "" echo ES_HEAP_NEWSIZE=%ES_HEAP_NEWSIZE%: set -Xmn%ES_HEAP_NEWSIZE% in jvm.options or add "-Xmn%ES_HEAP_SIZE%" to ES_JAVA_OPTS
if not "%ES_DIRECT_SIZE%" == "" echo ES_DIRECT_SIZE=%ES_DIRECT_SIZE%: set -XX:MaxDirectMemorySize=%ES_DIRECT_SIZE% in jvm.options or add "-XX:MaxDirectMemorySize=%ES_DIRECT_SIZE%" to ES_JAVA_OPTS
if not "%ES_USE_IPV4%" == "" echo ES_USE_IPV4=%ES_USE_IPV4%: set -Djava.net.preferIPv4Stack=true in jvm.options or add "-Djava.net.preferIPv4Stack=true" to ES_JAVA_OPTS
if not "%ES_GC_OPTS%" == "" echo ES_GC_OPTS=%ES_GC_OPTS%: set %ES_GC_OPTS: = and % in jvm.options or add "%ES_GC_OPTS%" to ES_JAVA_OPTS
if not "%ES_GC_LOG_FILE%" == "" echo ES_GC_LOG_FILE=%ES_GC_LOG_FILE%: set -Xloggc:%ES_GC_LOG_FILE% in jvm.options or add "-Xloggc:%ES_GC_LOG_FILE%" to ES_JAVA_OPTS"
exit /b 1
)
rem end TODO: remove for Elasticsearch 6.x
if NOT DEFINED JAVA_HOME goto err if NOT DEFINED JAVA_HOME goto err
if not "%CONF_FILE%" == "" goto conffileset if not "%CONF_FILE%" == "" goto conffileset
@ -131,34 +155,92 @@ if exist "%JAVA_HOME%"\bin\client\jvm.dll (
) )
:foundJVM :foundJVM
if "%ES_MIN_MEM%" == "" set ES_MIN_MEM=${heap.min} if "%ES_JVM_OPTIONS%" == "" (
if "%ES_MAX_MEM%" == "" set ES_MAX_MEM=${heap.max} set ES_JVM_OPTIONS="%ES_HOME%\config\jvm.options"
)
if NOT "%ES_HEAP_SIZE%" == "" set ES_MIN_MEM=%ES_HEAP_SIZE% if not "%ES_JAVA_OPTS%" == "" set ES_JAVA_OPTS=%ES_JAVA_OPTS: =;%
if NOT "%ES_HEAP_SIZE%" == "" set ES_MAX_MEM=%ES_HEAP_SIZE%
call:convertxm %ES_MIN_MEM% JVM_XMS @setlocal
call:convertxm %ES_MAX_MEM% JVM_XMX for /F "usebackq delims=" %%a in (`findstr /b \- "%ES_JVM_OPTIONS%"`) do set JVM_OPTIONS=!JVM_OPTIONS!%%a;
@endlocal & set ES_JAVA_OPTS=%JVM_OPTIONS%%ES_JAVA_OPTS%
REM java_opts might be empty - init to avoid tripping commons daemon (if the command starts with ;) if "%ES_JAVA_OPTS:~-1%"==";" set ES_JAVA_OPTS=%ES_JAVA_OPTS:~0,-1%
if "%JAVA_OPTS%" == "" set JAVA_OPTS=-XX:+UseParNewGC
@setlocal EnableDelayedExpansion
for %%a in ("%ES_JAVA_OPTS:;=","%") do (
set var=%%a
if "!var:~1,4!" == "-Xms" (
if not "!JVM_MS!" == "" (
echo duplicate min heap size settings found
goto:eof
)
set XMS=!var:~5,-1!
call:convertxm !XMS! JVM_MS
)
if "!var:~1,16!" == "-XX:MinHeapSize=" (
if not "!JVM_MS!" == "" (
echo duplicate min heap size settings found
goto:eof
)
set XMS=!var:~17,-1!
call:convertxm !XMS! JVM_MS
)
if "!var:~1,4!" == "-Xmx" (
if not "!JVM_MX!" == "" (
echo duplicate max heap size settings found
goto:eof
)
set XMX=!var:~5,-1!
call:convertxm !XMX! JVM_MX
)
if "!var:~1,16!" == "-XX:MaxHeapSize=" (
if not "!JVM_MX!" == "" (
echo duplicate max heap size settings found
goto:eof
)
set XMX=!var:~17,-1!
call:convertxm !XMX! JVM_MX
)
if "!var:~1,4!" == "-Xss" (
if not "!JVM_SS!" == "" (
echo duplicate thread stack size settings found
exit 1
)
set XSS=!var:~5,-1!
call:convertxk !XSS! JVM_SS
)
if "!var:~1,20!" == "-XX:ThreadStackSize=" (
if not "!JVM_SS!" == "" (
echo duplicate thread stack size settings found
goto:eof
)
set XSS=!var:~21,-1!
call:convertxk !XSS! JVM_SS
)
)
@endlocal & set JVM_MS=%JVM_MS% & set JVM_MX=%JVM_MX% & set JVM_SS=%JVM_SS%
if "%JVM_MS%" == "" (
echo minimum heap size not set; configure via %ES_JVM_OPTIONS% or ES_JAVA_OPTS
goto:eof
)
if "%JVM_MX%" == "" (
echo maximum heap size not set; configure via %ES_JVM_OPTIONS% or ES_JAVA_OPTS
goto:eof
)
if "%JVM_SS%" == "" (
echo thread stack size not set; configure via %ES_JVM_OPTIONS% or ES_JAVA_OPTS
goto:eof
)
CALL "%ES_HOME%\bin\elasticsearch.in.bat" CALL "%ES_HOME%\bin\elasticsearch.in.bat"
rem thread stack size
set JVM_SS=256
if "%DATA_DIR%" == "" set DATA_DIR=%ES_HOME%\data if "%DATA_DIR%" == "" set DATA_DIR=%ES_HOME%\data
if "%CONF_DIR%" == "" set CONF_DIR=%ES_HOME%\config if "%CONF_DIR%" == "" set CONF_DIR=%ES_HOME%\config
set ES_PARAMS=-Delasticsearch;-Des.path.home="%ES_HOME%";-Des.default.path.logs="%LOG_DIR%";-Des.default.path.data="%DATA_DIR%";-Des.default.path.conf="%CONF_DIR%" set ES_PARAMS=-Delasticsearch;-Des.path.home="%ES_HOME%";-Des.default.path.logs="%LOG_DIR%";-Des.default.path.data="%DATA_DIR%";-Des.default.path.conf="%CONF_DIR%"
set JVM_OPTS=%JAVA_OPTS: =;%
if not "%ES_JAVA_OPTS%" == "" set JVM_ES_JAVA_OPTS=%ES_JAVA_OPTS: =#%
if not "%ES_JAVA_OPTS%" == "" set JVM_OPTS=%JVM_OPTS%;%JVM_ES_JAVA_OPTS%
if "%ES_START_TYPE%" == "" set ES_START_TYPE=manual if "%ES_START_TYPE%" == "" set ES_START_TYPE=manual
if "%ES_STOP_TIMEOUT%" == "" set ES_STOP_TIMEOUT=0 if "%ES_STOP_TIMEOUT%" == "" set ES_STOP_TIMEOUT=0
@ -171,8 +253,7 @@ if not "%SERVICE_USERNAME%" == "" (
) )
) )
"%EXECUTABLE%" //IS//%SERVICE_ID% --Startup %ES_START_TYPE% --StopTimeout %ES_STOP_TIMEOUT% --StartClass org.elasticsearch.bootstrap.Elasticsearch --StopClass org.elasticsearch.bootstrap.Elasticsearch --StartMethod main --StopMethod close --Classpath "%ES_CLASSPATH%" --JvmSs %JVM_SS% --JvmMs %JVM_XMS% --JvmMx %JVM_XMX% --JvmOptions %JVM_OPTS% ++JvmOptions %ES_PARAMS% %LOG_OPTS% --PidFile "%SERVICE_ID%.pid" --DisplayName "%SERVICE_DISPLAY_NAME%" --Description "%SERVICE_DESCRIPTION%" --Jvm "%%JAVA_HOME%%%JVM_DLL%" --StartMode jvm --StopMode jvm --StartPath "%ES_HOME%" %SERVICE_PARAMS% "%EXECUTABLE%" //IS//%SERVICE_ID% --Startup %ES_START_TYPE% --StopTimeout %ES_STOP_TIMEOUT% --StartClass org.elasticsearch.bootstrap.Elasticsearch --StopClass org.elasticsearch.bootstrap.Elasticsearch --StartMethod main --StopMethod close --Classpath "%ES_CLASSPATH%" --JvmMs %JVM_MS% --JvmMx %JVM_MX% --JvmSs %JVM_SS% --JvmOptions %ES_JAVA_OPTS% ++JvmOptions %ES_PARAMS% %LOG_OPTS% --PidFile "%SERVICE_ID%.pid" --DisplayName "%SERVICE_DISPLAY_NAME%" --Description "%SERVICE_DESCRIPTION%" --Jvm "%%JAVA_HOME%%%JVM_DLL%" --StartMode jvm --StopMode jvm --StartPath "%ES_HOME%" %SERVICE_PARAMS%
if not errorlevel 1 goto installed if not errorlevel 1 goto installed
echo Failed installing '%SERVICE_ID%' service echo Failed installing '%SERVICE_ID%' service
@ -219,6 +300,36 @@ set /a conv=%conv% * 1024
set "%~2=%conv%" set "%~2=%conv%"
goto:eof goto:eof
:convertxk
set value=%~1
rem extract last char (unit)
set unit=%value:~-1%
rem assume the unit is specified
set conv=%value:~0,-1%
if "%unit%" == "k" goto kilo
if "%unit%" == "K" goto kilo
if "%unit%" == "m" goto mega
if "%unit%" == "M" goto mega
if "%unit%" == "g" goto giga
if "%unit%" == "G" goto giga
rem no unit found, must be bytes; consider the whole value
set conv=%value%
rem convert to KB
set /a conv=%conv% / 1024
goto kilo
:mega
rem convert to KB
set /a conv=%conv% * 1024
goto kilo
:giga
rem convert to KB
set /a conv=%conv% * 1024 * 1024
:kilo
set "%~2=%conv%"
goto:eof
:conffileset :conffileset
echo CONF_FILE setting is no longer supported. elasticsearch.yml must be placed in the config directory and cannot be renamed. echo CONF_FILE setting is no longer supported. elasticsearch.yml must be placed in the config directory and cannot be renamed.
goto:eof goto:eof

View File

@ -42,8 +42,9 @@
# #
# bootstrap.mlockall: true # bootstrap.mlockall: true
# #
# Make sure that the `ES_HEAP_SIZE` environment variable is set to about half the memory # Make sure that the heap size is set to about half the memory available
# available on the system and that the owner of the process is allowed to use this limit. # on the system and that the owner of the process is allowed to use this
# limit.
# #
# Elasticsearch performs poorly when the system is swapping the memory. # Elasticsearch performs poorly when the system is swapping the memory.
# #

View File

@ -0,0 +1,73 @@
### configuration
## basic
# set to headless, just in case
-Djava.awt.headless=true
# ensure UTF-8 encoding by default (e.g. filenames)
-Dfile.encoding=UTF-8
# use our provided JNA always versus the system one
-Djna.nosys=true
## networking
# force the JVM to use the IPv4 stack
#-Djava.net.preferIPv4Stack=true
### memory
## heap configuration
# minimum size of total heap space
-Xms${heap.min}
# maximum size of total heap space
# it is recommended to set the minimum size and maximum size equal to
# each other to prevent pauses upon resize, and so that memory locking
# will lock the entire heap in physical memory
-Xmx${heap.max}
# size of young generation heap space
#-Xmn${new.size}
# maximum size of NIO direct-buffer allocations
#-XX:MaxDirectMemorySize${max.direct.memory.size}
## CMS configuration
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly
## optimizations
# disable calls to System#gc
-XX:+DisableExplicitGC
# pre-touch memory pages used by the JVM during initialization
-XX:+AlwaysPreTouch
## heap dumps
# generate a heap dump when an allocation from the Java heap fails
# heap dumps are created in the working directory of the JVM
-XX:+HeapDumpOnOutOfMemoryError
# specify an alternative path for heap dumps
# ensure the directory exists and has sufficient space
#-XX:HeapDumpPath=${heap.dump.path}
## GC logging
#-XX:+PrintGCDetails
#-XX:+PrintGCTimeStamps
#-XX:+PrintGCDateStamps
#-XX:+PrintClassHistogram
#-XX:+PrintTenuringDistribution
#-XX:+PrintGCApplicationStoppedTime
# log GC status to a file with time stamps
# ensure the directory exists
#-Xloggc:${loggc}

View File

@ -21,4 +21,20 @@ a memory page during GC time. This will increase the startup time of
Elasticsearch as well as increasing the initial resident memory usage of the Elasticsearch as well as increasing the initial resident memory usage of the
Java process. Java process.
==== JVM options
Arguments to the Java Virtual Machine have been centralized and moved
to a new configuration file jvm.options. This centralization allows for
simpler end-user management of JVM options.
This migration removes all previous mechanisms of setting JVM options
via the environment variables `ES_MIN_MEM`, `ES_MAX_MEM`,
`ES_HEAP_SIZE`, `ES_HEAP_NEWSIZE`, `ES_DIRECT_SIZE`, `ES_USE_IPV4`,
`ES_GC_OPTS`, `ES_GC_LOG_FILE`, and `JAVA_OPTS`.
The default location for this file is in config/jvm.options if installing
from the tar or zip distributions, and /etc/elasticsearch/jvm.options if installing
from the Debian or RPM packages. You can specify an alternative location by setting
the environment variable `ES_JVM_OPTIONS` to the path to the file.

View File

@ -99,12 +99,13 @@ The classloader whitelist can be customised by tweaking the local Java
Security Policy either: Security Policy either:
* system wide: `$JAVA_HOME/lib/security/java.policy`, * system wide: `$JAVA_HOME/lib/security/java.policy`,
* for just the `elasticsearch` user: `/home/elasticsearch/.java.policy`, or * for just the `elasticsearch` user: `/home/elasticsearch/.java.policy`
* from a file specified in the `JAVA_OPTS` environment variable with `-Djava.security.policy=someURL`: * by adding a system property to the <<sysconfig,es-java-opts>> configuration: `-Djava.security.policy=someURL`, or
* via the `ES_JAVA_OPTS` environment variable with `-Djava.security.policy=someURL`:
+ +
[source,js] [source,js]
--------------------------------- ---------------------------------
export JAVA_OPTS="${JAVA_OPTS} -Djava.security.policy=file:///path/to/my.policy` export ES_JAVA_OPTS="${ES_JAVA_OPTS} -Djava.security.policy=file:///path/to/my.policy`
./bin/elasticsearch ./bin/elasticsearch
--------------------------------- ---------------------------------

View File

@ -11,18 +11,6 @@
Set a custom Java path to be used. Set a custom Java path to be used.
`ES_HEAP_SIZE`::
The heap size to start with.
`ES_HEAP_NEWSIZE`::
The size of the new generation heap.
`ES_DIRECT_SIZE`::
The maximum size of the direct memory.
`MAX_OPEN_FILES`:: `MAX_OPEN_FILES`::
Maximum number of open files, defaults to `65536`. Maximum number of open files, defaults to `65536`.
@ -30,8 +18,7 @@
`MAX_LOCKED_MEMORY`:: `MAX_LOCKED_MEMORY`::
Maximum locked memory size. Set to `unlimited if you use the Maximum locked memory size. Set to `unlimited if you use the
`bootstrap.mlockall` option in elasticsearch.yml. You must also set `bootstrap.mlockall` option in elasticsearch.yml.
ES_HEAP_SIZE.
`MAX_MAP_COUNT`:: `MAX_MAP_COUNT`::
@ -66,10 +53,3 @@
package manually. The reason for this is to ensure, that upgrades in a package manually. The reason for this is to ensure, that upgrades in a
cluster do not result in a continuous shard reallocation resulting in high cluster do not result in a continuous shard reallocation resulting in high
network traffic and reducing the response times of your cluster. network traffic and reducing the response times of your cluster.
`ES_GC_LOG_FILE` ::
The absolute log file path for creating a garbage collection logfile,
which is done by the JVM. Note that this logfile can grow pretty quick and
thus is disabled by default.

View File

@ -141,18 +141,6 @@ The Elasticsearch service can be configured prior to installation by setting the
The installation directory of the desired JVM to run the service under. The installation directory of the desired JVM to run the service under.
`ES_HEAP_SIZE`::
The heap size to start with.
`ES_MIN_MEM`::
The initial memory allocation pool for the JVM (`Xms`). Defaults to `256m`, overriden by `%ES_HEAP_SIZE%`.
`ES_MAX_MEM`::
The maxmimum memory allocation pool for the JVM (`Xmx`). Defaults to `1g`, overriden by `%ES_HEAP_SIZE%`.
`LOG_DIR`:: `LOG_DIR`::
Log directory, defaults to `%ES_HOME%\logs`. Log directory, defaults to `%ES_HOME%\logs`.

View File

@ -104,14 +104,23 @@ LimitMEMLOCK=infinity
[[es-java-opts]] [[es-java-opts]]
==== Setting JVM system properties ==== Setting JVM system properties
Any Java system properties or arguments which should be passed to the JVM The preferred method of setting Java Virtual Machine options (including
should be specified in the `ES_JAVA_OPTS` environment variable, for instance: system properties and JVM flags) is via the jvm.options configuration
file. The default location of this file is config/jvm.options (when
installing from the tar or zip distributions) and
/etc/elasticsearch/jvm.options (when installing from the Debian or RPM
packages). This file contains a line-delimited list of JVM arguments,
which must begin with `-`. You can add custom JVM flags to this file and
check this configuration into your version control system.
An alternative mechanism for setting Java Virtual Machine options is
via the `ES_JAVA_OPTS` environment variable. For instance:
[source,sh] [source,sh]
--------------------------------- ---------------------------------
EXPORT ES_JAVA_OPTS="$ES_JAVA_OPTS -Djava.io.tmpdir=/path/to/temp/dir" export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djava.io.tmpdir=/path/to/temp/dir"
./bin/elasticsearch ./bin/elasticsearch
--------------------------------- ---------------------------------
When using the RPM or Debian packages, ES_JAVA_OPTS can be specified in the When using the RPM or Debian packages, `ES_JAVA_OPTS` can be specified in the
<<sysconfig,system configuration file>>. <<sysconfig,system configuration file>>.

View File

@ -1,36 +1,65 @@
[[heap-size]] [[heap-size]]
=== Set JVM heap size with ES_HEAP_SIZE === Set JVM heap size via jvm.options
In development mode, Elasticsearch tells the JVM to use a heap with a minimum In development mode, Elasticsearch tells the JVM to use a heap with a minimum
size of 256MB and a maximum size of 1GB. When moving to production, it is size of 256 MB and a maximum size of 1 GB. When moving to production, it is
important to configure the `ES_HEAP_SIZE environment variable to ensure that important to configure heap size to ensure that Elasticsearch has enough
Elasticsearch has enough heap available. heap available.
Elasticsearch will assign the entire heap specified in `ES_HEAP_SIZE on startup. Elasticsearch will assign the entire heap specified in <<sysconfig,es-java-opts>>
via the Xms (minimum heap size) and Xmx (maximum heap size) settings.
The value for this setting depends on the amount of RAM available on your server. A good rule of thumb is: The value for these setting depends on the amount of RAM available on
your server. Good rules of thumb are:
* Set the minimum heap size (Xms) and maximum heap size (Xmx) to be
equal to each other.
* The more heap available to Elasticsearch, the more memory it can use for * The more heap available to Elasticsearch, the more memory it can use for
caching. caching. But note that too much heap can subject you to long garbage
collection pauses.
* Set the `ES_HEAP_SIZE` to no more than 50% of your RAM, to ensure that there * Set Xmx to no more than 50% of your physical RAM, to ensure that there
is enough RAM left for kernel file system caches. is enough physical RAM left for kernel file system caches.
* Dont set `ES_HEAP_SIZE` to more than about 31GB to ensure that the JVM uses * Dont set Xmx to above the cutoff that the JVM uses for compressed
compressed object pointers (compressed-oops). You can verify that you are object pointers (compressed oops); the exact cutoff varies but is
under the limit by looking for a line in the logs like the following: near 32 GB. You can verify that you are under the limit by looking
for a line in the logs like the following:
heap size [1.9gb], compressed ordinary object pointers [true] heap size [1.9gb], compressed ordinary object pointers [true]
Here are examples of how to set the ES_HEAP_SIZE: * Even better, try to stay below the threshold for zero-based
compressed oops; the exact cutoff varies but 26 GB is safe on most
systems, but can be as large as 30 GB on some system. You can verify
that you are under the limit by starting Elasticsearch with the JVM
options "-XX:+UnlockDiagnosticVMOptions -XX:+PrintCompressedOopsMode"
and looking for a line like the following:
heap address: 0x000000011be00000, size: 27648 MB, zero based Compressed Oops
showing that zero-based compressed oops are enabled instead of
heap address: 0x0000000118400000, size: 28672 MB, Compressed Oops with base: 0x00000001183ff000
Here are examples of how to set the heap size via the jvm.options file:
[source]
------------------
Xms2g <1>
Xmx2g <2>
------------------
<1> Set the minimum heap size to 2g.
<2> Set the maximum heap size to 2g.
It is also possible to set the heap size via an environment variable.
This can be done by commenting out the `Xms` and `Xmx` settings
in the jvm.options file and setting these values via `ES_JAVA_OPTS`:
[source,sh] [source,sh]
------------------ ------------------
ES_HEAP_SIZE=2g ./bin/elasticsearch <1> ES_JAVA_OPTS="-Xms2g -Xmx2g" ./bin/elasticsearch <3>
ES_HEAP_SIZE=4000m ./bin/elasticsearch <2> ES_JAVA_OPTS="-Xmx4000mb -Xmx4000mb" ./bin/elasticsearch <4>
------------------ ------------------
<1> Set the min/max heap size to 2GB. <3> Set the minimum and maximum heap size to 2 GB.
<2> Set the min/max heap size to 4,000MB. <4> Set the minimum and maximum heap size to 4000 MB.
When using the Debian or RPM package, ES_HEAP_SIZE can be configured in the
<<sysconfig,system configuration file>>.

View File

@ -83,8 +83,7 @@ export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djava.io.tmpdir=/path/to/temp/dir"
The second option is to completely disable swap. Usually Elasticsearch The second option is to completely disable swap. Usually Elasticsearch
is the only service running on a box, and its memory usage is controlled is the only service running on a box, and its memory usage is controlled
by the `ES_HEAP_SIZE` environment variable. There should be no need by the JVM options. There should be no need to have swap enabled.
to have swap enabled.
On Linux systems, you can disable swap temporarily On Linux systems, you can disable swap temporarily
by running: `sudo swapoff -a`. To disable it permanently, you will need by running: `sudo swapoff -a`. To disable it permanently, you will need

View File

@ -95,5 +95,26 @@ setup() {
start_elasticsearch_service start_elasticsearch_service
run_elasticsearch_tests run_elasticsearch_tests
stop_elasticsearch_service stop_elasticsearch_service
}
@test "[TAR]" start Elasticsearch with custom JVM options {
local es_java_opts=$ES_JAVA_OPTS
local es_jvm_options=$ES_JVM_OPTIONS
local temp=`mktemp -d`
touch "$temp/jvm.options"
chown -R elasticsearch:elasticsearch "$temp"
echo "-Xms264m" >> "$temp/jvm.options"
echo "-Xmx264m" >> "$temp/jvm.options"
export ES_JVM_OPTIONS="$temp/jvm.options"
export ES_JAVA_OPTS="-XX:-UseCompressedOops"
start_elasticsearch_service
curl -s -XGET localhost:9200/_nodes | fgrep '"heap_init_in_bytes":276824064'
curl -s -XGET localhost:9200/_nodes | fgrep '"using_compressed_ordinary_object_pointers":"false"'
stop_elasticsearch_service
export ES_JVM_OPTIONS=$es_jvm_options
export ES_JAVA_OPTS=$es_java_opts
}
@test "[TAR]" remove tar {
rm -rf "/tmp/elasticsearch" rm -rf "/tmp/elasticsearch"
} }

View File

@ -128,6 +128,7 @@ setup() {
# The configuration files are still here # The configuration files are still here
assert_file_exist "/etc/elasticsearch" assert_file_exist "/etc/elasticsearch"
assert_file_exist "/etc/elasticsearch/elasticsearch.yml" assert_file_exist "/etc/elasticsearch/elasticsearch.yml"
assert_file_exist "/etc/elasticsearch/jvm.options"
assert_file_exist "/etc/elasticsearch/logging.yml" assert_file_exist "/etc/elasticsearch/logging.yml"
# The env file is still here # The env file is still here
@ -148,6 +149,7 @@ setup() {
# all remaining files are deleted by the purge # all remaining files are deleted by the purge
assert_file_not_exist "/etc/elasticsearch" assert_file_not_exist "/etc/elasticsearch"
assert_file_not_exist "/etc/elasticsearch/elasticsearch.yml" assert_file_not_exist "/etc/elasticsearch/elasticsearch.yml"
assert_file_not_exist "/etc/elasticsearch/jvm.options"
assert_file_not_exist "/etc/elasticsearch/logging.yml" assert_file_not_exist "/etc/elasticsearch/logging.yml"
assert_file_not_exist "/etc/default/elasticsearch" assert_file_not_exist "/etc/default/elasticsearch"

View File

@ -116,6 +116,7 @@ setup() {
assert_file_not_exist "/etc/elasticsearch" assert_file_not_exist "/etc/elasticsearch"
assert_file_not_exist "/etc/elasticsearch/elasticsearch.yml" assert_file_not_exist "/etc/elasticsearch/elasticsearch.yml"
assert_file_not_exist "/etc/elasticsearch/jvm.options"
assert_file_not_exist "/etc/elasticsearch/logging.yml" assert_file_not_exist "/etc/elasticsearch/logging.yml"
assert_file_not_exist "/etc/init.d/elasticsearch" assert_file_not_exist "/etc/init.d/elasticsearch"

View File

@ -351,6 +351,8 @@ run_elasticsearch_service() {
# This line is attempting to emulate the on login behavior of /usr/share/upstart/sessions/jayatana.conf # This line is attempting to emulate the on login behavior of /usr/share/upstart/sessions/jayatana.conf
[ -f /usr/share/java/jayatanaag.jar ] && export JAVA_TOOL_OPTIONS="-javaagent:/usr/share/java/jayatanaag.jar" [ -f /usr/share/java/jayatanaag.jar ] && export JAVA_TOOL_OPTIONS="-javaagent:/usr/share/java/jayatanaag.jar"
# And now we can start Elasticsearch normally, in the background (-d) and with a pidfile (-p). # And now we can start Elasticsearch normally, in the background (-d) and with a pidfile (-p).
export ES_JVM_OPTIONS=$ES_JVM_OPTIONS
export ES_JAVA_OPTS=$ES_JAVA_OPTS
$timeoutCommand/tmp/elasticsearch/bin/elasticsearch $background -p /tmp/elasticsearch/elasticsearch.pid $ES_PATH_CONF $commandLineArgs $timeoutCommand/tmp/elasticsearch/bin/elasticsearch $background -p /tmp/elasticsearch/elasticsearch.pid $ES_PATH_CONF $commandLineArgs
BASH BASH
[ "$status" -eq "$expectedStatus" ] [ "$status" -eq "$expectedStatus" ]