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