xref: /openbmc/linux/samples/bpf/do_hbm_test.sh (revision 8be98d2f2a0a262f8bf8a0bc1fdf522b3c7aab17)
14ffd44cfSbrakmo#!/bin/bash
24ffd44cfSbrakmo# SPDX-License-Identifier: GPL-2.0
34ffd44cfSbrakmo#
44ffd44cfSbrakmo# Copyright (c) 2019 Facebook
54ffd44cfSbrakmo#
64ffd44cfSbrakmo# This program is free software; you can redistribute it and/or
74ffd44cfSbrakmo# modify it under the terms of version 2 of the GNU General Public
84ffd44cfSbrakmo# License as published by the Free Software Foundation.
94ffd44cfSbrakmo
104ffd44cfSbrakmoUsage() {
114ffd44cfSbrakmo  echo "Script for testing HBM (Host Bandwidth Manager) framework."
124ffd44cfSbrakmo  echo "It creates a cgroup to use for testing and load a BPF program to limit"
13*d94436a5SMasanari Iida  echo "egress or ingress bandwidth. It then uses iperf3 or netperf to create"
144ffd44cfSbrakmo  echo "loads. The output is the goodput in Mbps (unless -D was used)."
154ffd44cfSbrakmo  echo ""
16ffd81558Sbrakmo  echo "USAGE: $name [out] [-b=<prog>|--bpf=<prog>] [-c=<cc>|--cc=<cc>]"
1771634d7fSbrakmo  echo "             [-D] [-d=<delay>|--delay=<delay>] [--debug] [-E] [--edt]"
184ffd44cfSbrakmo  echo "             [-f=<#flows>|--flows=<#flows>] [-h] [-i=<id>|--id=<id >]"
19ffd81558Sbrakmo  echo "             [-l] [-N] [--no_cn] [-p=<port>|--port=<port>] [-P]"
204ffd44cfSbrakmo  echo "             [-q=<qdisc>] [-R] [-s=<server>|--server=<server]"
214ffd44cfSbrakmo  echo "             [-S|--stats] -t=<time>|--time=<time>] [-w] [cubic|dctcp]"
224ffd44cfSbrakmo  echo "  Where:"
234ffd44cfSbrakmo  echo "    out               egress (default)"
244ffd44cfSbrakmo  echo "    -b or --bpf       BPF program filename to load and attach."
254ffd44cfSbrakmo  echo "                      Default is hbm_out_kern.o for egress,"
264ffd44cfSbrakmo  echo "    -c or -cc         TCP congestion control (cubic or dctcp)"
274ffd44cfSbrakmo  echo "    --debug           print BPF trace buffer"
284ffd44cfSbrakmo  echo "    -d or --delay     add a delay in ms using netem"
294ffd44cfSbrakmo  echo "    -D                In addition to the goodput in Mbps, it also outputs"
304ffd44cfSbrakmo  echo "                      other detailed information. This information is"
314ffd44cfSbrakmo  echo "                      test dependent (i.e. iperf3 or netperf)."
324ffd44cfSbrakmo  echo "    -E                enable ECN (not required for dctcp)"
3371634d7fSbrakmo  echo "    --edt             use fq's Earliest Departure Time (requires fq)"
344ffd44cfSbrakmo  echo "    -f or --flows     number of concurrent flows (default=1)"
354ffd44cfSbrakmo  echo "    -i or --id        cgroup id (an integer, default is 1)"
364ffd44cfSbrakmo  echo "    -N                use netperf instead of iperf3"
37ffd81558Sbrakmo  echo "    --no_cn           Do not return CN notifications"
384ffd44cfSbrakmo  echo "    -l                do not limit flows using loopback"
394ffd44cfSbrakmo  echo "    -h                Help"
404ffd44cfSbrakmo  echo "    -p or --port      iperf3 port (default is 5201)"
414ffd44cfSbrakmo  echo "    -P                use an iperf3 instance for each flow"
424ffd44cfSbrakmo  echo "    -q                use the specified qdisc"
434ffd44cfSbrakmo  echo "    -r or --rate      rate in Mbps (default 1s 1Gbps)"
444ffd44cfSbrakmo  echo "    -R                Use TCP_RR for netperf. 1st flow has req"
454ffd44cfSbrakmo  echo "                      size of 10KB, rest of 1MB. Reply in all"
464ffd44cfSbrakmo  echo "                      cases is 1 byte."
474ffd44cfSbrakmo  echo "                      More detailed output for each flow can be found"
484ffd44cfSbrakmo  echo "                      in the files netperf.<cg>.<flow>, where <cg> is the"
494ffd44cfSbrakmo  echo "                      cgroup id as specified with the -i flag, and <flow>"
504ffd44cfSbrakmo  echo "                      is the flow id starting at 1 and increasing by 1 for"
514ffd44cfSbrakmo  echo "                      flow (as specified by -f)."
524ffd44cfSbrakmo  echo "    -s or --server    hostname of netperf server. Used to create netperf"
534ffd44cfSbrakmo  echo "                      test traffic between to hosts (default is within host)"
544ffd44cfSbrakmo  echo "                      netserver must be running on the host."
554ffd44cfSbrakmo  echo "    -S or --stats     whether to update hbm stats (default is yes)."
564ffd44cfSbrakmo  echo "    -t or --time      duration of iperf3 in seconds (default=5)"
574ffd44cfSbrakmo  echo "    -w                Work conserving flag. cgroup can increase its"
584ffd44cfSbrakmo  echo "                      bandwidth beyond the rate limit specified"
594ffd44cfSbrakmo  echo "                      while there is available bandwidth. Current"
604ffd44cfSbrakmo  echo "                      implementation assumes there is only one NIC"
614ffd44cfSbrakmo  echo "                      (eth0), but can be extended to support multiple"
624ffd44cfSbrakmo  echo "                       NICs."
634ffd44cfSbrakmo  echo "    cubic or dctcp    specify which TCP CC to use"
644ffd44cfSbrakmo  echo " "
654ffd44cfSbrakmo  exit
664ffd44cfSbrakmo}
674ffd44cfSbrakmo
684ffd44cfSbrakmo#set -x
694ffd44cfSbrakmo
704ffd44cfSbrakmodebug_flag=0
714ffd44cfSbrakmoargs="$@"
724ffd44cfSbrakmoname="$0"
734ffd44cfSbrakmonetem=0
744ffd44cfSbrakmocc=x
754ffd44cfSbrakmodir="-o"
764ffd44cfSbrakmodir_name="out"
774ffd44cfSbrakmodur=5
784ffd44cfSbrakmoflows=1
794ffd44cfSbrakmoid=1
804ffd44cfSbrakmoprog=""
814ffd44cfSbrakmoport=5201
824ffd44cfSbrakmorate=1000
834ffd44cfSbrakmomulti_iperf=0
844ffd44cfSbrakmoflow_cnt=1
854ffd44cfSbrakmouse_netperf=0
864ffd44cfSbrakmorr=0
874ffd44cfSbrakmoecn=0
884ffd44cfSbrakmodetails=0
894ffd44cfSbrakmoserver=""
904ffd44cfSbrakmoqdisc=""
914ffd44cfSbrakmoflags=""
924ffd44cfSbrakmodo_stats=0
934ffd44cfSbrakmo
94c5815ac7SDaniel T. LeeBPFFS=/sys/fs/bpf
95c5815ac7SDaniel T. Leefunction config_bpffs () {
96c5815ac7SDaniel T. Lee	if mount | grep $BPFFS > /dev/null; then
97c5815ac7SDaniel T. Lee		echo "bpffs already mounted"
98c5815ac7SDaniel T. Lee	else
99c5815ac7SDaniel T. Lee		echo "bpffs not mounted. Mounting..."
100c5815ac7SDaniel T. Lee		mount -t bpf none $BPFFS
101c5815ac7SDaniel T. Lee	fi
102c5815ac7SDaniel T. Lee}
103c5815ac7SDaniel T. Lee
1044ffd44cfSbrakmofunction start_hbm () {
1054ffd44cfSbrakmo  rm -f hbm.out
1064ffd44cfSbrakmo  echo "./hbm $dir -n $id -r $rate -t $dur $flags $dbg $prog" > hbm.out
1074ffd44cfSbrakmo  echo " " >> hbm.out
1084ffd44cfSbrakmo  ./hbm $dir -n $id -r $rate -t $dur $flags $dbg $prog >> hbm.out 2>&1  &
1094ffd44cfSbrakmo  echo $!
1104ffd44cfSbrakmo}
1114ffd44cfSbrakmo
1124ffd44cfSbrakmoprocessArgs () {
1134ffd44cfSbrakmo  for i in $args ; do
1144ffd44cfSbrakmo    case $i in
1154ffd44cfSbrakmo    # Support for upcomming ingress rate limiting
1164ffd44cfSbrakmo    #in)         # support for upcoming ingress rate limiting
1174ffd44cfSbrakmo    #  dir="-i"
1184ffd44cfSbrakmo    #  dir_name="in"
1194ffd44cfSbrakmo    #  ;;
1204ffd44cfSbrakmo    out)
1214ffd44cfSbrakmo      dir="-o"
1224ffd44cfSbrakmo      dir_name="out"
1234ffd44cfSbrakmo      ;;
1244ffd44cfSbrakmo    -b=*|--bpf=*)
1254ffd44cfSbrakmo      prog="${i#*=}"
1264ffd44cfSbrakmo      ;;
1274ffd44cfSbrakmo    -c=*|--cc=*)
1284ffd44cfSbrakmo      cc="${i#*=}"
1294ffd44cfSbrakmo      ;;
130ffd81558Sbrakmo    --no_cn)
131ffd81558Sbrakmo      flags="$flags --no_cn"
132ffd81558Sbrakmo      ;;
1334ffd44cfSbrakmo    --debug)
1344ffd44cfSbrakmo      flags="$flags -d"
1354ffd44cfSbrakmo      debug_flag=1
1364ffd44cfSbrakmo      ;;
1374ffd44cfSbrakmo    -d=*|--delay=*)
1384ffd44cfSbrakmo      netem="${i#*=}"
1394ffd44cfSbrakmo      ;;
1404ffd44cfSbrakmo    -D)
1414ffd44cfSbrakmo      details=1
1424ffd44cfSbrakmo      ;;
1434ffd44cfSbrakmo    -E)
1444ffd44cfSbrakmo      ecn=1
1454ffd44cfSbrakmo      ;;
14671634d7fSbrakmo    --edt)
14771634d7fSbrakmo      flags="$flags --edt"
14871634d7fSbrakmo      qdisc="fq"
14971634d7fSbrakmo     ;;
1504ffd44cfSbrakmo    -f=*|--flows=*)
1514ffd44cfSbrakmo      flows="${i#*=}"
1524ffd44cfSbrakmo      ;;
1534ffd44cfSbrakmo    -i=*|--id=*)
1544ffd44cfSbrakmo      id="${i#*=}"
1554ffd44cfSbrakmo      ;;
1564ffd44cfSbrakmo    -l)
1574ffd44cfSbrakmo      flags="$flags -l"
1584ffd44cfSbrakmo      ;;
1594ffd44cfSbrakmo    -N)
1604ffd44cfSbrakmo      use_netperf=1
1614ffd44cfSbrakmo      ;;
1624ffd44cfSbrakmo    -p=*|--port=*)
1634ffd44cfSbrakmo      port="${i#*=}"
1644ffd44cfSbrakmo      ;;
1654ffd44cfSbrakmo    -P)
1664ffd44cfSbrakmo      multi_iperf=1
1674ffd44cfSbrakmo      ;;
1684ffd44cfSbrakmo    -q=*)
1694ffd44cfSbrakmo      qdisc="${i#*=}"
1704ffd44cfSbrakmo      ;;
1714ffd44cfSbrakmo    -r=*|--rate=*)
1724ffd44cfSbrakmo      rate="${i#*=}"
1734ffd44cfSbrakmo      ;;
1744ffd44cfSbrakmo    -R)
1754ffd44cfSbrakmo      rr=1
1764ffd44cfSbrakmo      ;;
1774ffd44cfSbrakmo    -s=*|--server=*)
1784ffd44cfSbrakmo      server="${i#*=}"
1794ffd44cfSbrakmo      ;;
1804ffd44cfSbrakmo    -S|--stats)
1814ffd44cfSbrakmo      flags="$flags -s"
1824ffd44cfSbrakmo      do_stats=1
1834ffd44cfSbrakmo      ;;
1844ffd44cfSbrakmo    -t=*|--time=*)
1854ffd44cfSbrakmo      dur="${i#*=}"
1864ffd44cfSbrakmo      ;;
1874ffd44cfSbrakmo    -w)
1884ffd44cfSbrakmo      flags="$flags -w"
1894ffd44cfSbrakmo      ;;
1904ffd44cfSbrakmo    cubic)
1914ffd44cfSbrakmo      cc=cubic
1924ffd44cfSbrakmo      ;;
1934ffd44cfSbrakmo    dctcp)
1944ffd44cfSbrakmo      cc=dctcp
1954ffd44cfSbrakmo      ;;
1964ffd44cfSbrakmo    *)
1974ffd44cfSbrakmo      echo "Unknown arg:$i"
1984ffd44cfSbrakmo      Usage
1994ffd44cfSbrakmo      ;;
2004ffd44cfSbrakmo    esac
2014ffd44cfSbrakmo  done
2024ffd44cfSbrakmo}
2034ffd44cfSbrakmo
2044ffd44cfSbrakmoprocessArgs
205c5815ac7SDaniel T. Leeconfig_bpffs
2064ffd44cfSbrakmo
2074ffd44cfSbrakmoif [ $debug_flag -eq 1 ] ; then
2084ffd44cfSbrakmo  rm -f hbm_out.log
2094ffd44cfSbrakmofi
2104ffd44cfSbrakmo
2114ffd44cfSbrakmohbm_pid=$(start_hbm)
2124ffd44cfSbrakmousleep 100000
2134ffd44cfSbrakmo
2144ffd44cfSbrakmohost=`hostname`
215c5815ac7SDaniel T. Leecg_base_dir=/sys/fs/cgroup/unified
2164ffd44cfSbrakmocg_dir="$cg_base_dir/cgroup-test-work-dir/hbm$id"
2174ffd44cfSbrakmo
2184ffd44cfSbrakmoecho $$ >> $cg_dir/cgroup.procs
2194ffd44cfSbrakmo
2204ffd44cfSbrakmoulimit -l unlimited
2214ffd44cfSbrakmo
2224ffd44cfSbrakmorm -f ss.out
2234ffd44cfSbrakmorm -f hbm.[0-9]*.$dir_name
2244ffd44cfSbrakmoif [ $ecn -ne 0 ] ; then
2254ffd44cfSbrakmo  sysctl -w -q -n net.ipv4.tcp_ecn=1
2264ffd44cfSbrakmofi
2274ffd44cfSbrakmo
2284ffd44cfSbrakmoif [ $use_netperf -eq 0 ] ; then
2294ffd44cfSbrakmo  cur_cc=`sysctl -n net.ipv4.tcp_congestion_control`
2304ffd44cfSbrakmo  if [ "$cc" != "x" ] ; then
2314ffd44cfSbrakmo    sysctl -w -q -n net.ipv4.tcp_congestion_control=$cc
2324ffd44cfSbrakmo  fi
2334ffd44cfSbrakmofi
2344ffd44cfSbrakmo
2354ffd44cfSbrakmoif [ "$netem" -ne "0" ] ; then
2364ffd44cfSbrakmo  if [ "$qdisc" != "" ] ; then
2374ffd44cfSbrakmo    echo "WARNING: Ignoring -q options because -d option used"
2384ffd44cfSbrakmo  fi
2394ffd44cfSbrakmo  tc qdisc del dev lo root > /dev/null 2>&1
2404ffd44cfSbrakmo  tc qdisc add dev lo root netem delay $netem\ms > /dev/null 2>&1
2414ffd44cfSbrakmoelif [ "$qdisc" != "" ] ; then
24271634d7fSbrakmo  tc qdisc del dev eth0 root > /dev/null 2>&1
24371634d7fSbrakmo  tc qdisc add dev eth0 root $qdisc > /dev/null 2>&1
2444ffd44cfSbrakmofi
2454ffd44cfSbrakmo
2464ffd44cfSbrakmon=0
2474ffd44cfSbrakmom=$[$dur * 5]
2484ffd44cfSbrakmohn="::1"
2494ffd44cfSbrakmoif [ $use_netperf -ne 0 ] ; then
2504ffd44cfSbrakmo  if [ "$server" != "" ] ; then
2514ffd44cfSbrakmo    hn=$server
2524ffd44cfSbrakmo  fi
2534ffd44cfSbrakmofi
2544ffd44cfSbrakmo
2554ffd44cfSbrakmo( ping6 -i 0.2 -c $m $hn > ping.out 2>&1 ) &
2564ffd44cfSbrakmo
2574ffd44cfSbrakmoif [ $use_netperf -ne 0 ] ; then
2584ffd44cfSbrakmo  begNetserverPid=`ps ax | grep netserver | grep --invert-match "grep" | \
2594ffd44cfSbrakmo                   awk '{ print $1 }'`
2604ffd44cfSbrakmo  if [ "$begNetserverPid" == "" ] ; then
2614ffd44cfSbrakmo    if [ "$server" == "" ] ; then
2624ffd44cfSbrakmo      ( ./netserver > /dev/null 2>&1) &
2634ffd44cfSbrakmo      usleep 100000
2644ffd44cfSbrakmo    fi
2654ffd44cfSbrakmo  fi
2664ffd44cfSbrakmo  flow_cnt=1
2674ffd44cfSbrakmo  if [ "$server" == "" ] ; then
2684ffd44cfSbrakmo    np_server=$host
2694ffd44cfSbrakmo  else
2704ffd44cfSbrakmo    np_server=$server
2714ffd44cfSbrakmo  fi
2724ffd44cfSbrakmo  if [ "$cc" == "x" ] ; then
2734ffd44cfSbrakmo    np_cc=""
2744ffd44cfSbrakmo  else
2754ffd44cfSbrakmo    np_cc="-K $cc,$cc"
2764ffd44cfSbrakmo  fi
2774ffd44cfSbrakmo  replySize=1
2784ffd44cfSbrakmo  while [ $flow_cnt -le $flows ] ; do
2794ffd44cfSbrakmo    if [ $rr -ne 0 ] ; then
2804ffd44cfSbrakmo      reqSize=1M
2814ffd44cfSbrakmo      if [ $flow_cnt -eq 1 ] ; then
2824ffd44cfSbrakmo        reqSize=10K
2834ffd44cfSbrakmo      fi
2844ffd44cfSbrakmo      if [ "$dir" == "-i" ] ; then
2854ffd44cfSbrakmo        replySize=$reqSize
2864ffd44cfSbrakmo        reqSize=1
2874ffd44cfSbrakmo      fi
2884ffd44cfSbrakmo      ( ./netperf -H $np_server -l $dur -f m -j -t TCP_RR  -- -r $reqSize,$replySize $np_cc -k P50_lATENCY,P90_LATENCY,LOCAL_TRANSPORT_RETRANS,REMOTE_TRANSPORT_RETRANS,LOCAL_SEND_THROUGHPUT,LOCAL_RECV_THROUGHPUT,REQUEST_SIZE,RESPONSE_SIZE > netperf.$id.$flow_cnt ) &
2894ffd44cfSbrakmo    else
2904ffd44cfSbrakmo      if [ "$dir" == "-i" ] ; then
2914ffd44cfSbrakmo        ( ./netperf -H $np_server -l $dur -f m -j -t TCP_RR -- -r 1,10M $np_cc -k P50_LATENCY,P90_LATENCY,LOCAL_TRANSPORT_RETRANS,LOCAL_SEND_THROUGHPUT,REMOTE_TRANSPORT_RETRANS,REMOTE_SEND_THROUGHPUT,REQUEST_SIZE,RESPONSE_SIZE > netperf.$id.$flow_cnt ) &
2924ffd44cfSbrakmo      else
2934ffd44cfSbrakmo        ( ./netperf -H $np_server -l $dur -f m -j -t TCP_STREAM -- $np_cc -k P50_lATENCY,P90_LATENCY,LOCAL_TRANSPORT_RETRANS,LOCAL_SEND_THROUGHPUT,REQUEST_SIZE,RESPONSE_SIZE > netperf.$id.$flow_cnt ) &
2944ffd44cfSbrakmo      fi
2954ffd44cfSbrakmo    fi
2964ffd44cfSbrakmo    flow_cnt=$[flow_cnt+1]
2974ffd44cfSbrakmo  done
2984ffd44cfSbrakmo
2994ffd44cfSbrakmo# sleep for duration of test (plus some buffer)
3004ffd44cfSbrakmo  n=$[dur+2]
3014ffd44cfSbrakmo  sleep $n
3024ffd44cfSbrakmo
3034ffd44cfSbrakmo# force graceful termination of netperf
3044ffd44cfSbrakmo  pids=`pgrep netperf`
3054ffd44cfSbrakmo  for p in $pids ; do
3064ffd44cfSbrakmo    kill -SIGALRM $p
3074ffd44cfSbrakmo  done
3084ffd44cfSbrakmo
3094ffd44cfSbrakmo  flow_cnt=1
3104ffd44cfSbrakmo  rate=0
3114ffd44cfSbrakmo  if [ $details -ne 0 ] ; then
3124ffd44cfSbrakmo    echo ""
3134ffd44cfSbrakmo    echo "Details for HBM in cgroup $id"
3144ffd44cfSbrakmo    if [ $do_stats -eq 1 ] ; then
3154ffd44cfSbrakmo      if [ -e hbm.$id.$dir_name ] ; then
3164ffd44cfSbrakmo        cat hbm.$id.$dir_name
3174ffd44cfSbrakmo      fi
3184ffd44cfSbrakmo    fi
3194ffd44cfSbrakmo  fi
3204ffd44cfSbrakmo  while [ $flow_cnt -le $flows ] ; do
3214ffd44cfSbrakmo    if [ "$dir" == "-i" ] ; then
3224ffd44cfSbrakmo      r=`cat netperf.$id.$flow_cnt | grep -o "REMOTE_SEND_THROUGHPUT=[0-9]*" | grep -o "[0-9]*"`
3234ffd44cfSbrakmo    else
3244ffd44cfSbrakmo      r=`cat netperf.$id.$flow_cnt | grep -o "LOCAL_SEND_THROUGHPUT=[0-9]*" | grep -o "[0-9]*"`
3254ffd44cfSbrakmo    fi
3264ffd44cfSbrakmo    echo "rate for flow $flow_cnt: $r"
3274ffd44cfSbrakmo    rate=$[rate+r]
3284ffd44cfSbrakmo    if [ $details -ne 0 ] ; then
3294ffd44cfSbrakmo      echo "-----"
3304ffd44cfSbrakmo      echo "Details for cgroup $id, flow $flow_cnt"
3314ffd44cfSbrakmo      cat netperf.$id.$flow_cnt
3324ffd44cfSbrakmo    fi
3334ffd44cfSbrakmo    flow_cnt=$[flow_cnt+1]
3344ffd44cfSbrakmo  done
3354ffd44cfSbrakmo  if [ $details -ne 0 ] ; then
3364ffd44cfSbrakmo    echo ""
3374ffd44cfSbrakmo    delay=`grep "avg" ping.out | grep -o "= [0-9.]*/[0-9.]*" | grep -o "[0-9.]*$"`
3384ffd44cfSbrakmo    echo "PING AVG DELAY:$delay"
3394ffd44cfSbrakmo    echo "AGGREGATE_GOODPUT:$rate"
3404ffd44cfSbrakmo  else
3414ffd44cfSbrakmo    echo $rate
3424ffd44cfSbrakmo  fi
3434ffd44cfSbrakmoelif [ $multi_iperf -eq 0 ] ; then
3444ffd44cfSbrakmo  (iperf3 -s -p $port -1 > /dev/null 2>&1) &
3454ffd44cfSbrakmo  usleep 100000
3464ffd44cfSbrakmo  iperf3 -c $host -p $port -i 0 -P $flows -f m -t $dur > iperf.$id
3474ffd44cfSbrakmo  rates=`grep receiver iperf.$id | grep -o "[0-9.]* Mbits" | grep -o "^[0-9]*"`
3484ffd44cfSbrakmo  rate=`echo $rates | grep -o "[0-9]*$"`
3494ffd44cfSbrakmo
3504ffd44cfSbrakmo  if [ $details -ne 0 ] ; then
3514ffd44cfSbrakmo    echo ""
3524ffd44cfSbrakmo    echo "Details for HBM in cgroup $id"
3534ffd44cfSbrakmo    if [ $do_stats -eq 1 ] ; then
3544ffd44cfSbrakmo      if [ -e hbm.$id.$dir_name ] ; then
3554ffd44cfSbrakmo        cat hbm.$id.$dir_name
3564ffd44cfSbrakmo      fi
3574ffd44cfSbrakmo    fi
3584ffd44cfSbrakmo    delay=`grep "avg" ping.out | grep -o "= [0-9.]*/[0-9.]*" | grep -o "[0-9.]*$"`
3594ffd44cfSbrakmo    echo "PING AVG DELAY:$delay"
3604ffd44cfSbrakmo    echo "AGGREGATE_GOODPUT:$rate"
3614ffd44cfSbrakmo  else
3624ffd44cfSbrakmo    echo $rate
3634ffd44cfSbrakmo  fi
3644ffd44cfSbrakmoelse
3654ffd44cfSbrakmo  flow_cnt=1
3664ffd44cfSbrakmo  while [ $flow_cnt -le $flows ] ; do
3674ffd44cfSbrakmo    (iperf3 -s -p $port -1 > /dev/null 2>&1) &
3684ffd44cfSbrakmo    ( iperf3 -c $host -p $port -i 0 -P 1 -f m -t $dur | grep receiver | grep -o "[0-9.]* Mbits" | grep -o "^[0-9]*" | grep -o "[0-9]*$" > iperf3.$id.$flow_cnt ) &
3694ffd44cfSbrakmo    port=$[port+1]
3704ffd44cfSbrakmo    flow_cnt=$[flow_cnt+1]
3714ffd44cfSbrakmo  done
3724ffd44cfSbrakmo  n=$[dur+1]
3734ffd44cfSbrakmo  sleep $n
3744ffd44cfSbrakmo  flow_cnt=1
3754ffd44cfSbrakmo  rate=0
3764ffd44cfSbrakmo  if [ $details -ne 0 ] ; then
3774ffd44cfSbrakmo    echo ""
3784ffd44cfSbrakmo    echo "Details for HBM in cgroup $id"
3794ffd44cfSbrakmo    if [ $do_stats -eq 1 ] ; then
3804ffd44cfSbrakmo      if [ -e hbm.$id.$dir_name ] ; then
3814ffd44cfSbrakmo        cat hbm.$id.$dir_name
3824ffd44cfSbrakmo      fi
3834ffd44cfSbrakmo    fi
3844ffd44cfSbrakmo  fi
3854ffd44cfSbrakmo
3864ffd44cfSbrakmo  while [ $flow_cnt -le $flows ] ; do
3874ffd44cfSbrakmo    r=`cat iperf3.$id.$flow_cnt`
3884ffd44cfSbrakmo#    echo "rate for flow $flow_cnt: $r"
3894ffd44cfSbrakmo  if [ $details -ne 0 ] ; then
3904ffd44cfSbrakmo    echo "Rate for cgroup $id, flow $flow_cnt LOCAL_SEND_THROUGHPUT=$r"
3914ffd44cfSbrakmo  fi
3924ffd44cfSbrakmo    rate=$[rate+r]
3934ffd44cfSbrakmo    flow_cnt=$[flow_cnt+1]
3944ffd44cfSbrakmo  done
3954ffd44cfSbrakmo  if [ $details -ne 0 ] ; then
3964ffd44cfSbrakmo    delay=`grep "avg" ping.out | grep -o "= [0-9.]*/[0-9.]*" | grep -o "[0-9.]*$"`
3974ffd44cfSbrakmo    echo "PING AVG DELAY:$delay"
3984ffd44cfSbrakmo    echo "AGGREGATE_GOODPUT:$rate"
3994ffd44cfSbrakmo  else
4004ffd44cfSbrakmo    echo $rate
4014ffd44cfSbrakmo  fi
4024ffd44cfSbrakmofi
4034ffd44cfSbrakmo
4044ffd44cfSbrakmoif [ $use_netperf -eq 0 ] ; then
4054ffd44cfSbrakmo  sysctl -w -q -n net.ipv4.tcp_congestion_control=$cur_cc
4064ffd44cfSbrakmofi
4074ffd44cfSbrakmoif [ $ecn -ne 0 ] ; then
4084ffd44cfSbrakmo  sysctl -w -q -n net.ipv4.tcp_ecn=0
4094ffd44cfSbrakmofi
4104ffd44cfSbrakmoif [ "$netem" -ne "0" ] ; then
4114ffd44cfSbrakmo  tc qdisc del dev lo root > /dev/null 2>&1
4124ffd44cfSbrakmofi
41371634d7fSbrakmoif [ "$qdisc" != "" ] ; then
41471634d7fSbrakmo  tc qdisc del dev eth0 root > /dev/null 2>&1
41571634d7fSbrakmofi
4164ffd44cfSbrakmosleep 2
4174ffd44cfSbrakmo
4184ffd44cfSbrakmohbmPid=`ps ax | grep "hbm " | grep --invert-match "grep" | awk '{ print $1 }'`
4194ffd44cfSbrakmoif [ "$hbmPid" == "$hbm_pid" ] ; then
4204ffd44cfSbrakmo  kill $hbm_pid
4214ffd44cfSbrakmofi
4224ffd44cfSbrakmo
4234ffd44cfSbrakmosleep 1
4244ffd44cfSbrakmo
425c5815ac7SDaniel T. Lee# Detach any pinned BPF programs that may have lingered
426c5815ac7SDaniel T. Leerm -rf $BPFFS/hbm*
4274ffd44cfSbrakmo
4284ffd44cfSbrakmoif [ $use_netperf -ne 0 ] ; then
4294ffd44cfSbrakmo  if [ "$server" == "" ] ; then
4304ffd44cfSbrakmo    if [ "$begNetserverPid" == "" ] ; then
4314ffd44cfSbrakmo      netserverPid=`ps ax | grep netserver | grep --invert-match "grep" | awk '{ print $1 }'`
4324ffd44cfSbrakmo      if [ "$netserverPid" != "" ] ; then
4334ffd44cfSbrakmo        kill $netserverPid
4344ffd44cfSbrakmo      fi
4354ffd44cfSbrakmo    fi
4364ffd44cfSbrakmo  fi
4374ffd44cfSbrakmofi
4384ffd44cfSbrakmoexit
439