diff --git a/CHANGES.txt b/CHANGES.txt index 1914fa1c7f..5fdeae567e 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -6,7 +6,7 @@ * Fix implementation of LegacyLayout.LegacyBoundComparator (CASSANDRA-10602) * Don't use 'names query' read path for counters (CASSANDRA-10572) * Fix backward compatibility for counters (CASSANDRA-10470) - * Remove memory_allocator paramter from cassandra.yaml (CASSANDRA-10581) + * Remove memory_allocator paramter from cassandra.yaml (CASSANDRA-10581,10628) * Execute the metadata reload task of all registered indexes on CFS::reload (CASSANDRA-10604) * Fix thrift cas operations with defined columns (CASSANDRA-10576) * Fix PartitionUpdate.operationCount()for updates with static column operations (CASSANDRA-10606) diff --git a/bin/cassandra b/bin/cassandra index 8d7b14fa7b..0bbd9fb4e3 100755 --- a/bin/cassandra +++ b/bin/cassandra @@ -132,6 +132,55 @@ case "`uname`" in ;; esac +# Cassandra uses an installed jemalloc via LD_PRELOAD / DYLD_INSERT_LIBRARIES by default to improve off-heap +# memory allocation performance. The following code searches for an installed libjemalloc.dylib/.so/.1.so using +# Linux and OS-X specific approaches. +# To specify your own libjemalloc in a different path, configure the fully qualified path in CASSANDRA_LIBJEMALLOC. +# To disable jemalloc preload at all, set CASSANDRA_LIBJEMALLOC=- +# +#CASSANDRA_LIBJEMALLOC= +# +find_library() +{ + pattern=$1 + path=$(echo ${2} | tr ":" " ") + + find $path -regex "$pattern" -print 2>/dev/null | head -n 1 +} +case "`uname -s`" in + Linux) + if [ -z $CASSANDRA_LIBJEMALLOC ] ; then + which ldconfig > /dev/null 2>&1 + if [ $? = 0 ] ; then + # e.g. for CentOS + dirs="/lib64 /lib /usr/lib64 /usr/lib `ldconfig -v 2>/dev/null | grep -v ^$'\t' | sed 's/^\([^:]*\):.*$/\1/'`" + else + # e.g. for Debian, OpenSUSE + dirs="/lib64 /lib /usr/lib64 /usr/lib `cat /etc/ld.so.conf /etc/ld.so.conf.d/*.conf | grep '^/'`" + fi + dirs=`echo $dirs | tr " " ":"` + CASSANDRA_LIBJEMALLOC=$(find_library '.*/libjemalloc\.so\(\.1\)*' $dirs) + fi + if [ ! -z $CASSANDRA_LIBJEMALLOC ] ; then + export JVM_OPTS="$JVM_OPTS -Dcassandra.libjemalloc=$CASSANDRA_LIBJEMALLOC" + if [ "-" != "$CASSANDRA_LIBJEMALLOC" ] ; then + export LD_PRELOAD=$CASSANDRA_LIBJEMALLOC + fi + fi + ;; + Darwin) + if [ -z $CASSANDRA_LIBJEMALLOC ] ; then + CASSANDRA_LIBJEMALLOC=$(find_library '.*/libjemalloc\.dylib' $DYLD_LIBRARY_PATH:${DYLD_FALLBACK_LIBRARY_PATH-$HOME/lib:/usr/local/lib:/lib:/usr/lib}) + fi + if [ ! -z $CASSANDRA_LIBJEMALLOC ] ; then + export JVM_OPTS="$JVM_OPTS -Dcassandra.libjemalloc=$CASSANDRA_LIBJEMALLOC" + if [ "-" != "$CASSANDRA_LIBJEMALLOC" ] ; then + export DYLD_INSERT_LIBRARIES=$CASSANDRA_LIBJEMALLOC + fi + fi + ;; +esac + launch_service() { pidpath="$1" diff --git a/conf/cassandra-env.sh b/conf/cassandra-env.sh index 2f0ae345fc..ef164e8347 100644 --- a/conf/cassandra-env.sh +++ b/conf/cassandra-env.sh @@ -156,55 +156,6 @@ if [ "x$MALLOC_ARENA_MAX" = "x" ] ; then export MALLOC_ARENA_MAX=4 fi -# Cassandra uses an installed jemalloc via LD_PRELOAD / DYLD_INSERT_LIBRARIES by default to improve off-heap -# memory allocation performance. The following code searches for an installed libjemalloc.dylib/.so/.1.so using -# Linux and OS-X specific approaches. -# To specify your own libjemalloc in a different path, configure the fully qualified path in CASSANDRA_LIBJEMALLOC. -# To disable jemalloc at all set CASSANDRA_LIBJEMALLOC=- -# -#CASSANDRA_LIBJEMALLOC= -# -find_library() -{ - pattern=$1 - path=$(echo ${2} | tr ":" " ") - - find $path -regex "$pattern" -print 2>/dev/null | head -n 1 -} -case "`uname -s`" in - Linux) - if [ -z $CASSANDRA_LIBJEMALLOC ] ; then - which ldconfig > /dev/null 2>&1 - if [ $? = 0 ] ; then - # e.g. for CentOS - dirs="/lib64 /lib /usr/lib64 /usr/lib `ldconfig -v 2>/dev/null | grep -v ^$'\t' | sed 's/^\([^:]*\):.*$/\1/'`" - else - # e.g. for Debian, OpenSUSE - dirs="/lib64 /lib /usr/lib64 /usr/lib `cat /etc/ld.so.conf /etc/ld.so.conf.d/*.conf | grep '^/'`" - fi - dirs=`echo $dirs | tr " " ":"` - CASSANDRA_LIBJEMALLOC=$(find_library '.*/libjemalloc\.so\(\.1\)*' $dirs) - fi - if [ ! -z $CASSANDRA_LIBJEMALLOC ] && [ "-" != "$CASSANDRA_LIBJEMALLOC" ] ; then - echo "INFO preloading $CASSANDRA_LIBJEMALLOC" - export LD_PRELOAD=$CASSANDRA_LIBJEMALLOC - else - echo "WARNING could not find libjemalloc.dylib, please install for better performance - search path: $dirs" - fi - ;; - Darwin) - if [ -z $CASSANDRA_LIBJEMALLOC ] ; then - CASSANDRA_LIBJEMALLOC=$(find_library '.*/libjemalloc\.dylib' $DYLD_LIBRARY_PATH:${DYLD_FALLBACK_LIBRARY_PATH-$HOME/lib:/usr/local/lib:/lib:/usr/lib}) - fi - if [ ! -z $CASSANDRA_LIBJEMALLOC ] && [ "-" != "$CASSANDRA_LIBJEMALLOC" ] ; then - echo "INFO preloading $CASSANDRA_LIBJEMALLOC" - export DYLD_INSERT_LIBRARIES=$CASSANDRA_LIBJEMALLOC - else - echo "WARNING could not find libjemalloc.dylib, please install for better performance - search path: $DYLD_LIBRARY_PATH:${DYLD_FALLBACK_LIBRARY_PATH-$HOME/lib:/usr/local/lib:/lib:/usr/lib}" - fi - ;; -esac - # Here we create the arguments that will get passed to the jvm when # starting cassandra. diff --git a/src/java/org/apache/cassandra/service/StartupChecks.java b/src/java/org/apache/cassandra/service/StartupChecks.java index 16ff488078..ebe4b26259 100644 --- a/src/java/org/apache/cassandra/service/StartupChecks.java +++ b/src/java/org/apache/cassandra/service/StartupChecks.java @@ -67,7 +67,8 @@ public class StartupChecks // The default set of pre-flight checks to run. Order is somewhat significant in that we probably // always want the system keyspace check run last, as this actually loads the schema for that // keyspace. All other checks should not require any schema initialization. - private final List DEFAULT_TESTS = ImmutableList.of(checkValidLaunchDate, + private final List DEFAULT_TESTS = ImmutableList.of(checkJemalloc, + checkValidLaunchDate, checkJMXPorts, inspectJvmOptions, checkJnaInitialization, @@ -103,6 +104,22 @@ public class StartupChecks test.execute(); } + public static final StartupCheck checkJemalloc = new StartupCheck() + { + public void execute() throws StartupException + { + if (FBUtilities.isWindows()) + return; + String jemalloc = System.getProperty("cassandra.libjemalloc"); + if (jemalloc == null) + logger.warn("jemalloc shared library could not be preloaded to speed up memory allocations"); + else if ("-".equals(jemalloc)) + logger.info("jemalloc preload explicitly disabled"); + else + logger.info("jemalloc seems to be preloaded from {}", jemalloc); + } + }; + public static final StartupCheck checkValidLaunchDate = new StartupCheck() { /**