Überwache deine Internetgeschwindigkeit mit dem Speedtest-cli von ookla

Die Firma Ookla hat am Oktober 2019 ihr eigenes speedtest-cli vorgestellt mit diesem Blog-Artikel: https://www.speedtest.net/insights/blog/introducing-speedtest-cli/. Ookla betreib die bekannte speedtest.net Webseite.

Nach meinen Erfahrungen mit anderen speedtest-cli Programmen, ist die Version von ookla sehr zuverlässig und dazu noch ressourcenschonend was die CPU anbelangt. Die Auswahl von Speedtest-Server ist jedoch eher klein und es werden nur Testserver im näheren Umkreis angezeigt.

speedtest-cli kann man gut für die automatisierte Überwachung der Internetgeschwindigkeit einsetzen. Um speedtest-cli mehrmals täglich auszuführen, kann ein cronjob eingerichtet werden. Das Ergebnis wird dann in eine .csv-Datei geschrieben.

Speedtest cli von Ookla installieren

Hier findest du eine Anleitung zur Installation vom speedtest-cli von ookla: https://www.speedtest.net/de/apps/cli

Erster Durchlauf mit Kopfzeile für .csv-Datei

Um die Kopfzeile für die .csv-Datei zu erzeugen, gibt es die Option --output-header für das speetest-cli:

> speedtest-cli -f csv --output-header >>/var/tmp/speedtests.csv
Speedtest mit CSV-Format- und Kopfzeilenausgabe ausführen 

Die Kopfeile und der erste Speedtest wurden nun in die Datei /var/tmp/speedtests.csv geschrieben. Für die spätere Verwendung mit Cronjob, fehlt jedoch noch ein Zeitstempel in der ersten Spalte. Somit sollte der erste Speedtest aus der Datei gelöscht und die Kopfzeile wie folgt angepasst werden:

> cat /var/tmp/speedtests.csv
"date time","server name","server id","latency","jitter","packet loss","download","upload","download bytes","upload bytes","share url"
"date time", am Zeilenanfang einfügen.

Am Anfang der Kopfzeile wurde ein zusätzliche Spalte "date time", eingefügt.

Cronjob einrichten

crontab -e <– Editiert die crontab Datei des aktuellen Benutzers

Cronjob einrichten und Datei speichern:

# m h  dom mon dow   command
22 */4 * * * /bin/bash -c 'echo "\"$(date +\%d.\%m.\%Y\ \%H:\%M:\%S)\",$(/usr/bin/speedtest -f csv)" >>/var/tmp/speedtests.csv'
Crontab-Datei

Mit diesem Befehl wird noch ein Zeitstempel im ersten Feld eingefügt und die ganze Zeile, samt Speedtest-Daten, in die Datei /var/tmp/speedtests.csv gespeichert. Der cronjob läuft alle 3 Stunden in der 22. Minute (Beispiel: 00:22:00 Uhr, nächster Lauf wäre dann um 03:22:00 Uhr). Die Ausführungszeiten könnt ihr nach eurem belieben anpassen, siehe dazu: https://crontab.guru/

Nach einiger Zeit sieht dann die speedtests.csv-Datei ungefähr so aus:

$ head /var/tmp/speedtests.csv
"date time","server name","server id","latency","jitter","packet loss","download","upload","download bytes","upload bytes","share url"
"22.03.2020 00:22:01","AltusHost B.V. - Zurich","24815","0.581","0.066","0","117958818","109795919","738752224","1526962782","https://www.speedtest.net/result/c/c4aeeb83-fbc0-41a0-a4c6-831964c57616"
"22.03.2020 03:22:01","Monzoon Networks AG - Zurich","15728","0.685","0.162","0","117456643","117409747","470529048","435360798","https://www.speedtest.net/result/c/404b9f22-5eca-46da-aaf7-45c7ee2c7c2d"
"22.03.2020 06:22:01","AltusHost B.V. - Zurich","24815","0.575","0.042","0","117449826","105577417","433868584","1121279222","https://www.speedtest.net/result/c/324ccefa-80e6-4084-9f77-52daec3ca9d9"
"22.03.2020 09:22:01","GTT.net - Zurich","24389","0.627","0.046","0","117015483","117486696","456632592","434263812","https://www.speedtest.net/result/c/015f930d-c382-4939-be74-9cb1f79dac6c"
"22.03.2020 12:22:01","iway AG - Zurich","3188","2.746","0.094","0","106040304","115995140","1423693152","729830144","https://www.speedtest.net/result/c/1d560a34-784e-4477-81db-e39600712b98"
…
Ausschnitt aus der speedtests.csv-Datei

