^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) #!/bin/bash
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) # SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) # Copyright (c) 2019 Facebook
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) # This program is free software; you can redistribute it and/or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) # modify it under the terms of version 2 of the GNU General Public
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) # License as published by the Free Software Foundation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) Usage() {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) echo "Script for testing HBM (Host Bandwidth Manager) framework."
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) echo "It creates a cgroup to use for testing and load a BPF program to limit"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) echo "egress or ingress bandwidht. It then uses iperf3 or netperf to create"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) echo "loads. The output is the goodput in Mbps (unless -D was used)."
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) echo ""
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) echo "USAGE: $name [out] [-b=<prog>|--bpf=<prog>] [-c=<cc>|--cc=<cc>]"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) echo " [-D] [-d=<delay>|--delay=<delay>] [--debug] [-E] [--edt]"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) echo " [-f=<#flows>|--flows=<#flows>] [-h] [-i=<id>|--id=<id >]"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) echo " [-l] [-N] [--no_cn] [-p=<port>|--port=<port>] [-P]"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) echo " [-q=<qdisc>] [-R] [-s=<server>|--server=<server]"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) echo " [-S|--stats] -t=<time>|--time=<time>] [-w] [cubic|dctcp]"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) echo " Where:"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) echo " out egress (default)"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) echo " -b or --bpf BPF program filename to load and attach."
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) echo " Default is hbm_out_kern.o for egress,"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) echo " -c or -cc TCP congestion control (cubic or dctcp)"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) echo " --debug print BPF trace buffer"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) echo " -d or --delay add a delay in ms using netem"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) echo " -D In addition to the goodput in Mbps, it also outputs"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) echo " other detailed information. This information is"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) echo " test dependent (i.e. iperf3 or netperf)."
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) echo " -E enable ECN (not required for dctcp)"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) echo " --edt use fq's Earliest Departure Time (requires fq)"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) echo " -f or --flows number of concurrent flows (default=1)"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) echo " -i or --id cgroup id (an integer, default is 1)"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) echo " -N use netperf instead of iperf3"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) echo " --no_cn Do not return CN notifications"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) echo " -l do not limit flows using loopback"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) echo " -h Help"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) echo " -p or --port iperf3 port (default is 5201)"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) echo " -P use an iperf3 instance for each flow"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) echo " -q use the specified qdisc"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) echo " -r or --rate rate in Mbps (default 1s 1Gbps)"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) echo " -R Use TCP_RR for netperf. 1st flow has req"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) echo " size of 10KB, rest of 1MB. Reply in all"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) echo " cases is 1 byte."
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) echo " More detailed output for each flow can be found"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) echo " in the files netperf.<cg>.<flow>, where <cg> is the"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) echo " cgroup id as specified with the -i flag, and <flow>"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) echo " is the flow id starting at 1 and increasing by 1 for"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) echo " flow (as specified by -f)."
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) echo " -s or --server hostname of netperf server. Used to create netperf"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) echo " test traffic between to hosts (default is within host)"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) echo " netserver must be running on the host."
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) echo " -S or --stats whether to update hbm stats (default is yes)."
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) echo " -t or --time duration of iperf3 in seconds (default=5)"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) echo " -w Work conserving flag. cgroup can increase its"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) echo " bandwidth beyond the rate limit specified"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) echo " while there is available bandwidth. Current"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) echo " implementation assumes there is only one NIC"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) echo " (eth0), but can be extended to support multiple"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) echo " NICs."
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) echo " cubic or dctcp specify which TCP CC to use"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) echo " "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) exit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #set -x
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) debug_flag=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) args="$@"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) name="$0"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) netem=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) cc=x
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) dir="-o"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) dir_name="out"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) dur=5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) flows=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) id=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) prog=""
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) port=5201
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) rate=1000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) multi_iperf=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) flow_cnt=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) use_netperf=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) rr=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) ecn=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) details=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) server=""
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) qdisc=""
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) flags=""
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) do_stats=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) function start_hbm () {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) rm -f hbm.out
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) echo "./hbm $dir -n $id -r $rate -t $dur $flags $dbg $prog" > hbm.out
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) echo " " >> hbm.out
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) ./hbm $dir -n $id -r $rate -t $dur $flags $dbg $prog >> hbm.out 2>&1 &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) echo $!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) processArgs () {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) for i in $args ; do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) case $i in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) # Support for upcomming ingress rate limiting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #in) # support for upcoming ingress rate limiting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) # dir="-i"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) # dir_name="in"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) # ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) out)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) dir="-o"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) dir_name="out"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) -b=*|--bpf=*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) prog="${i#*=}"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) -c=*|--cc=*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) cc="${i#*=}"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) --no_cn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) flags="$flags --no_cn"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) --debug)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) flags="$flags -d"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) debug_flag=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) -d=*|--delay=*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) netem="${i#*=}"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) -D)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) details=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) -E)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) ecn=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) --edt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) flags="$flags --edt"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) qdisc="fq"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) -f=*|--flows=*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) flows="${i#*=}"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) -i=*|--id=*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) id="${i#*=}"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) -l)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) flags="$flags -l"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) -N)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) use_netperf=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) -p=*|--port=*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) port="${i#*=}"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) -P)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) multi_iperf=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) -q=*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) qdisc="${i#*=}"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) -r=*|--rate=*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) rate="${i#*=}"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) -R)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) rr=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) -s=*|--server=*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) server="${i#*=}"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) -S|--stats)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) flags="$flags -s"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) do_stats=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) -t=*|--time=*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) dur="${i#*=}"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) -w)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) flags="$flags -w"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) cubic)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) cc=cubic
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) dctcp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) cc=dctcp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) echo "Unknown arg:$i"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) Usage
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) esac
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) processArgs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) if [ $debug_flag -eq 1 ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) rm -f hbm_out.log
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) hbm_pid=$(start_hbm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) usleep 100000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) host=`hostname`
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) cg_base_dir=/sys/fs/cgroup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) cg_dir="$cg_base_dir/cgroup-test-work-dir/hbm$id"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) echo $$ >> $cg_dir/cgroup.procs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) ulimit -l unlimited
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) rm -f ss.out
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) rm -f hbm.[0-9]*.$dir_name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) if [ $ecn -ne 0 ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) sysctl -w -q -n net.ipv4.tcp_ecn=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) if [ $use_netperf -eq 0 ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) cur_cc=`sysctl -n net.ipv4.tcp_congestion_control`
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) if [ "$cc" != "x" ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) sysctl -w -q -n net.ipv4.tcp_congestion_control=$cc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) if [ "$netem" -ne "0" ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) if [ "$qdisc" != "" ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) echo "WARNING: Ignoring -q options because -d option used"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) tc qdisc del dev lo root > /dev/null 2>&1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) tc qdisc add dev lo root netem delay $netem\ms > /dev/null 2>&1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) elif [ "$qdisc" != "" ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) tc qdisc del dev eth0 root > /dev/null 2>&1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) tc qdisc add dev eth0 root $qdisc > /dev/null 2>&1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) n=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) m=$[$dur * 5]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) hn="::1"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) if [ $use_netperf -ne 0 ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) if [ "$server" != "" ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) hn=$server
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) ( ping6 -i 0.2 -c $m $hn > ping.out 2>&1 ) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) if [ $use_netperf -ne 0 ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) begNetserverPid=`ps ax | grep netserver | grep --invert-match "grep" | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) awk '{ print $1 }'`
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) if [ "$begNetserverPid" == "" ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) if [ "$server" == "" ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) ( ./netserver > /dev/null 2>&1) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) usleep 100000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) flow_cnt=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) if [ "$server" == "" ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) np_server=$host
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) np_server=$server
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) if [ "$cc" == "x" ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) np_cc=""
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) np_cc="-K $cc,$cc"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) replySize=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) while [ $flow_cnt -le $flows ] ; do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) if [ $rr -ne 0 ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) reqSize=1M
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) if [ $flow_cnt -eq 1 ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) reqSize=10K
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) if [ "$dir" == "-i" ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) replySize=$reqSize
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) reqSize=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) ( ./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 ) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) if [ "$dir" == "-i" ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) ( ./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 ) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) ( ./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 ) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) flow_cnt=$[flow_cnt+1]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) # sleep for duration of test (plus some buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) n=$[dur+2]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) sleep $n
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) # force graceful termination of netperf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) pids=`pgrep netperf`
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) for p in $pids ; do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) kill -SIGALRM $p
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) flow_cnt=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) rate=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) if [ $details -ne 0 ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) echo ""
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) echo "Details for HBM in cgroup $id"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) if [ $do_stats -eq 1 ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) if [ -e hbm.$id.$dir_name ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) cat hbm.$id.$dir_name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) while [ $flow_cnt -le $flows ] ; do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) if [ "$dir" == "-i" ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) r=`cat netperf.$id.$flow_cnt | grep -o "REMOTE_SEND_THROUGHPUT=[0-9]*" | grep -o "[0-9]*"`
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) r=`cat netperf.$id.$flow_cnt | grep -o "LOCAL_SEND_THROUGHPUT=[0-9]*" | grep -o "[0-9]*"`
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) echo "rate for flow $flow_cnt: $r"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) rate=$[rate+r]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) if [ $details -ne 0 ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) echo "-----"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) echo "Details for cgroup $id, flow $flow_cnt"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) cat netperf.$id.$flow_cnt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) flow_cnt=$[flow_cnt+1]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) if [ $details -ne 0 ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) echo ""
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) delay=`grep "avg" ping.out | grep -o "= [0-9.]*/[0-9.]*" | grep -o "[0-9.]*$"`
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) echo "PING AVG DELAY:$delay"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) echo "AGGREGATE_GOODPUT:$rate"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) echo $rate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) elif [ $multi_iperf -eq 0 ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) (iperf3 -s -p $port -1 > /dev/null 2>&1) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) usleep 100000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) iperf3 -c $host -p $port -i 0 -P $flows -f m -t $dur > iperf.$id
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) rates=`grep receiver iperf.$id | grep -o "[0-9.]* Mbits" | grep -o "^[0-9]*"`
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) rate=`echo $rates | grep -o "[0-9]*$"`
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) if [ $details -ne 0 ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) echo ""
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) echo "Details for HBM in cgroup $id"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) if [ $do_stats -eq 1 ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) if [ -e hbm.$id.$dir_name ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) cat hbm.$id.$dir_name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) delay=`grep "avg" ping.out | grep -o "= [0-9.]*/[0-9.]*" | grep -o "[0-9.]*$"`
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) echo "PING AVG DELAY:$delay"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) echo "AGGREGATE_GOODPUT:$rate"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) echo $rate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) flow_cnt=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) while [ $flow_cnt -le $flows ] ; do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) (iperf3 -s -p $port -1 > /dev/null 2>&1) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) ( 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 ) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) port=$[port+1]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) flow_cnt=$[flow_cnt+1]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) n=$[dur+1]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) sleep $n
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) flow_cnt=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) rate=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) if [ $details -ne 0 ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) echo ""
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) echo "Details for HBM in cgroup $id"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) if [ $do_stats -eq 1 ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) if [ -e hbm.$id.$dir_name ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) cat hbm.$id.$dir_name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) while [ $flow_cnt -le $flows ] ; do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) r=`cat iperf3.$id.$flow_cnt`
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) # echo "rate for flow $flow_cnt: $r"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) if [ $details -ne 0 ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) echo "Rate for cgroup $id, flow $flow_cnt LOCAL_SEND_THROUGHPUT=$r"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) rate=$[rate+r]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) flow_cnt=$[flow_cnt+1]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) if [ $details -ne 0 ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) delay=`grep "avg" ping.out | grep -o "= [0-9.]*/[0-9.]*" | grep -o "[0-9.]*$"`
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) echo "PING AVG DELAY:$delay"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) echo "AGGREGATE_GOODPUT:$rate"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) echo $rate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) if [ $use_netperf -eq 0 ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) sysctl -w -q -n net.ipv4.tcp_congestion_control=$cur_cc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) if [ $ecn -ne 0 ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) sysctl -w -q -n net.ipv4.tcp_ecn=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) if [ "$netem" -ne "0" ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) tc qdisc del dev lo root > /dev/null 2>&1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) if [ "$qdisc" != "" ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) tc qdisc del dev eth0 root > /dev/null 2>&1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) sleep 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) hbmPid=`ps ax | grep "hbm " | grep --invert-match "grep" | awk '{ print $1 }'`
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) if [ "$hbmPid" == "$hbm_pid" ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) kill $hbm_pid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) sleep 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) # Detach any BPF programs that may have lingered
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) ttx=`bpftool cgroup tree | grep hbm`
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) v=2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) for x in $ttx ; do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) if [ "${x:0:36}" == "/sys/fs/cgroup/cgroup-test-work-dir/" ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) cg=$x ; v=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) if [ $v -eq 0 ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) id=$x ; v=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) if [ $v -eq 1 ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) type=$x ; bpftool cgroup detach $cg $type id $id
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) v=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) if [ $use_netperf -ne 0 ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) if [ "$server" == "" ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) if [ "$begNetserverPid" == "" ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) netserverPid=`ps ax | grep netserver | grep --invert-match "grep" | awk '{ print $1 }'`
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) if [ "$netserverPid" != "" ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) kill $netserverPid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) exit