[tor-commits] [flashproxy/master] Add throughput measurement script.

dcf at torproject.org dcf at torproject.org
Sun Oct 30 22:22:48 UTC 2011


commit a239d995242dd9205f7826a29ccf793bfc7eb803
Author: David Fifield <david at bamsoftware.com>
Date:   Sun Oct 30 03:29:47 2011 -0700

    Add throughput measurement script.
---
 experiments/README                       |   45 ++++++++++++-
 experiments/common.sh                    |   34 ++++++++++
 experiments/throughput/throughput-all.sh |    5 ++
 experiments/throughput/throughput.sh     |  105 ++++++++++++++++++++++++++++++
 4 files changed, 185 insertions(+), 4 deletions(-)

diff --git a/experiments/README b/experiments/README
index 5d65b28..ff8b416 100644
--- a/experiments/README
+++ b/experiments/README
@@ -1,6 +1,43 @@
-Scripts for running experiments.
+This directory contains scripts for testing and benchmarking the flash
+proxy.
 
-This README contains descriptions of each numbered experiment.
+== Preparation
 
-Experiment
-00  -   Includes socat, crossdomaind, swfcat, httpd, and facilitator
+You need to have installed certain software before running the tests.
+	Firefox
+	socat
+	Wget
+	Python
+	thttpd
+	Flash Player
+Firefox, socat, Wget, and Python are easily installed on most GNU/Linux
+distributions. thttpd can be compiled from the packages at
+http://acme.com/software/thttpd/. A debug version of Flash Player can be
+downloaded from http://www.adobe.com/support/flashplayer/downloads.html.
+
+You need to create some dedicated Firefox profiles. Create profiles
+named flashexp1 and flashexp2 by running
+	firefox -ProfileManager -no-remote
+Start the browsers with
+	firefox -P flashexp1 -no-remote &
+	firefox -P flashexp2 -no-remote &
+and in each one, set this about:config variable:
+	browser.link.open_newwindow=1 (default is 3)
+This allows the scripts to clear the contents of a tab and replace them
+with another page.
+
+Before running any tests, start the crossdomain server as root:
+	sudo crossdomaind.py --daemon
+The tests themselves shouldn't be run as root.
+
+I personally run these tests in an Arch Linux VM.
+	useradd -m user
+	passwd user
+	pacman -Sy
+	pacman -Su
+	pacman -S firefox socat python2 xorg xorg-xinit xterm flashplugin gcc make
+Download thttpd, compile it (you have to rename the getline function to
+avoid a naming conflict), and install it in /usr/local/bin. Symlink
+/usr/bin/python to /usr/bin/python2. Also you have to install the
+ttf-ms-fonts package from the AUR for text to show up in Flash Player.
+Add a window manager, run "startx", and you should be set.
diff --git a/experiments/common.sh b/experiments/common.sh
new file mode 100644
index 0000000..485e908
--- /dev/null
+++ b/experiments/common.sh
@@ -0,0 +1,34 @@
+# This file contains common variables and subroutines used by the experiment
+# scripts.
+
+FIREFOX=firefox
+SOCAT=socat
+THTTPD=thttpd
+
+visible_sleep() {
+	N="$1"
+	echo -n "sleep $N"
+	while [ "$N" -gt 0 ]; do
+		sleep 1
+		N=$((N-1))
+		echo -ne "\rsleep $N"
+	done
+	echo -ne "\n"
+}
+
+ensure_browser_started() {
+	local PROFILE="$1"
+	("$FIREFOX" -P "$PROFILE" -remote "ping()" || "$FIREFOX" -P "$PROFILE" -no-remote & visible_sleep 5) 2>/dev/null
+}
+
+browser_clear() {
+	local PROFILE="$1"
+	("$FIREFOX" -P "$PROFILE" -remote "ping()" && "$FIREFOX" -P "$PROFILE" -remote "openurl(about:blank)" &) 2>/dev/null
+}
+
+browser_goto() {
+	local PROFILE="$1"
+	local URL="$2"
+	ensure_browser_started "$PROFILE"
+	"$FIREFOX" -P "$PROFILE" -remote "openurl($URL)" 2>/dev/null
+}
diff --git a/experiments/throughput/throughput-all.sh b/experiments/throughput/throughput-all.sh
new file mode 100755
index 0000000..015e3e1
--- /dev/null
+++ b/experiments/throughput/throughput-all.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+for n in $(seq 1 50); do
+	./throughput.sh -n $n
+done
diff --git a/experiments/throughput/throughput.sh b/experiments/throughput/throughput.sh
new file mode 100755
index 0000000..5e2fd4b
--- /dev/null
+++ b/experiments/throughput/throughput.sh
@@ -0,0 +1,105 @@
+#!/bin/sh
+
+# Usage: ./throughput.sh [-n NUM_CLIENTS]
+#
+# Tests the raw throughput of a single proxy. This script starts a web server
+# serving swfcat.swf and a large data file, starts a facilitator, connector, and
+# socat shim, and then starts multiple downloads through the proxy at once.
+# Results are saved in a file called results-NUM_CLIENTS-DATE, where DATE is the
+# current date.
+
+. ../common.sh
+
+FLASHPROXY_DIR=../../../flashproxy
+
+NUM_CLIENTS=1
+
+while getopts "n:" OPTNAME; do
+	if [ "$OPTNAME" == n ]; then
+		NUM_CLIENTS="$OPTARG"
+	fi
+done
+
+PROFILE=flashexp1
+PROXY_URL="http://localhost:8000/swfcat.swf?facilitator=127.0.0.1:9002&max_clients=$NUM_CLIENTS&facilitator_poll_interval=1.0"
+DATA_FILE_NAME="$FLASHPROXY_DIR/dump"
+RESULTS_FILE_NAME="results-$NUM_CLIENTS-$(date --iso)"
+
+# Declare an array.
+declare -a PIDS_TO_KILL
+stop() {
+	browser_clear "$PROFILE"
+	if [ -n "${PIDS_TO_KILL[*]}" ]; then
+		echo "Kill pids ${PIDS_TO_KILL[@]}."
+		kill "${PIDS_TO_KILL[@]}"
+	fi
+	echo "Delete data file."
+	rm -f "$DATA_FILE_NAME"
+	exit
+}
+trap stop EXIT
+
+echo "Create data file."
+dd if=/dev/null of="$DATA_FILE_NAME" bs=1M seek=100 2>/dev/null || exit
+
+echo "Start web server."
+"$THTTPD" -D -d "$FLASHPROXY_DIR" -p 8000 &
+PIDS_TO_KILL+=($!)
+
+echo "Start facilitator."
+"$FLASHPROXY_DIR"/facilitator.py -d --relay 127.0.0.1:8000 >/dev/null &
+PIDS_TO_KILL+=($!)
+visible_sleep 1
+
+echo "Start connector."
+"$FLASHPROXY_DIR"/connector.py >/dev/null &
+PIDS_TO_KILL+=($!)
+visible_sleep 1
+
+echo "Start browser."
+browser_goto "$PROFILE" "$PROXY_URL"
+visible_sleep 2
+
+# Create sufficiently many client registrations.
+i=0
+while [ $i -lt $NUM_CLIENTS ]; do
+	echo -ne "\rRegister client $((i + 1))."
+	echo $'POST / HTTP/1.0\r\n\r\nclient=127.0.0.1:9000' | socat STDIN TCP-CONNECT:localhost:9002
+	sleep 1
+	i=$((i + 1))
+done
+echo
+visible_sleep 2
+
+echo "Start socat."
+"$SOCAT" TCP-LISTEN:2000,fork,reuseaddr SOCKS4A:localhost:dummy:0,socksport=9001 &
+PIDS_TO_KILL+=($!)
+visible_sleep 1
+
+
+# Extract and parse the "real" part of "time" output and return as a count of
+# seconds.
+extract_real_time() {
+	perl -n -e '($m, $s) = ($_ =~ m/real\s+(\d+)m([\d\.]+)s/); if (defined($m)) { print $m*60 + $s . "\n"; }'
+}
+
+> "$RESULTS_FILE_NAME"
+
+declare -a WAIT_PIDS
+i=0
+while [ $i -lt $NUM_CLIENTS ]; do
+	echo "Start Wget $((i + 1))."
+	(
+		times=$((time wget http://localhost:2000/dump -q --timeout 30 -t 1 -O /dev/null) 2>&1)
+		if [ $? -eq 0 ]; then
+			echo "$times" | extract_real_time >> "$RESULTS_FILE_NAME"
+		else
+			echo "error" >> "$RESULTS_FILE_NAME"
+		fi
+	) &
+	WAIT_PIDS+=($!)
+	i=$((i + 1))
+done
+for pid in "${WAIT_PIDS[@]}"; do
+	wait "$pid"
+done





More information about the tor-commits mailing list