Tests: Add high throughput with bandwidth limits test
authorChristian Babeux <christian.babeux@efficios.com>
Tue, 25 Sep 2012 16:06:38 +0000 (12:06 -0400)
committerDavid Goulet <dgoulet@efficios.com>
Tue, 25 Sep 2012 18:25:08 +0000 (14:25 -0400)
This test is used to stress the new streaming feature with high
throughput in a bandwidth limited use case.

The bandwidth limitation is done via the tc (traffic control) kernel
utility. Root permissions are needed to set bandwidth limits.  Limits
are set on the loopback interface (lo).

The test cycle through bandwidth limits from 3200kbits to 50kbits.
There are currently two known limitations/issues:

- The tests fails when the lttng stop commands is issued right after the
  traced applications are done executing.

- Setting a bandwidth limit on the control port of the relayd will
  trigger a timeout in the sessiond.

Signed-off-by: Christian Babeux <christian.babeux@efficios.com>
Signed-off-by: David Goulet <dgoulet@efficios.com>
tests/tools/streaming/high_throughput_limits [new file with mode: 0755]

diff --git a/tests/tools/streaming/high_throughput_limits b/tests/tools/streaming/high_throughput_limits
new file mode 100755 (executable)
index 0000000..2fbed3a
--- /dev/null
@@ -0,0 +1,184 @@
+#!/bin/bash
+#
+# Copyright (C) - 2012 Christian Babeux <christian.babeux@efficios.com>
+#                      David Goulet <dgoulet@efficios.com>
+#
+# 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
+TEST_DESC="Streaming - High throughput with bandwith limits"
+
+CURDIR=$(dirname $0)/
+TESTDIR=$CURDIR/../..
+NR_APP_ITER=10
+NR_ITER=1000000
+BIN_NAME="gen-ust-events"
+SESSION_NAME="high-throughput"
+EVENT_NAME="tp:tptest"
+SESSIOND_CTRL_PORT=5342
+SESSIOND_DATA_PORT=5343
+DEFAULT_IF="lo"
+
+TRACE_PATH=$(mktemp -d)
+
+source $TESTDIR/utils.sh
+
+print_test_banner "$TEST_DESC"
+
+if [ ! -x "$CURDIR/$BIN_NAME" ]; then
+       echo -e "No UST nevents binary detected. Passing."
+       exit 0
+fi
+
+if [ "$(id -u)" != "0" ]; then
+       echo "This test must be running as root to set bandwith limits. Aborting"
+       # Exit status 0 so the tests can continue
+       exit 0
+fi
+
+function set_bw_limit
+{
+       limit=$1
+       echo -n "Setting bandwith limits to ${limit}kbits... "
+       tc qdisc add dev $DEFAULT_IF root handle 1: htb default 15 >/dev/null 2>&1
+       tc class add dev $DEFAULT_IF parent 1: classid 1:1 htb rate ${limit}kbit ceil ${limit}kbit >/dev/null 2>&1
+
+       # FIXME: Timeout when setting limits on ctrl port.
+       #tc filter add dev $DEFAULT_IF parent 1: protocol ip u32 match ip dport $SESSIOND_CTRL_PORT 0xffff flowid 1:1 >/dev/null 2>&1
+
+       tc filter add dev $DEFAULT_IF parent 1: protocol ip u32 match ip dport $SESSIOND_DATA_PORT 0xffff flowid 1:1 >/dev/null 2>&1
+       print_ok
+}
+
+function reset_bw_limit
+{
+       echo -n "Resetting bandwith limits... "
+       tc qdisc del dev $DEFAULT_IF root >/dev/null 2>&1
+       print_ok
+}
+
+function create_lttng_session_with_uri
+{
+       sess_name=$1
+       uri=$2
+       # Create session with custom URI
+       $TESTDIR/../src/bin/lttng/$LTTNG_BIN create -U $uri $sess_name >/dev/null 2>&1
+}
+
+function enable_lttng_consumer
+{
+       uri=$1
+       # Create session with custom URI
+       $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-consumer -u $uri >/dev/null 2>&1
+}
+
+function run_apps
+{
+       for i in `seq 1 $NR_APP_ITER`; do
+               ./$CURDIR/$BIN_NAME $NR_ITER & >/dev/null 2>&1
+       done
+}
+
+function wait_apps
+{
+       echo "Waiting for applications to end"
+       while [ -n "$(pidof $BIN_NAME)" ]; do
+               echo -n "."
+               sleep 1
+       done
+       echo ""
+}
+
+function test_high_throughput
+{
+       NETWORK_URI="net://localhost"
+       create_lttng_session_with_uri $SESSION_NAME $NETWORK_URI
+       enable_lttng_consumer $NETWORK_URI
+       enable_ust_lttng_event $SESSION_NAME $EVENT_NAME
+       start_lttng_tracing $SESSION_NAME
+       run_apps
+       wait_apps
+
+       # FIXME: Should not be necessary...
+       #echo "Sleeping..."
+       #sleep 180
+
+       stop_lttng_tracing $SESSION_NAME
+       destroy_lttng_session $SESSION_NAME
+       validate_event_count
+}
+
+function validate_event_count
+{
+
+       TEMP_FILE=$(mktemp)
+       TEMP_FILE_2=$(mktemp)
+
+       traced=$(babeltrace $TRACE_PATH 2>/dev/null | wc -l)
+       babeltrace $TRACE_PATH >/dev/null 2>$TEMP_FILE_2
+
+       cat $TEMP_FILE_2 | cut -f4 -d " " >$TEMP_FILE
+
+       dropped=0
+       while read line;
+       do
+               let dropped=$dropped+$line
+       done < $TEMP_FILE
+
+       let total=$dropped+$traced
+       let wanted=$NR_APP_ITER*$NR_ITER
+
+       rm -rf $TRACE_PATH
+       rm $TEMP_FILE $TEMP_FILE_2
+
+       if [ $wanted -ne $total ]; then
+               echo -n "Expected $wanted. Dropped $dropped. Recorded $traced. Total $total... "
+               print_fail
+               return 1
+       else
+               echo -n "Expected $wanted. Dropped $dropped. Recorded $traced. Total $total... "
+               print_ok
+               return 0
+       fi
+}
+
+function interrupt_cleanup()
+{
+       echo -en "\n*** Exiting ***\n"
+       stop_lttng_relayd
+       stop_lttng_sessiond
+       reset_bw_limit
+       exit 1
+}
+
+# Catch sigint and try to cleanup limits
+trap interrupt_cleanup SIGINT
+
+BW_LIMITS=(3200 1600 800 400 200 100 50 25)
+for BW in ${BW_LIMITS[@]};
+do
+       echo ""
+       echo -e "=== Testing high-throughput with bandwith limit set to ${BW}kbits"
+       set_bw_limit $BW
+
+       start_lttng_sessiond
+       start_lttng_relayd "-o $TRACE_PATH"
+       test_high_throughput
+       result=$?
+       stop_lttng_relayd
+       stop_lttng_sessiond
+       reset_bw_limit
+
+       if [ $result -ne 0 ]; then
+               exit 1
+       fi
+done
This page took 0.036896 seconds and 4 git commands to generate.