Diagramm erstellen

Um die Daten in einem Diagramm dazustellen habe ich gnuplot (http://www.gnuplot.info/)  verwendet. Ihr müsst wahrscheinlich gnuplot erst installieren, falls ihr es verwenden möchtet.
Damit gnuplot im Terminal etwas ausgibt, muss dieses auf dumb eingestellt werden.

set terminal dumb ansirgb feed enhanced size 120, 30 aspect 1;

gnuplot kann am einfachsten mit einer Konfigurationsdatei genutzt werden. Die Konfigurationsdatei gnuplot_speedtest_data sieht in meinem Beispiel so aus:

> cat gnuplot_speedtest_data 
# Gnuplot for speedtests.csv
reset
set terminal dumb ansirgb feed enhanced size 128, 31 aspect 1;
set tics nomirror scale 0.5;
set autoscale;
set datafile separator ","

set title "Internetgeschwindigkeiten in Mbps\n[".strftime("%d.%m.%Y %H:%M:%S",time(0))."]"

set xlabel "Datetime" offset 0,-1  # label for the X axis
set xdata time
set timefmt "%d.%m.%Y %H:%M:%S"
set format x "%d.%m\n%H:%M" # Display date time format on graph
# Show last 48h
set xrange [time(0)-2*24*60*60:]

set ylabel "Mbps" offset character 2,0 # label for the Y axis
#set yrange [0:] # show whole range from zero

# change legend position
set key right below nobox

set grid

plot "/var/tmp/speedtests.csv" using 1:($7*8/1000/1000) with line title "Download", '' using 1:($8*8/1000/1000) with line title "Upload"
Gnuplot Konfigurationsdatei

Dies zeichnet ein simples, ascii-basiertes Diagramm da ich direkt auf einem Server die Plots erstelle und kein X11 zu Verfügung habe. Es werden die letzten 48 Stunden angezeigt mit set xrange [time(0)-22460*60:]. Plot erstellen in Bash:

gnuplot -p gnuplot_speedtest_data
gnuplot mit Konfigurationsdatei ausführen 

Dies erzeugt folgendes Diagramm in Bash:

Ascii gnuplot von der speedtests.csv Datei

Es gibt viele verschiedene gnuplot terminals, unter anderem mit Unterstützung für LaTeX und natürlich das .pdf-Format. Für eine .pdf-Version des obigen Diagramms, müsst ihr diese Zeile => set terminal dumb ansirgb feed enhanced size 128, 31 aspect 1; in der gnuplot_speedtest_data mit folgenden zwei ersetzen:

…
set terminal pdf                     # erzeugt ein pdf
set out "speedtest_diagramm.pdf"     # Pfad und Name des PDFs
…
Gnuplot pdf terminal

Gnuplot nochmals ausführen, dies erzeugt das speedtest_diagramm.pdf im aktuellen Ordner:

gnuplot -p gnuplot_speedtest_data
gnuplot mit Konfigurationsdatei ausführen 

Resultierendes speedtest_diagramm.pdf (als Bild):

Bild der generierten PDFs

Gnuplot Terminal FAQ: How do I print out my graphs?

Mehr zu speedtest-cli

Ein interessanter und detaillierter Artikel (in Englisch) über speedtest-cli findest du hier: https://www.putorius.net/speed-test-command-line.html