betterspeedtest.sh - Add --idle parameter to measure latency without added traffic from the script

tunnelbroker.sh - Update documentation for OpenWrt use
This commit is contained in:
Rich Brown 2019-07-27 14:44:02 -04:00
parent 7e07b824ac
commit 9d206f7362
3 changed files with 96 additions and 49 deletions

View file

@ -127,9 +127,12 @@ and netperf-eu (Denmark)
* -t | --time: Duration for how long each direction's test should run - (default - 60 seconds) * -t | --time: Duration for how long each direction's test should run - (default - 60 seconds)
* -p | --ping: Host to ping to measure latency (default - gstatic.com) * -p | --ping: Host to ping to measure latency (default - gstatic.com)
* -n | --number: Number of simultaneous sessions (default - 5 sessions) * -n | --number: Number of simultaneous sessions (default - 5 sessions)
* -i | --idle: Don't send traffic, only measure idle latency
The output shows separate (one-way) download and upload speed, along with a summary of latencies, including min, max, average, median, and 10th and 90th percentiles so you can get a sense of the distribution. The tool also displays the percent packet loss. The example below shows two measurements, bad and good. The output shows separate (one-way) download and upload speed, along with a summary of latencies, including min, max, average, median, and 10th and 90th percentiles so you can get a sense of the distribution. The tool also displays the percent packet loss. The example below shows two measurements, bad and good.
The Idle test uses the same process to measure latency of the line, but without any additional traffic from this script. It runs for the specified --time.
On the left is a test run without SQM. Note that the latency gets huge (greater than 5 seconds), meaning that network performance would be terrible for anyone else using the network. On the left is a test run without SQM. Note that the latency gets huge (greater than 5 seconds), meaning that network performance would be terrible for anyone else using the network.
On the right is a test using SQM: the latency goes up a little (less than 23 msec under load), and network performance remains good. On the right is a test using SQM: the latency goes up a little (less than 23 msec under load), and network performance remains good.
@ -216,19 +219,29 @@ It's an easy way to become familiar with IPv6 if your ISP doesn't offer native I
There are several steps: There are several steps:
1. Go to the Hurricane Electric [TunnelBroker.net](http://www.tunnelbroker.net/) site to set up your free account. 1. Go to the Hurricane Electric [TunnelBroker.net](http://www.tunnelbroker.net/) site to set up your free account.
There are detailed instructions for setting up an account and an IPv6 tunnel There are detailed instructions for setting up an account and an IPv6 tunnel in the script itself, or at the
in the script itself, or at the [IPv6 Tunnel page](http://www.bufferbloat.net/projects/cerowrt/wiki/IPv6_Tunnel) of [bufferbloat.net](bufferbloat.net)
[IPv6 Tunnel page.](http://www.bufferbloat.net/projects/cerowrt/wiki/IPv6_Tunnel) 2. From the tunnelbroker main page, click "Create Regular Tunnel"
2. Edit the tunnelbroker.sh script to use the values supplied by Tunnelbroker.net. * Enter your IP address in "IPv4 Endpoint" (paste in the address you're "viewing from")
The values from the "Tunnel Details" page go into the matching lines of the script. * Select a nearby Tunnel Server
3. ssh into the router and execute this script with these steps. * Click "Create Tunnel"
3. On the resulting Tunnel Details page, click **Assign /48** to get a /48 prefix
4. From the Tunnel Details page, copy and paste the matching values into the `tunnel.sh` file.
The *User\_Name* is the name you used to create the account.
Find the *Update\_Key* on the Advanced Tab of the Tunnel Details page.
5. ssh into the router and execute this script with these steps.
ssh root@192.168.1.1 # use the address of your router ssh root@192.168.1.1 # use the address of your router
cd /tmp cd /tmp
cat > tunnel.sh cat > tunnel.sh
[paste in the contents of this file, then hit ^D] [paste in the contents of this file, then hit ^D]
[edit the script to match your tunnelbroker values]
sh tunnel.sh sh tunnel.sh
[Restart your router. This seems to make a difference.] [Restart your router. This seems to make a difference.]
Presto! Your tunnel is up! Your computer should get a global IPv6 address, and should be able to communicate directly with IPv6 devices on the Internet. To test it, try: `ping6 ivp6.google.com` Presto! Your tunnel is up!
Your computer should get a global IPv6 address, and should be able to communicate directly with IPv6 devices on the Internet.
To test it, try: `ping6 ivp6.google.com`

View file

@ -16,8 +16,9 @@
# -t | --time: Duration for how long each direction's test should run - (default - 60 seconds) # -t | --time: Duration for how long each direction's test should run - (default - 60 seconds)
# -p | --ping: Host to ping to measure latency (default - gstatic.com) # -p | --ping: Host to ping to measure latency (default - gstatic.com)
# -n | --number: Number of simultaneous sessions (default - 5 sessions) # -n | --number: Number of simultaneous sessions (default - 5 sessions)
# -i | --idle: Don't send traffic, only measure idle latency
# Copyright (c) 2014 - Rich Brown rich.brown@blueberryhillsoftware.com # Copyright (c) 2014-2019 - Rich Brown rich.brown@blueberryhillsoftware.com
# GPLv2 # GPLv2
# Summarize the contents of the ping's output file to show min, avg, median, max, etc. # Summarize the contents of the ping's output file to show min, avg, median, max, etc.
@ -30,6 +31,11 @@ summarize_pings() {
# awk builds an array of those values, and prints first & last (which are min, max) # awk builds an array of those values, and prints first & last (which are min, max)
# and computes average. # and computes average.
# If the number of samples is >= 10, also computes median, and 10th and 90th percentile readings # If the number of samples is >= 10, also computes median, and 10th and 90th percentile readings
# stop pinging and drawing dots
kill_pings
kill_dots
sed 's/^.*time=\([^ ]*\) ms/\1/' < $1 | grep -v "PING" | sort -n | \ sed 's/^.*time=\([^ ]*\) ms/\1/' < $1 | grep -v "PING" | sort -n | \
awk 'BEGIN {numdrops=0; numrows=0;} \ awk 'BEGIN {numdrops=0; numrows=0;} \
{ \ { \
@ -48,8 +54,12 @@ summarize_pings() {
if (numrows%2==1) med=arr[(numrows+1)/2]; else med=(arr[numrows/2]); \ if (numrows%2==1) med=arr[(numrows+1)/2]; else med=(arr[numrows/2]); \
}; \ }; \
pktloss = numdrops/(numdrops+numrows) * 100; \ pktloss = numdrops/(numdrops+numrows) * 100; \
printf(" Latency: (in msec, %d pings, %4.2f%% packet loss)\n Min: %4.3f \n 10pct: %4.3f \n Median: %4.3f \n Avg: %4.3f \n 90pct: %4.3f \n Max: %4.3f\n", numrows, pktloss, arr[1], pc10, med, sum/numrows, pc90, arr[numrows] )\ printf("\n Latency: (in msec, %d pings, %4.2f%% packet loss)\n Min: %4.3f \n 10pct: %4.3f \n Median: %4.3f \n Avg: %4.3f \n 90pct: %4.3f \n Max: %4.3f\n", numrows, pktloss, arr[1], pc10, med, sum/numrows, pc90, arr[numrows] )\
}' }'
# and finally remove the PINGFILE
rm $1
} }
# Print a line of dots as a progress indicator. # Print a line of dots as a progress indicator.
@ -83,21 +93,18 @@ kill_pings() {
# ping command catches (and handles) first Ctrl-C, so you have to hit it again... # ping command catches (and handles) first Ctrl-C, so you have to hit it again...
kill_pings_and_dots_and_exit() { kill_pings_and_dots_and_exit() {
kill_dots kill_dots
kill_pings
echo "\nStopped" echo "\nStopped"
exit 1 exit 1
} }
# ------------ Measure speed and ping latency for one direction ---------------- # ------------ start_pings() ----------------
# # Start printing dots, then start a ping process, saving the results to a PINGFILE
# Call measure_direction() with single parameter - "Download" or " Upload"
# The function gets other info from globals determined from command-line arguments
measure_direction() { start_pings() {
# Create temp files # Create temp file
PINGFILE=`mktemp /tmp/measurepings.XXXXXX` || exit 1 PINGFILE=`mktemp /tmp/measurepings.XXXXXX` || exit 1
SPEEDFILE=`mktemp /tmp/netperfUL.XXXXXX` || exit 1
DIRECTION=$1
# Start dots # Start dots
print_dots & print_dots &
@ -113,7 +120,23 @@ measure_direction() {
fi fi
ping_pid=$! ping_pid=$!
# echo "Ping PID: $ping_pid" # echo "Ping PID: $ping_pid"
}
# ------------ Measure speed and ping latency for one direction ----------------
#
# Call measure_direction() with single parameter - "Download" or " Upload"
# The function gets other info from globals determined from command-line arguments
measure_direction() {
# Create temp file
SPEEDFILE=`mktemp /tmp/netperfUL.XXXXXX` || exit 1
DIRECTION=$1
# start off the ping process
start_pings
# Start netperf with the proper direction # Start netperf with the proper direction
if [ $DIRECTION = "Download" ]; then if [ $DIRECTION = "Download" ]; then
dir="TCP_MAERTS" dir="TCP_MAERTS"
@ -141,26 +164,22 @@ measure_direction() {
# Print TCP Download speed # Print TCP Download speed
echo "" echo ""
echo " $1: " `awk '{s+=$1} END {print s}' $SPEEDFILE` Mbps awk -v dir="$1" '{s+=$1} END {printf " %s: %1.2f Mbps", dir, s}' < $SPEEDFILE
# When netperf completes, stop the dots and the pings # When netperf completes, summarize the ping data
kill_pings
kill_dots
# Summarize the ping data
summarize_pings $PINGFILE summarize_pings $PINGFILE
rm $PINGFILE
rm $SPEEDFILE rm $SPEEDFILE
} }
# ------- Start of the main routine -------- # ------- Start of the main routine --------
# Usage: sh betterspeedtest.sh [ -4 -6 ] [ -H netperf-server ] [ -t duration ] [ -p host-to-ping ] [ -n simultaneous-sessions ] # Usage: sh betterspeedtest.sh [ -4 -6 ] [ -H netperf-server ] [ -t duration ] [ -p host-to-ping ] [ -i ] [ -n simultaneous-sessions ]
# “H” and “host” DNS or IP address of the netperf server host (default: netperf.bufferbloat.net) # “H” and “host” DNS or IP address of the netperf server host (default: netperf.bufferbloat.net)
# “t” and “time” Time to run the test in each direction (default: 60 seconds) # “t” and “time” Time to run the test in each direction (default: 60 seconds)
# “p” and “ping” Host to ping for latency measurements (default: gstatic.com) # “p” and “ping” Host to ping for latency measurements (default: gstatic.com)
# "i" and "idle" Don't send up/down traffic - just measure idle link latency
# "n" and "number" Number of simultaneous upload or download sessions (default: 5 sessions; # "n" and "number" Number of simultaneous upload or download sessions (default: 5 sessions;
# 5 sessions chosen empirically because total didn't increase much after that number) # 5 sessions chosen empirically because total didn't increase much after that number)
@ -170,6 +189,7 @@ TESTDUR="60"
PINGHOST="gstatic.com" PINGHOST="gstatic.com"
MAXSESSIONS="5" MAXSESSIONS="5"
TESTPROTO="-4" TESTPROTO="-4"
IDLETEST=false
# read the options # read the options
@ -178,28 +198,30 @@ while [ $# -gt 0 ]
do do
case "$1" in case "$1" in
-4|-6) TESTPROTO=$1 ; shift 1 ;; -4|-6) TESTPROTO=$1 ; shift 1 ;;
-H|--host) -H|--host)
case "$2" in
"") echo "Missing hostname" ; exit 1 ;;
*) TESTHOST=$2 ; shift 2 ;;
esac ;;
-t|--time)
case "$2" in case "$2" in
"") echo "Missing duration" ; exit 1 ;; "") echo "Missing hostname" ; exit 1 ;;
*) TESTDUR=$2 ; shift 2 ;; *) TESTHOST=$2 ; shift 2 ;;
esac ;;
-p|--ping)
case "$2" in
"") echo "Missing ping host" ; exit 1 ;;
*) PINGHOST=$2 ; shift 2 ;;
esac ;;
-n|--number)
case "$2" in
"") echo "Missing number of simultaneous sessions" ; exit 1 ;;
*) MAXSESSIONS=$2 ; shift 2 ;;
esac ;; esac ;;
--) shift ; break ;; -t|--time)
*) echo "Usage: sh betterspeedtest.sh [-4 -6] [ -H netperf-server ] [ -t duration ] [ -p host-to-ping ] [ -n simultaneous-sessions ]" ; exit 1 ;; case "$2" in
"") echo "Missing duration" ; exit 1 ;;
*) TESTDUR=$2 ; shift 2 ;;
esac ;;
-p|--ping)
case "$2" in
"") echo "Missing ping host" ; exit 1 ;;
*) PINGHOST=$2 ; shift 2 ;;
esac ;;
-n|--number)
case "$2" in
"") echo "Missing number of simultaneous sessions" ; exit 1 ;;
*) MAXSESSIONS=$2 ; shift 2 ;;
esac ;;
-i|--idle)
IDLETEST=true ; shift 1 ;;
--) shift ; break ;;
*) echo "Usage: sh betterspeedtest.sh [-4 -6] [ -H netperf-server ] [ -t duration ] [ -p host-to-ping ] [ -n simultaneous-sessions ] [ --idle ]" ; exit 1 ;;
esac esac
done done
@ -212,11 +234,20 @@ else
PROTO="ipv6" PROTO="ipv6"
fi fi
DATE=`date "+%Y-%m-%d %H:%M:%S"` DATE=`date "+%Y-%m-%d %H:%M:%S"`
echo "$DATE Testing against $TESTHOST ($PROTO) with $MAXSESSIONS simultaneous sessions while pinging $PINGHOST ($TESTDUR seconds in each direction)"
# Catch a Ctl-C and stop the pinging and the print_dots # Catch a Ctl-C and stop the pinging and the print_dots
trap kill_pings_and_dots_and_exit HUP INT TERM trap kill_pings_and_dots_and_exit HUP INT TERM
measure_direction "Download" if $IDLETEST
measure_direction " Upload" then
echo "$DATE Testing idle line while pinging $PINGHOST ($TESTDUR seconds)"
start_pings
sleep $TESTDUR
summarize_pings $PINGFILE
else
echo "$DATE Testing against $TESTHOST ($PROTO) with $MAXSESSIONS simultaneous sessions while pinging $PINGHOST ($TESTDUR seconds in each direction)"
measure_direction "Download"
measure_direction " Upload"
fi

View file

@ -27,6 +27,7 @@ Update_Key=AbCDeF54321vWxYz
# cd /tmp # cd /tmp
# cat > tunnel.sh # cat > tunnel.sh
# [paste in the contents of this file, then hit ^D] # [paste in the contents of this file, then hit ^D]
# [edit the script to match your tunnelbroker values (see #4 above)]
# sh tunnel.sh # sh tunnel.sh
# [Restart your router. This seems to make a difference.] # [Restart your router. This seems to make a difference.]
# #
@ -90,4 +91,6 @@ echo 'Done. You could also restart the router now to ensure these take effect.'
# --- end of script --- # --- end of script ---
# #
# Final Steps: # Final Steps:
# Hit Ctl-D, then type sh tunnel.sh # 1) Hit Ctl-D
# 2) Edit six lines of the file (User_Name through Update_Key) to add your tunnelbroker values
# 3) Type: sh tunnel.sh