mirror of
https://github.com/richb-hanover/OpenWrtScripts.git
synced 2026-03-30 10:44:32 +02:00
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:
parent
7e07b824ac
commit
9d206f7362
3 changed files with 96 additions and 49 deletions
27
README.md
27
README.md
|
|
@ -127,9 +127,12 @@ and netperf-eu (Denmark)
|
|||
* -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)
|
||||
* -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 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 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:
|
||||
|
||||
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
|
||||
in the script itself, or at the
|
||||
[IPv6 Tunnel page.](http://www.bufferbloat.net/projects/cerowrt/wiki/IPv6_Tunnel)
|
||||
2. Edit the tunnelbroker.sh script to use the values supplied by Tunnelbroker.net.
|
||||
The values from the "Tunnel Details" page go into the matching lines of the script.
|
||||
3. ssh into the router and execute this script with these steps.
|
||||
There are detailed instructions for setting up an account and an IPv6 tunnel in the script itself, or at the
|
||||
[IPv6 Tunnel page](http://www.bufferbloat.net/projects/cerowrt/wiki/IPv6_Tunnel) of [bufferbloat.net](bufferbloat.net)
|
||||
2. From the tunnelbroker main page, click "Create Regular Tunnel"
|
||||
* Enter your IP address in "IPv4 Endpoint" (paste in the address you're "viewing from")
|
||||
* Select a nearby Tunnel Server
|
||||
* 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
|
||||
cd /tmp
|
||||
cat > tunnel.sh
|
||||
[paste in the contents of this file, then hit ^D]
|
||||
[edit the script to match your tunnelbroker values]
|
||||
sh tunnel.sh
|
||||
[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`
|
||||
|
||||
|
|
|
|||
|
|
@ -16,8 +16,9 @@
|
|||
# -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)
|
||||
# -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
|
||||
|
||||
# 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)
|
||||
# and computes average.
|
||||
# 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 | \
|
||||
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]); \
|
||||
}; \
|
||||
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.
|
||||
|
|
@ -83,21 +93,18 @@ kill_pings() {
|
|||
# ping command catches (and handles) first Ctrl-C, so you have to hit it again...
|
||||
kill_pings_and_dots_and_exit() {
|
||||
kill_dots
|
||||
kill_pings
|
||||
echo "\nStopped"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# ------------ 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
|
||||
# ------------ start_pings() ----------------
|
||||
# Start printing dots, then start a ping process, saving the results to a PINGFILE
|
||||
|
||||
measure_direction() {
|
||||
start_pings() {
|
||||
|
||||
# Create temp files
|
||||
# Create temp file
|
||||
PINGFILE=`mktemp /tmp/measurepings.XXXXXX` || exit 1
|
||||
SPEEDFILE=`mktemp /tmp/netperfUL.XXXXXX` || exit 1
|
||||
DIRECTION=$1
|
||||
|
||||
# Start dots
|
||||
print_dots &
|
||||
|
|
@ -113,7 +120,23 @@ measure_direction() {
|
|||
fi
|
||||
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
|
||||
if [ $DIRECTION = "Download" ]; then
|
||||
dir="TCP_MAERTS"
|
||||
|
|
@ -141,26 +164,22 @@ measure_direction() {
|
|||
|
||||
# Print TCP Download speed
|
||||
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
|
||||
kill_pings
|
||||
kill_dots
|
||||
|
||||
# Summarize the ping data
|
||||
# When netperf completes, summarize the ping data
|
||||
summarize_pings $PINGFILE
|
||||
|
||||
rm $PINGFILE
|
||||
rm $SPEEDFILE
|
||||
}
|
||||
|
||||
# ------- 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)
|
||||
# “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)
|
||||
# "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;
|
||||
# 5 sessions chosen empirically because total didn't increase much after that number)
|
||||
|
||||
|
|
@ -170,6 +189,7 @@ TESTDUR="60"
|
|||
PINGHOST="gstatic.com"
|
||||
MAXSESSIONS="5"
|
||||
TESTPROTO="-4"
|
||||
IDLETEST=false
|
||||
|
||||
# read the options
|
||||
|
||||
|
|
@ -178,28 +198,30 @@ while [ $# -gt 0 ]
|
|||
do
|
||||
case "$1" in
|
||||
-4|-6) TESTPROTO=$1 ; shift 1 ;;
|
||||
-H|--host)
|
||||
case "$2" in
|
||||
"") echo "Missing hostname" ; exit 1 ;;
|
||||
*) TESTHOST=$2 ; shift 2 ;;
|
||||
esac ;;
|
||||
-t|--time)
|
||||
-H|--host)
|
||||
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 ;;
|
||||
"") echo "Missing hostname" ; exit 1 ;;
|
||||
*) TESTHOST=$2 ; shift 2 ;;
|
||||
esac ;;
|
||||
--) shift ; break ;;
|
||||
*) echo "Usage: sh betterspeedtest.sh [-4 -6] [ -H netperf-server ] [ -t duration ] [ -p host-to-ping ] [ -n simultaneous-sessions ]" ; exit 1 ;;
|
||||
-t|--time)
|
||||
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
|
||||
done
|
||||
|
||||
|
|
@ -212,11 +234,20 @@ else
|
|||
PROTO="ipv6"
|
||||
fi
|
||||
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
|
||||
trap kill_pings_and_dots_and_exit HUP INT TERM
|
||||
|
||||
measure_direction "Download"
|
||||
measure_direction " Upload"
|
||||
if $IDLETEST
|
||||
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
|
||||
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@ Update_Key=AbCDeF54321vWxYz
|
|||
# cd /tmp
|
||||
# cat > tunnel.sh
|
||||
# [paste in the contents of this file, then hit ^D]
|
||||
# [edit the script to match your tunnelbroker values (see #4 above)]
|
||||
# sh tunnel.sh
|
||||
# [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 ---
|
||||
#
|
||||
# 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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue