From fd6c6857955bc603c41017ae931110557bd6334d Mon Sep 17 00:00:00 2001
From: Peter Cai <peter.cai@uwaterloo.ca>
Date: Thu, 16 Mar 2023 16:41:09 -0400
Subject: [PATCH] Add TCP script

---
 configs/mutilate.sh             |  3 ++-
 experiments/extra.shared.sh     |  8 +++++-
 experiments/memcached.shared.sh |  4 +--
 tcp.sh                          | 43 +++++++++++++++++++++++++++++++++
 4 files changed, 54 insertions(+), 4 deletions(-)
 create mode 100644 tcp.sh

diff --git a/configs/mutilate.sh b/configs/mutilate.sh
index b363770..c43ed77 100644
--- a/configs/mutilate.sh
+++ b/configs/mutilate.sh
@@ -2,7 +2,8 @@
 MEMSERVER_IP=192.168.199.1
 # List of Mutilate clients
 MEMCLIENTS=tilly03,tilly04,tilly05,tilly06,tilly07,tilly08
+MEMCTRL=tilly02
 # Command shorthands
-MUTILATE="ssh tilly02 taskset -c 0-7 mutilate -T8"
+MUTILATE="ssh $MEMCTRL taskset -c 0-7 mutilate -T8"
 MUTILATE+=" -s $MEMSERVER_IP -d1 -K fb_key -V fb_value -i fb_ia -r1000000"
 MUTCLIENTS=$(for m in $(echo $MEMCLIENTS|tr , ' '); do echo " -a $m";done)
diff --git a/experiments/extra.shared.sh b/experiments/extra.shared.sh
index 6907853..d3987d9 100644
--- a/experiments/extra.shared.sh
+++ b/experiments/extra.shared.sh
@@ -12,9 +12,15 @@ perf_stat_stop() {
 }
 
 extra_data_start() {
+    for m in $(echo "$1" | tr , ' '); do
+        sudo -u $SSH_USER ssh $m "bash -s $NET_IF" < "$EXP_ROOT/tcp.sh" > /dev/null
+    done
     "$EXP_ROOT/irq.sh" > /dev/null
 }
 
 extra_data_stop() {
-    "$EXP_ROOT/irq.sh" > "$DATA_OUT/irq_$1$EXP_AUX_SUFFIX.txt"
+    "$EXP_ROOT/irq.sh" > "$DATA_OUT/irq_$2$EXP_AUX_SUFFIX.txt"
+    for m in $(echo "$1" | tr , ' '); do
+        sudo -u $SSH_USER ssh $m "bash -s $NET_IF" < "$EXP_ROOT/tcp.sh" >> "$DATA_OUT/tcp_$2$EXP_AUX_SUFFIX.txt"
+    done
 }
diff --git a/experiments/memcached.shared.sh b/experiments/memcached.shared.sh
index 49ad70c..d6423f1 100644
--- a/experiments/memcached.shared.sh
+++ b/experiments/memcached.shared.sh
@@ -59,9 +59,9 @@ run_mutilate() {
     fi
     echo "Running mutilate with $CONNS connections per agent (core) and QPS = $QPS"
     perf_stat_start "$1"
-    extra_data_start
+    extra_data_start $MEMCTRL,$MEMCLIENTS
     sudo -u $SSH_USER $MUTILATE --noload -c$CONNS $MUTCLIENTS -t30 -u 0 -q $QPS | tee $DATA_OUT/$1$EXP_AUX_SUFFIX.txt
-    extra_data_stop "$1"
+    extra_data_stop $MEMCTRL,$MEMCLIENTS "$1"
     perf_stat_stop
     NO_RUNS=$((NO_RUNS + 1))
 }
diff --git a/tcp.sh b/tcp.sh
new file mode 100644
index 0000000..241b693
--- /dev/null
+++ b/tcp.sh
@@ -0,0 +1,43 @@
+#!/bin/bash
+
+function error() {
+	echo $*
+	echo "usage $9 <device> [clear]"
+	exit 1
+}
+
+if [ $# -lt 1 ] || [ ! ip link show dev $1 >/dev/null 2>&1 ]; then
+	error "device $1 not found"
+fi
+
+cntfile=$HOME/.tcp.sh.count
+[ -f $cntfile ] || touch $cntfile
+
+[ "$2" = "clear" ] && {
+	sentprev=0
+	retransprev=0
+	timeoutprev=0
+} || {
+	sentprev=$((grep -F sent: $cntfile || echo ":0")|cut -f2 -d:)
+	retransprev=$((grep -F retrans: $cntfile || echo ":0")|cut -f2 -d:)
+	timeoutprev=$((grep -F timeout: $cntfile || echo ":0")|cut -f2 -d:)
+}
+
+sentnow=$((netstat -s|grep -F "segments sent out" || echo 0)|awk '{print $1}')
+retransnow=$((netstat -s|grep -F "segments retransmitted" || echo 0)|awk '{print $1}')
+timeoutnow=$((netstat -s|grep -F "TCPTimeout" || echo 0 0 0)|awk '{print $2}')
+
+echo "sent:$sentnow" > $cntfile
+echo "retrans:$retransnow" >> $cntfile
+echo "timeout:$timeoutnow" >> $cntfile
+
+sent=$(expr $sentnow - $sentprev)
+retrans=$(expr $retransnow - $retransprev)
+timeout=$(expr $timeoutnow - $timeoutprev)
+
+[ $sent -gt 0 ] && loss=$(printf "scale=6\n$timeout / $sent\n"|bc) || loss=0
+
+[ $(expr $sent + $retrans + $timeout) -gt 0 ] && printf "sent %10d | retrans %10d | timeout %10d | loss rate %3.4f%%\n" $sent $retrans $timeout $loss
+
+exit 0
+
-- 
GitLab