Bandbreitenmessung

Mit Docsis3.1 sind im Kabelnetz auch hohe Bandbreiten möglich. Vodafone wirbt hier mit mittlerweile 1GBit/s über Koaxialkabel. Das steht so erst mal auf dem Plakat.

Ich sollte hier glaube ich 200Mbit/s im Downstream haben. Das kommt im Schnitt auch ungefähr hin, wie ich festgestellt habe. Nur in den Abendstunden sackt die Datenrate teils doch erheblich auf unter 40 MBit/s ab. Kabel bleibt nun mal ein shared-medium und bis zu 5000 Teilnehmer teilen sich die Bandbreite eines Hubs. Wenn ich mir mit so vielen Teilnehmern die Bandbreite am Hub teile, kann ich nicht auf meine 200 kommen, macht Sinn. Daher dachte ich mir, loggst du das mal. Die Toolchain dazu hat sich dann irgendwie ergeben. Ein bisschen Shell hier, dazu ein gutes Tool mit JSON-Ausgabe, ein bisschen Go da. Angefangen hat es mit iperf3. Einem Tool zum benchmarken von Netzwerken. Auf einer Seite wird iperf als Server gestartet iperf3 -s und auf der Gegenseite als Client iperf3 -c IP_VOM_SERVER. Im Default sendet der Client (man testet also den eigenen Uplink), mit -R für Reverse als Schalter kann der Client aber auch Daten vom Server empfangen um den Downlink zu testen. Dabei wird dann die maximal zur Verfügung stehende Bandbreite genutzt. Mit "-P n" auch mit n parallelen Streams. Hängt man dann noch -J ran erfolgt die Ausgabe als JSON - gut für spätere Auswertungen. Der Aufruf könnte dann so aussehen. iperf3 -c iperf.volia.net -R -P 4 -J > ~/down_upstream_logs/$(date +"%Y_%m_%d__%H_%M").json Die Ausgabe als JSON wird in eine Datei mit Datums- und Uhrzeitangabe geschrieben. Das als Cronjob und Voila, Stufe 1, das Protokollieren, wäre erledigt. Es folgt: Stufe 2, Auswertung! Dafür hab ich mir in Go ein kleines Tool geschrieben, welches alle Dateien im Verzeichnis ~/down_upstream_logs/ einliest und den Wert aus JSON-Pfad end.sum_received.bits_per_second ausliest. Damit kann man dann beliebige Auswertungsszenarien fahren. Mir reicht fürs Erste das arithmetische Mittel. Aktueller Stand: 177 MBit/s nach über 800 Messungen. Den Code und das gegen mein System kompilierte Binary gibt es hier Der Code nutzt zum parsen des JSONs eine externe Bibliothek. Diese macht den Umgang mit JSONs recht komfortabel. Ich kann einfach den oben genannten Pfad übergeben und bekomme den Wert zurück. Also einmal go get -u github.com/tidwall/gjson. Der Rest ist denke ich selbsterklärend, da passiert nicht viel.


Author: dude

keep it simple