get JEMAlloc debug output out of nodetool output

patch by Robert Stupp; reviewed by Ariel Weisberg for CASSANDRA-10628
This commit is contained in:
Robert Stupp 2015-11-04 23:28:57 +01:00
parent a306a1bf32
commit 0ff13d2a68
4 changed files with 68 additions and 51 deletions

View File

@ -1,5 +1,5 @@
2.2.4
* Deprecate memory_allocator in cassandra.yaml (CASSANDRA-10581)
* Deprecate memory_allocator in cassandra.yaml (CASSANDRA-10581,10628)
* Expose phi values from failure detector via JMX and tweak debug
and trace logging (CASSANDRA-9526)
* Fix RangeNamesQueryPager (CASSANDRA-10509)

View File

@ -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"

View File

@ -160,55 +160,6 @@ 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
# Specifies the default port over which Cassandra will be available for
# JMX connections.

View File

@ -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<StartupCheck> DEFAULT_TESTS = ImmutableList.of(checkValidLaunchDate,
private final List<StartupCheck> 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()
{
/**