From 7673f1c7181785316d8d794d7818f47ac547debc Mon Sep 17 00:00:00 2001 From: sebastian Date: Mon, 12 May 2025 19:02:11 +0200 Subject: [PATCH] initial --- README.md | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++ gnuplot.png | Bin 0 -> 41873 bytes perfi.sh | 21 ++++++++++ 3 files changed, 134 insertions(+) create mode 100644 README.md create mode 100644 gnuplot.png create mode 100755 perfi.sh diff --git a/README.md b/README.md new file mode 100644 index 0000000..5894c26 --- /dev/null +++ b/README.md @@ -0,0 +1,113 @@ +# perfi.sh + +A script that uses gnuplot to plot `iperf3` output in realtime. + +## iperf3 + + +``` +iperf3 -i $PINTERVAL -R -t $PTIME -f k -c $PERFHOST + +``` + +`-i` is the interval in Seconds. Can be a float like `0.1` + +`-f` is the ouptut and allows + +- `-k` Kbit/s +- `-m` Mbit/s +- `-K` Kbyte/s +- `-M` MByte/s + + +There exists a [list of public iperf servers](https://iperf.fr/iperf-servers.php). + + + +## stdbuf + +´iperf3` seems to buffer its `stdout`. A tool named `stdbuf` helps achieving realtime output, so the data can be piped into the next tool. + +``` +stdbuf -o0 iperf3 -i $PINTERVAL -R -t $PTIME -f k -c $PERFHOST + +``` + +`-o` refers to the `STDOUT` (there is also `-i` for `STDIN` and `-e` for `STDERR`). `0` will turn buffering off. `L` would enable Line Buffering. + + + +## awk + +`awk` is used to only get the data rate (7th column) + +iperf3 example output: + +``` +iperf3 -c 192.168.2.70 -f k -t 2 +Connecting to host 192.168.2.70, port 5201 +[ 5] local 192.168.2.199 port 59798 connected to 192.168.2.70 port 5201 +[ ID] Interval Transfer Bitrate Retr Cwnd +[ 5] 0.00-1.00 sec 28.3 MBytes 237649 Kbits/sec 0 1.21 MBytes +[ 5] 1.00-2.00 sec 31.2 MBytes 261938 Kbits/sec 0 2.16 MBytes +- - - - - - - - - - - - - - - - - - - - - - - - - +[ ID] Interval Transfer Bitrate Retr +[ 5] 0.00-2.00 sec 59.6 MBytes 249797 Kbits/sec 0 sender +[ 5] 0.00-2.02 sec 57.2 MBytes 237330 Kbits/sec receiver + +iperf Done. + +``` + + +``` +awk '/sec/&&!/receiver/&&!/sender/ {print $7}' +``` + +The `/sec/` will filter all lines that show a data rate. To filter out the summary at the end, we add `&&!/receiver/&&!/sender/`. `&&` is logical `AND` and `!` negates the token. + + +So this would result in + +``` + iperf3 -c 192.168.2.70 -f k -t 2 | awk '/sec/&&!/receiver/&&!/sender/ {print $7}' +281725 +262140 + +``` + +## feedgnuplot + +`feedgnuplot` is a wrapper that makes it simpler to feed data to `gnuplot` in real time. + +``` +feedgnuplot --lines --stream --ylabel 'KBytes/sec' --xlabel 'seconds' +``` + +`--lines` tells (feed)gnuplot to connect datapoints by lines (which is easier to read then only points/dots + +`--stream` tells (feed)gnuplot to update its data as it comes in. Per default it will do this once per second. + +`--ylabel / --xlabel` will write a caption. It is not mandatory, but if you want to share the plot later it looks nicer. + + +## Full commandline + +(See [perfi.sh](perfi.sh) + +```bash +stdbuf -o0 iperf3 -i $PINTERVAL -R -t $PTIME -f k -c $PERFHOST | stdbuf -o0 awk '/sec/&&!/receiver/&&!/sender/ {print $7}' | stdbuf -o0 feedgnuplot --lines --stream $PINTERVAL --ylabel 'Kbit/s' --xlabel "$PINTERVAL seconds" + +``` + + +## Result + +![gnuplot.png](A screenshot of the gnuplot of an iperf3 test) + +## Room for improvement + +- Let user have a commandline switch for the unit (kbit/s vs. mbit/s etc.) +- Add checks for dependencies and commandline switches + + diff --git a/gnuplot.png b/gnuplot.png new file mode 100644 index 0000000000000000000000000000000000000000..27f3db86db15b6aaa973eba97deca4bd39171cee GIT binary patch literal 41873 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

;C` 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