Created
May 29, 2015 02:23
-
-
Save brianmhess/a2b0b0f4e45b8ffb1f2f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Licensed to the Apache Software Foundation (ASF) under one | |
# or more contributor license agreements. See the NOTICE file | |
# distributed with this work for additional information | |
# regarding copyright ownership. The ASF licenses this file | |
# to you under the Apache License, Version 2.0 (the | |
# "License"); you may not use this file except in compliance | |
# with the License. You may obtain a copy of the License at | |
# | |
# http://www.apache.org/licenses/LICENSE-2.0 | |
# | |
# Unless required by applicable law or agreed to in writing, software | |
# distributed under the License is distributed on an "AS IS" BASIS, | |
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
# See the License for the specific language governing permissions and | |
# limitations under the License. | |
calculate_heap_sizes() | |
{ | |
case "`uname`" in | |
Linux) | |
system_memory_in_mb=`free -m | awk '/:/ {print $2;exit}'` | |
system_cpu_cores=`egrep -c 'processor([[:space:]]+):.*' /proc/cpuinfo` | |
;; | |
FreeBSD) | |
system_memory_in_bytes=`sysctl hw.physmem | awk '{print $2}'` | |
system_memory_in_mb=`expr $system_memory_in_bytes / 1024 / 1024` | |
system_cpu_cores=`sysctl hw.ncpu | awk '{print $2}'` | |
;; | |
SunOS) | |
system_memory_in_mb=`prtconf | awk '/Memory size:/ {print $3}'` | |
system_cpu_cores=`psrinfo | wc -l` | |
;; | |
Darwin) | |
system_memory_in_bytes=`sysctl hw.memsize | awk '{print $2}'` | |
system_memory_in_mb=`expr $system_memory_in_bytes / 1024 / 1024` | |
system_cpu_cores=`sysctl hw.ncpu | awk '{print $2}'` | |
;; | |
*) | |
# assume reasonable defaults for e.g. a modern desktop or | |
# cheap server | |
system_memory_in_mb="2048" | |
system_cpu_cores="2" | |
;; | |
esac | |
# some systems like the raspberry pi don't report cores, use at least 1 | |
if [ "$system_cpu_cores" -lt "1" ] | |
then | |
system_cpu_cores="1" | |
fi | |
# set max heap size based on the following | |
# max(min(1/2 ram, 1024MB), min(1/4 ram, 8GB)) | |
# calculate 1/2 ram and cap to 1024MB | |
# calculate 1/4 ram and cap to 8192MB | |
# pick the max | |
half_system_memory_in_mb=`expr $system_memory_in_mb / 2` | |
quarter_system_memory_in_mb=`expr $half_system_memory_in_mb / 2` | |
if [ "$half_system_memory_in_mb" -gt "1024" ] | |
then | |
half_system_memory_in_mb="1024" | |
fi | |
if [ "$quarter_system_memory_in_mb" -gt "8192" ] | |
then | |
quarter_system_memory_in_mb="8192" | |
fi | |
if [ "$half_system_memory_in_mb" -gt "$quarter_system_memory_in_mb" ] | |
then | |
max_heap_size_in_mb="$half_system_memory_in_mb" | |
else | |
max_heap_size_in_mb="$quarter_system_memory_in_mb" | |
fi | |
MAX_HEAP_SIZE="${max_heap_size_in_mb}M" | |
# Young gen: min(max_sensible_per_modern_cpu_core * num_cores, 1/4 * heap size) | |
max_sensible_yg_per_core_in_mb="100" | |
max_sensible_yg_in_mb=`expr $max_sensible_yg_per_core_in_mb "*" $system_cpu_cores` | |
desired_yg_in_mb=`expr $max_heap_size_in_mb / 4` | |
if [ "$desired_yg_in_mb" -gt "$max_sensible_yg_in_mb" ] | |
then | |
HEAP_NEWSIZE="${max_sensible_yg_in_mb}M" | |
else | |
HEAP_NEWSIZE="${desired_yg_in_mb}M" | |
fi | |
} | |
# Determine the sort of JVM we'll be running on. | |
java_ver_output=`"${JAVA:-java}" -version 2>&1` | |
jvmver=`echo "$java_ver_output" | grep '[openjdk|java] version' | awk -F'"' 'NR==1 {print $2}'` | |
JVM_VERSION=${jvmver%_*} | |
JVM_PATCH_VERSION=${jvmver#*_} | |
if [ "$JVM_VERSION" \< "1.7" ] ; then | |
echo "Cassandra 2.0 and later require Java 7u25 or later." | |
exit 1; | |
fi | |
if [ "$JVM_VERSION" \< "1.8" ] && [ "$JVM_PATCH_VERSION" \< "25" ] ; then | |
echo "Cassandra 2.0 and later require Java 7u25 or later." | |
exit 1; | |
fi | |
jvm=`echo "$java_ver_output" | grep -A 1 'java version' | awk 'NR==2 {print $1}'` | |
case "$jvm" in | |
OpenJDK) | |
JVM_VENDOR=OpenJDK | |
# this will be "64-Bit" or "32-Bit" | |
JVM_ARCH=`echo "$java_ver_output" | awk 'NR==3 {print $2}'` | |
;; | |
"Java(TM)") | |
JVM_VENDOR=Oracle | |
# this will be "64-Bit" or "32-Bit" | |
JVM_ARCH=`echo "$java_ver_output" | awk 'NR==3 {print $3}'` | |
;; | |
*) | |
# Help fill in other JVM values | |
JVM_VENDOR=other | |
JVM_ARCH=unknown | |
;; | |
esac | |
# Override these to set the amount of memory to allocate to the JVM at | |
# start-up. For production use you may wish to adjust this for your | |
# environment. MAX_HEAP_SIZE is the total amount of memory dedicated | |
# to the Java heap; HEAP_NEWSIZE refers to the size of the young | |
# generation. Both MAX_HEAP_SIZE and HEAP_NEWSIZE should be either set | |
# or not (if you set one, set the other). | |
# | |
# The main trade-off for the young generation is that the larger it | |
# is, the longer GC pause times will be. The shorter it is, the more | |
# expensive GC will be (usually). | |
# | |
# The example HEAP_NEWSIZE assumes a modern 8-core+ machine for decent pause | |
# times. If in doubt, and if you do not particularly want to tweak, go with | |
# 100 MB per physical CPU core. | |
MAX_HEAP_SIZE="32G" | |
#HEAP_NEWSIZE="800M" | |
# Set this to control the amount of arenas per-thread in glibc | |
#export MALLOC_ARENA_MAX=4 | |
#if [ "x$MAX_HEAP_SIZE" = "x" ] && [ "x$HEAP_NEWSIZE" = "x" ]; then | |
# calculate_heap_sizes | |
#else | |
# if [ "x$MAX_HEAP_SIZE" = "x" ] || [ "x$HEAP_NEWSIZE" = "x" ]; then | |
# echo "please set or unset MAX_HEAP_SIZE and HEAP_NEWSIZE in pairs (see cassandra-env.sh)" | |
# exit 1 | |
# fi | |
#fi | |
if [ "x$MALLOC_ARENA_MAX" = "x" ] | |
then | |
export MALLOC_ARENA_MAX=4 | |
fi | |
# Specifies the default port over which Cassandra will be available for | |
# JMX connections. | |
# For security reasons, you should not expose this port to the internet. Firewall it if needed. | |
JMX_PORT="7199" | |
# Here we create the arguments that will get passed to the jvm when | |
# starting cassandra. | |
# Special-case path variables for Windows. | |
case "`uname`" in | |
CYGWIN*) | |
CASSANDRA_HOME=`cygpath -p -w "$CASSANDRA_HOME"` | |
;; | |
esac | |
# add the DSE loader | |
JVM_OPTS="$JVM_OPTS $DSE_OPTS $DSE_CREDENTIALS" | |
# enable assertions. disabling this in production will give a modest | |
# performance benefit (around 5%). | |
JVM_OPTS="$JVM_OPTS -ea" | |
# add the jamm javaagent | |
JVM_OPTS="$JVM_OPTS -javaagent:$CASSANDRA_HOME/lib/jamm-0.3.0.jar" | |
# enable thread priorities, primarily so we can give periodic tasks | |
# a lower priority to avoid interfering with client workload | |
JVM_OPTS="$JVM_OPTS -XX:+UseThreadPriorities" | |
# allows lowering thread priority without being root. see | |
# http://tech.stolsvik.com/2010/01/linux-java-thread-priorities-workaround.html | |
JVM_OPTS="$JVM_OPTS -XX:ThreadPriorityPolicy=42" | |
# 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. | |
JVM_OPTS="$JVM_OPTS -Xms${MAX_HEAP_SIZE}" | |
JVM_OPTS="$JVM_OPTS -Xmx${MAX_HEAP_SIZE}" | |
#JVM_OPTS="$JVM_OPTS -Xmn${HEAP_NEWSIZE}" | |
JVM_OPTS="$JVM_OPTS -XX:+HeapDumpOnOutOfMemoryError" | |
# set jvm HeapDumpPath with CASSANDRA_HEAPDUMP_DIR | |
if [ "x$CASSANDRA_HEAPDUMP_DIR" != "x" ]; then | |
JVM_OPTS="$JVM_OPTS -XX:HeapDumpPath=$CASSANDRA_HEAPDUMP_DIR/cassandra-`date +%s`-pid$$.hprof" | |
fi | |
startswith() { [ "${1#$2}" != "$1" ]; } | |
# Per-thread stack size. | |
JVM_OPTS="$JVM_OPTS -Xss256k" | |
# Use the Hotspot garbage-first collector. | |
JVM_OPTS="$JVM_OPTS -XX:+UseG1GC" | |
# Have the JVM do less remembered set work during STW, instead | |
# preferring concurrent GC. Reduces p99.9 latency. | |
JVM_OPTS="$JVM_OPTS -XX:G1RSetUpdatingPauseTimePercent=5" | |
# The JVM maximum is 8 PGC threads and 1/4 of that for ConcGC. | |
# Machines with > 10 cores may need additional threads. Increase to <= full cores. | |
#JVM_OPTS="$JVM_OPTS -XX:ParallelGCThreads=16" | |
#JVM_OPTS="$JVM_OPTS -XX:ConcGCThreads=16" | |
# Main G1GC tunable: lowering the pause target will lower throughput and vise versa. | |
# 200ms is the JVM default and lowest viable setting | |
# 1000ms increases throughput. Keep it smaller than the timeouts in cassandra.yaml. | |
JVM_OPTS="$JVM_OPTS -XX:MaxGCPauseMillis=500" | |
# Save CPU time on large (>= 16GB) heaps by delaying region scanning | |
# until the heap is 70% full. The default in Hotspot 8u40 is 40%. | |
#JVM_OPTS="$JVM_OPTS -XX:InitiatingHeapOccupancyPercent=70" | |
# Make sure all memory is faulted and zeroed on startup. | |
# This helps prevent soft faults in containers and makes | |
# transparent hugepage allocation more effective. | |
JVM_OPTS="$JVM_OPTS -XX:+AlwaysPreTouch" | |
# Biased locking does not benefit Cassandra. | |
JVM_OPTS="$JVM_OPTS -XX:-UseBiasedLocking" | |
# Larger interned string table, for gossip's benefit (CASSANDRA-6410) | |
JVM_OPTS="$JVM_OPTS -XX:StringTableSize=1000003" | |
# Enable thread-local allocation blocks and allow the JVM to automatically | |
# resize them at runtime. | |
JVM_OPTS="$JVM_OPTS -XX:+UseTLAB -XX:+ResizeTLAB" | |
# http://www.evanjones.ca/jvm-mmap-pause.html | |
JVM_OPTS="$JVM_OPTS -XX:+PerfDisableSharedMem" | |
# provides hints to the JIT compiler | |
JVM_OPTS="$JVM_OPTS -XX:CompileCommandFile=$CASSANDRA_CONF/hotspot_compiler" | |
# GC logging options -- uncomment to enable | |
# JVM_OPTS="$JVM_OPTS -XX:+PrintGCDetails" | |
# JVM_OPTS="$JVM_OPTS -XX:+PrintGCDateStamps" | |
# JVM_OPTS="$JVM_OPTS -XX:+PrintHeapAtGC" | |
# JVM_OPTS="$JVM_OPTS -XX:+PrintTenuringDistribution" | |
# JVM_OPTS="$JVM_OPTS -XX:+PrintGCApplicationStoppedTime" | |
# JVM_OPTS="$JVM_OPTS -XX:+PrintPromotionFailure" | |
# JVM_OPTS="$JVM_OPTS -XX:PrintFLSStatistics=1" | |
# JVM_OPTS="$JVM_OPTS -Xloggc:/var/log/cassandra/gc-`date +%s`.log" | |
# If you are using JDK 6u34 7u2 or later you can enable GC log rotation | |
# don't stick the date in the log name if rotation is on. | |
# JVM_OPTS="$JVM_OPTS -Xloggc:/var/log/cassandra/gc.log" | |
# JVM_OPTS="$JVM_OPTS -XX:+UseGCLogFileRotation" | |
# JVM_OPTS="$JVM_OPTS -XX:NumberOfGCLogFiles=10" | |
# JVM_OPTS="$JVM_OPTS -XX:GCLogFileSize=10M" | |
# Configure the following for JEMallocAllocator and if jemalloc is not available in the system | |
# library path (Example: /usr/local/lib/). Usually "make install" will do the right thing. | |
# export LD_LIBRARY_PATH=<JEMALLOC_HOME>/lib/ | |
# JVM_OPTS="$JVM_OPTS -Djava.library.path=<JEMALLOC_HOME>/lib/" | |
# uncomment to have Cassandra JVM listen for remote debuggers/profilers on port 1414 | |
# JVM_OPTS="$JVM_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=1414" | |
# uncomment to have Cassandra JVM log internal method compilation (developers only) | |
# JVM_OPTS="$JVM_OPTS -XX:+UnlockDiagnosticVMOptions -XX:+LogCompilation" | |
# Prefer binding to IPv4 network intefaces (when net.ipv6.bindv6only=1). See | |
# http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6342561 (short version: | |
# comment out this entry to enable IPv6 support). | |
JVM_OPTS="$JVM_OPTS -Djava.net.preferIPv4Stack=true" | |
# jmx: metrics and administration interface | |
# | |
# add this if you're having trouble connecting: | |
#JVM_OPTS="$JVM_OPTS -Djava.rmi.server.hostname=52.8.160.85" | |
# | |
# see | |
# https://blogs.oracle.com/jmxetc/entry/troubleshooting_connection_problems_in_jconsole | |
# for more on configuring JMX through firewalls, etc. (Short version: | |
# get it working with no firewall first.) | |
# | |
# Cassandra ships with JMX accessible *only* from localhost. | |
# To enable remote JMX connections, uncomment lines below | |
# with authentication and/or ssl enabled. See https://wiki.apache.org/cassandra/JmxSecurity | |
# | |
LOCAL_JMX=no | |
if [ "$LOCAL_JMX" = "yes" ]; then | |
JVM_OPTS="$JVM_OPTS -Dcassandra.jmx.local.port=$JMX_PORT -XX:+DisableExplicitGC" | |
else | |
JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT" | |
JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT" | |
JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.ssl=false" | |
JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.authenticate=false" | |
JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.password.file=/etc/cassandra/jmxremote.password" | |
fi | |
# To use mx4j, an HTML interface for JMX, add mx4j-tools.jar to the lib/ | |
# directory. | |
# See http://wiki.apache.org/cassandra/Operations#Monitoring_with_MX4J | |
# By default mx4j listens on 0.0.0.0:8081. Uncomment the following lines | |
# to control its listen address and port. | |
#MX4J_ADDRESS="-Dmx4jaddress=127.0.0.1" | |
#MX4J_PORT="-Dmx4jport=8081" | |
JVM_OPTS="$JVM_OPTS $MX4J_ADDRESS" | |
JVM_OPTS="$JVM_OPTS $MX4J_PORT" | |
JVM_OPTS="$JVM_OPTS $JVM_EXTRA_OPTS" | |
JVM_OPTS="$JVM_OPTS -Dcassandra.consistent.rangemovement=false" | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment