Skip to content

Instantly share code, notes, and snippets.

@Randgalt
Created April 3, 2015 21:36
Show Gist options
  • Save Randgalt/2d584134b60a903ade6c to your computer and use it in GitHub Desktop.
Save Randgalt/2d584134b60a903ade6c to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
QUBOLE_APP_HOME=$(pwd)
QUBOLE_APP_CONF=$QUBOLE_APP_HOME/config
QUBOLE_APP_LIB=$QUBOLE_APP_HOME/lib
# calculate_heap_size() and default DEFAULT_JVM_OPTS loosely based
# on Cassandra startup script
calculate_heap_size()
{
case "`uname`" in
Linux)
system_memory_in_mb=`free -m | awk '/Mem:/ {print $2}'`
MAX_HEAP_SIZE=$((system_memory_in_mb / 2))M
return 0
;;
FreeBSD)
system_memory_in_bytes=`sysctl hw.physmem | awk '{print $2}'`
MAX_HEAP_SIZE=$((system_memory_in_bytes / 1024 / 1024 / 2))M
return 0
;;
*)
MAX_HEAP_SIZE=1024M
return 1
;;
esac
}
check_config_install()
{
if [ ! -e $QUBOLE_APP_CONF ] ; then
echo "Installing default config directory"
java -jar $QUBOLE_APP_LIB/qubole.jar install $QUBOLE_APP_HOME
fi
}
if [ "x$MAX_HEAP_SIZE" = "x" ]; then
calculate_heap_size
fi
# set default JVM options (can be overridden by java.env)
# enable thread priorities, primarily so we can give periodic tasks
# a lower priority to avoid interfering with client workload
DEFAULT_JVM_OPTS="$DEFAULT_JVM_OPTS -XX:+UseThreadPriorities"
# allows lowering thread priority without being root. see
# http://tech.stolsvik.com/2010/01/linux-java-thread-priorities-workaround.html
DEFAULT_JVM_OPTS="$DEFAULT_JVM_OPTS -XX:ThreadPriorityPolicy=42"
DEFAULT_JVM_OPTS="$DEFAULT_JVM_OPTS -XX:+HeapDumpOnOutOfMemoryError"
# GC tuning options
DEFAULT_JVM_OPTS="$DEFAULT_JVM_OPTS -XX:+UseParNewGC"
DEFAULT_JVM_OPTS="$DEFAULT_JVM_OPTS -XX:+UseConcMarkSweepGC"
DEFAULT_JVM_OPTS="$DEFAULT_JVM_OPTS -XX:+CMSParallelRemarkEnabled"
DEFAULT_JVM_OPTS="$DEFAULT_JVM_OPTS -XX:SurvivorRatio=8"
DEFAULT_JVM_OPTS="$DEFAULT_JVM_OPTS -XX:MaxTenuringThreshold=1"
DEFAULT_JVM_OPTS="$DEFAULT_JVM_OPTS -XX:CMSInitiatingOccupancyFraction=75"
DEFAULT_JVM_OPTS="$DEFAULT_JVM_OPTS -XX:+UseCMSInitiatingOccupancyOnly"
# GC logging options
DEFAULT_JVM_OPTS="$DEFAULT_JVM_OPTS -XX:+PrintGCDetails"
DEFAULT_JVM_OPTS="$DEFAULT_JVM_OPTS -XX:+PrintGCTimeStamps"
DEFAULT_JVM_OPTS="$DEFAULT_JVM_OPTS -XX:+PrintClassHistogram"
DEFAULT_JVM_OPTS="$DEFAULT_JVM_OPTS -XX:+PrintTenuringDistribution"
DEFAULT_JVM_OPTS="$DEFAULT_JVM_OPTS -XX:+PrintGCApplicationStoppedTime"
DEFAULT_JVM_OPTS="$DEFAULT_JVM_OPTS -Xloggc:logs/gc.log"
DEFAULT_JVM_OPTS="$DEFAULT_JVM_OPTS -XX:+UseGCLogFileRotation"
DEFAULT_JVM_OPTS="$DEFAULT_JVM_OPTS -XX:NumberOfGCLogFiles=5"
DEFAULT_JVM_OPTS="$DEFAULT_JVM_OPTS -XX:GCLogFileSize=128K"
# 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).
DEFAULT_JVM_OPTS="$DEFAULT_JVM_OPTS -Djava.net.preferIPv4Stack=true"
check_config_install
if [ -e "$QUBOLE_APP_CONF/java.env" ] ; then
. "$QUBOLE_APP_CONF/java.env"
fi
APP_ARGS1=""
APP_ARGS2=""
if [ -e "$QUBOLE_APP_CONF/qubole.json" ] ; then
APP_ARGS1="server"
APP_ARGS2="$QUBOLE_APP_CONF/qubole.json"
elif [ -e "$QUBOLE_APP_CONF/qubole.yml" ] ; then
APP_ARGS1="server"
APP_ARGS2="$QUBOLE_APP_CONF/qubole.yml"
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.
DEFAULT_JVM_OPTS="$DEFAULT_JVM_OPTS -Xms$MAX_HEAP_SIZE"
DEFAULT_JVM_OPTS="$DEFAULT_JVM_OPTS -Xmx$MAX_HEAP_SIZE"
if [ "x$JVM_OPTS" = "x" ] ; then
JVM_OPTS=$DEFAULT_JVM_OPTS
fi
echo java $JVM_OPTS -jar $QUBOLE_APP_LIB/qubole.jar $APP_ARGS1 $APP_ARGS2
java -Dqubole.server=true $JVM_OPTS -jar $QUBOLE_APP_LIB/qubole.jar $APP_ARGS1 $APP_ARGS2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment