From 605ac7582cd379d4c6d0744f822a494640ae2cc7 Mon Sep 17 00:00:00 2001 From: David Goulet Date: Wed, 22 May 2013 15:17:17 -0400 Subject: [PATCH] Tests: Add stress test for multi session per UID For this test, 10 applications are used with 5 sessions set with per UID buffers. A helper script is also added which launch applications with given parameters. A README file is also present to help developers/users use the stress tests correctly. Stress tests save the stderr/stdout of the session daemon in a log file and core dump created using the name found in core_pattern (in /proc). Signed-off-by: David Goulet --- configure.ac | 1 + tests/Makefile.am | 2 +- tests/stress/Makefile.am | 2 + tests/stress/README | 19 +++ tests/stress/launch_ust_app | 59 +++++++ .../stress/test_multi_sessions_per_uid_10app | 146 ++++++++++++++++++ 6 files changed, 228 insertions(+), 1 deletion(-) create mode 100644 tests/stress/Makefile.am create mode 100644 tests/stress/README create mode 100755 tests/stress/launch_ust_app create mode 100755 tests/stress/test_multi_sessions_per_uid_10app diff --git a/configure.ac b/configure.ac index d5733b3b4..d8a692507 100644 --- a/configure.ac +++ b/configure.ac @@ -348,6 +348,7 @@ AC_CONFIG_FILES([ tests/regression/ust/exit-fast/Makefile tests/regression/ust/fork/Makefile tests/regression/ust/libc-wrapper/Makefile + tests/stress/Makefile tests/unit/Makefile tests/utils/Makefile tests/utils/tap/Makefile diff --git a/tests/Makefile.am b/tests/Makefile.am index c8a85e06d..6d5b00d9a 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = utils regression unit +SUBDIRS = utils regression unit stress if USE_PYTHON check-am: diff --git a/tests/stress/Makefile.am b/tests/stress/Makefile.am new file mode 100644 index 000000000..e9b99e543 --- /dev/null +++ b/tests/stress/Makefile.am @@ -0,0 +1,2 @@ +noinst_SCRIPTS = README launch_ust_app test_multi_sessions_per_uid_10app +EXTRA_DIST = README launch_ust_app test_multi_sessions_per_uid_10app diff --git a/tests/stress/README b/tests/stress/README new file mode 100644 index 000000000..f565e3b7c --- /dev/null +++ b/tests/stress/README @@ -0,0 +1,19 @@ +Compiling the whole code base with "-O0" is HIGHLY recommended before running +stress tests. This makes the GDB backtrace accurate and without values +optimized out. + +Use this diff: +------- +diff --git a/configure.ac b/configure.ac +index d5733b3..8bbb115 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -285,7 +285,7 @@ AC_PROG_LEX + + AC_DEFUN([AC_PROG_BISON], [AC_CHECK_PROGS(BISON, bison, bison)]) + + -CFLAGS="-Wall $CFLAGS -g -fno-strict-aliasing" + +CFLAGS="-Wall $CFLAGS -g -fno-strict-aliasing -O0" + + DEFAULT_INCLUDES="-I\$(top_srcdir) -I\$(top_builddir) -I\$(top_builddir)/src -I\$(top_builddir)/include - +------- diff --git a/tests/stress/launch_ust_app b/tests/stress/launch_ust_app new file mode 100755 index 000000000..2bb8e4f66 --- /dev/null +++ b/tests/stress/launch_ust_app @@ -0,0 +1,59 @@ +#!/bin/bash +# +# Copyright (C) - 2013 David Goulet +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this library; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +CURDIR=$(dirname $0)/ +TESTDIR=$CURDIR/.. + +NR_APP=1 +NR_USEC_WAIT=5000000 +NR_APP_LOOP=1 + +TESTAPP_PATH="$TESTDIR/utils/testapp" +TESTAPP_NAME="gen-ust-events" +TESTAPP_BIN="$TESTAPP_PATH/$TESTAPP_NAME/$TESTAPP_NAME" + +source $TESTDIR/utils/utils.sh + +if [ ! -x "$TESTAPP_BIN" ]; then + BAIL_OUT "No UST nevents binary detected." +fi + +# Number of application to spawn. +if [ -n "$1" ]; then + NR_APP=$1 +fi + +# Number of seconds before the next loop is done in the app. +if [ -n "$2" ]; then + NR_USEC_WAIT=$(echo $(( $2 * 1000000 ))) +fi + +# Number of loop the application should do meaning one TP is hit per loop. +if [ -n "$3" ]; then + NR_APP_LOOP=$3 +fi + +# MUST set TESTDIR before this point. + +# Infinite loop. Spawns NR_APP apps for NR_USEC_WAIT doing NR_APP_LOOP. +while :; do + for j in `seq 1 $NR_APP`; do + $TESTAPP_BIN $NR_APP_LOOP $NR_USEC_WAIT >/dev/null 2>&1 & + done + # Wait before the next round of applications. + sleep 3 +done diff --git a/tests/stress/test_multi_sessions_per_uid_10app b/tests/stress/test_multi_sessions_per_uid_10app new file mode 100755 index 000000000..c960957f2 --- /dev/null +++ b/tests/stress/test_multi_sessions_per_uid_10app @@ -0,0 +1,146 @@ +#!/bin/bash +# +# Copyright (C) - 2013 David Goulet +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; version 2.1 of the License. +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this library; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + +CURDIR=$(dirname $0)/ +TESTDIR=$CURDIR/.. +LAUNCH_APP="launch_ust_app" +SESSION_NAME="stress" +EVENT_NAME="tp:tptest" +LOG_FILE="sessiond.log" +CHANNEL_NAME="channel0" +NUM_TESTS=16 +NR_APP=10 +NR_SESSION=5 +NR_LOOP=1000 +COREDUMP_FILE=$(cat /proc/sys/kernel/core_pattern) + +TEST_DESC="Stress test - $NR_SESSION sessions per UID with $NR_APP apps" + +source $TESTDIR/utils/utils.sh + +# MUST set TESTDIR before calling those functions + +function enable_channel_per_uid() +{ + local sess_name=$1 + local channel_name=$2 + + $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-channel --buffers-uid -u $channel_name -s $sess_name >/dev/null 2>&1 + ok $? "Enable channel $channel_name per UID for session $sess_name" +} + +function check_sessiond() +{ + if [ -z "$(pidof lt-lttng-sessiond)" ]; then + local str_date=$(date +%H%M%S-%d%m%Y) + + diag "!!!The session daemon died unexpectedly!!!" + mv $LOG_FILE $LOG_FILE-$str_date + if [ -e $COREDUMP_FILE ]; then + mv $COREDUMP_FILE $COREDUMP_FILE-$str_date + fi + exit 1 + fi +} + +function start_sessiond() +{ + local SESSIOND_BIN="lttng-sessiond" + + validate_kernel_version + if [ $? -ne 0 ]; then + fail "Start session daemon" + BAIL_OUT "*** Kernel too old for session daemon tests ***" + fi + + if [ -z $(pidof lt-$SESSIOND_BIN) ]; then + # We have to start it like this so the ulimit -c is used by this + # process. Also, we collect any error message printed out. + $TESTDIR/../src/bin/lttng-sessiond/$SESSIOND_BIN --quiet --consumerd32-path="$TESTDIR/../src/bin/lttng-consumerd/lttng-consumerd" --consumerd64-path="$TESTDIR/../src/bin/lttng-consumerd/lttng-consumerd" >$LOG_FILE 2>&1 & + status=$? + # Wait for sessiond to bootstrap + sleep 2 + ok $status "Start session daemon" + fi +} + +test_stress() +{ + for b in $(seq 1 $NR_LOOP); do + for a in $(seq 1 $NR_SESSION); do + create_lttng_session $SESSION_NAME-$a $TRACE_PATH + check_sessiond + enable_channel_per_uid $SESSION_NAME-$a $CHANNEL_NAME + check_sessiond + enable_ust_lttng_event $SESSION_NAME-$a $EVENT_NAME + check_sessiond + start_lttng_tracing $SESSION_NAME-$a + check_sessiond + done + + for a in $(seq 1 $NR_SESSION); do + stop_lttng_tracing $SESSION_NAME-$a + check_sessiond + destroy_lttng_session $SESSION_NAME-$a + check_sessiond + done + done + + return 0 +} + +function cleanup() +{ + diag "Cleaning up!" + killall -9 $LAUNCH_APP + stop_lttng_sessiond +} + +function sighandler() +{ + cleanup + rm $LOG_FILE + exit 1 +} + +trap sighandler SIGINT + +# Make sure we collect a coredump if possible. +ulimit -c unlimited + +# MUST set TESTDIR before calling those functions +plan_tests $NUM_TESTS + +print_test_banner "$TEST_DESC" + +start_sessiond + +diag "Starting applications" + +# Start NR_APP applications script that will spawn apps non stop. +./$TESTDIR/stress/$LAUNCH_APP $NR_APP & + +TRACE_PATH=$(mktemp -d) + +test_stress +out=$? +if [ $out -ne 0 ]; then + cleanup + exit $out +fi + +cleanup +rm -rf $TRACE_PATH +rm $LOG_FILE +exit 0 -- 2.34.1