[lttng-dev] [PATCH lttng-tools] Tests: Add high throughput with bandwidth limits test

Christian Babeux christian.babeux at efficios.com
Tue Sep 25 12:06:38 EDT 2012


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 at efficios.com>
---
 tests/tools/streaming/high_through_limits | 185 ++++++++++++++++++++++++++++++
 tests/tools/streaming/runall              |   2 +-
 2 files changed, 186 insertions(+), 1 deletion(-)
 create mode 100755 tests/tools/streaming/high_through_limits

diff --git a/tests/tools/streaming/high_through_limits b/tests/tools/streaming/high_through_limits
new file mode 100755
index 0000000..0f0a4eb
--- /dev/null
+++ b/tests/tools/streaming/high_through_limits
@@ -0,0 +1,185 @@
+#!/bin/bash
+#
+# Copyright (C) - 2012 Christian Babeux <christian.babeux at efficios.com>
+#                      David Goulet <dgoulet at 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
+
diff --git a/tests/tools/streaming/runall b/tests/tools/streaming/runall
index 6dffd78..a93dcfa 100755
--- a/tests/tools/streaming/runall
+++ b/tests/tools/streaming/runall
@@ -2,7 +2,7 @@
 
 DIR=$(dirname $0)
 
-tests=( $DIR/unit_tests $DIR/uri_switch $DIR/run-kernel $DIR/run-ust )
+tests=( $DIR/unit_tests $DIR/uri_switch $DIR/high_through_limits $DIR/run-kernel $DIR/run-ust )
 exit_code=0
 
 function start_tests ()
-- 
1.7.12




More information about the lttng-dev mailing list