WAN-Simulator
Eigenschaften eines WAN
WAN steht für Wide Area Network und wird typischerweise
für Verbindungen im Bereich von hundert bis mehrere
Tausend Kilometer verwendet. Der Bereich zwischen LAN und WAN
wird MAN oder Metropolitan Area Network bezeichnet.
Abschätzung der Latenzzeiten
Bei so langen Verbindungen entsteht signifikante Latenz, die
einige Anwendungen verhindert und viele behindert.
Die Latenz ist immer größer als die Entfernung
auf der Luftlinie geteilt durch die Lichtgeschwindigkeit,
da die genutzten Kabel nicht auf dem kürzesten Weg liegen
und Kupfer- bzw. Glasfaserkabel Signale nicht genau mit
Lichtgeschwindigkeit übertragen können.
Eine gute Näherung ergibt sich mit einem Faktor von 1,5
für die Entfernung und 2/3 für die Signalgeschwindigkeit.
Latenz=(1,5*Entfernung) / ( 2/3 * Lichtgeschwindigkeit)
Latenz in Millisekunden=(1,5*Entfernung in Kilometern ) / 200
Entfernung Luftlinie in km | Latenz ms | RTT in ms |
100 | 0,75 | 1,5 |
200 | 1,5 | 3 |
400 | 3 | 6 |
600 | 4,5 | 9 |
Realistisch liegen die Latenzzeiten noch höher, da die
Carrier heute IP-basierte und damit Paket-vermittelnde Techniken
einsetzen. Im Gegensatz zur früheren Multiplextechnik ergeben
sich höhere Latenzen, die darüberhinaus auch noch schwanken (Jitter).
Bei hohen Auslastungen werden Pakete verworfen bevor sie
weitergeschickt werden können. Aus betriebswirschaftlicher
Sicht ist es für die Carrier sinnvoll mehr Bandbreite zu verkaufen
als sie im Backbone selber installiert haben (Überbuchung); in den
Anschlussleitungen passt die Bandbreite noch und da die Kunden selten
gleichzeitig die gekaufte und bezahlte Bandbreite gleichzeitig in
Anspruch nehmen, passt es sogar meist auch im restlichen Netz.
Meist heißt aber nicht immer und dieses führt zu
sporadischen Paketverlusten.
Ein weiterer Effekt in den IP-Netzen der Carrier ist ein Reordering
von Paketen. Wenn zwischen Quelle und Ziel mehrere Wege verfügbar
sind, dann können sich Pakete gegenseitig überholen und
somit in einer anderen Reihenfolge ankommen als sie versendet wurden.
Dabei reicht es durchaus, dass unterschiedliche logische Wege verfügbar
sind. Verfügen die eingesetzten Netzkoppelelemente zum Beispiel über
unterschiedliche Wartenschlangen für unterschiedliche Paketgrößen,
dann kann es schon passieren, dass auf nur einem physikalischen Weg ein kleines
Paket schneller als ein großes am Ziel ankommt.
Einfluss auf Anwendungen
Anwendungsprogrammierer für Client-Server-Anwendungen haben
häufig ein hochwertiges Entwicklungsumfeld; leistungstarke Clients
die netzwerktechnisch unmittelbar neben potenten Servern stehen.
So hält man gute Entwickler bei Laune.
Beim Ausrollen so entwickelter Anwendungen gibt es bei den Kunden dann
immer wieder unerklärliche Performanceprobleme.
Mal ist die Bandbreite ein Problem, mal die Latenz und mal die
Fehlerrate. Ganz selten auch mal die veränderte Paketreihenfolge.
Inzwischen gehört es bei vielen Entwicklern dazu, die Anwendung
vor der Auslieferung bezüglich der Empfindlichkeit gegen die
beschriebenen Faktoren zu testen. Schwieriger wird es für Kunden,
die nach jahrelangem problemlosen Betrieb einer Anwendung umziehen
oder die Server in ein entferntes Rechenzentrum auslagern.
Die Anwendungsentwickler sind nicht greifbar und die verlagerten Server
lassen sich nicht trivial zurückholen.
Ob jetzt vor einer Verlagerung, oder vor dem ersten Ausliefern einer
Anwendung getestet wird, ist eine Testumgebung erforderlich, die
idealerweise die oben genannten Faktoren gezielt steuern kann.
Die erforderliche Technik heißt WAN-Simulator oder auch
WAN-Emulator. Diese gibt es fertig
zu kaufen; sind aber für kleine Entwickler finanziell eine
Hürde, die nicht jeder überwinden kann.
Prinzipieller Aufbau eines WAN-Simulators
Ein WAN-Simulator benötigt typischerweise drei Netzwerkkarten
und wird über zwei von diesen in den Datenverkehr zwischen
Client und Server eingeschleift. Das dritte Interface dient der
Steuerung und ggf. auch dazu Messdaten (Traces) abzugreifen ohne
die zu messende Kommunikationsbeziehung zu stören.
Selbstbau
Linux bringt schon seit Jahren alles mit, um einen WAN-Simulator
zu bauen und vermutlich basieren viele der professionellen Systemen
auch auf diesem Betriebssystem.
Als ich jetzt einerseits den Bedarf nach einem WAN-Simulator hatte
und andererseits inzwischen auch VLAN-taugliche Ethernet-Switches
mein Eigen nennen darf, stand dem Selbstbau nicht mehr viel im
Weg.
Mein Cubietruck schien mir ein guter Kompromiss unter
Berücksichtigung der Leistungsdaten, der Kosten und der
Transportfähigkeit. Im Gegensatz zum RaspberryPi bietet der
Cubietruck ein im Prozessor sehr gut integriertes LAN-Interface
mit Gigabit-Ethernet wo der RasPi nur ein USB-angebundenes
100Mbps-Interface zu bieten hat.
VLAN-tauglicher Switch
Ich verwende den NSW Netgear GS105Ev2 mit der Firmware V1.4.0.2.
Dieser Switch ist klein und handlich und mit etwas über
20 € auch nicht zu teuer für fünf Gigabit-Ethernet-Ports.
Ein Nachteil ist für mich allerdings, dass dieser Switch
ausschließlich mit einem Windows-Rechner konfiguriert
werden kann. Das erscheint mir nicht zeitgemäß und ist
durchaus eine Einschränkung in Zeiten von Tablets und Smartphones.
Von meinen Vorlieben für Linux-Rechnern will ich hier gar nicht
reden.
Mit diesem Programm (ProSafe Plus Konfigurationsprogramm) kann
jeder dieser Ports entweder als Trunk, also mit Zusatzinformationen
gemäß 802.1q zu den virtuellen LAN konfiguriert werden,
oder als "normaler" LAN-Anschluss ohne diese Zusatzinformationen
in einem der vergebenen Netze.
Für meine Tests hat sich bewährt die Ports 1 und 2
in ein VLAN (1) zu konfigurieren, Port 3 als Trunk,
Port 4 in VLAN 5 und Port 5 in VLAN 6.
An Port 3 kommt dann der Cubietruck, an Port 4 der
Client und an Port 5 der Server. Letztere Anschlüsse
dürfen selbstverständlich beliebig getauscht werden.
Nachtrag Oktober 2016 zum NSW Netgear GS105Ev2
Inzwischen ist das fehlende WEB-Interface vorhanden und der
oben beschrieben Nachteil somit Geschichte.
VLAN-Konfiguration auf dem Cubietruck
Sinn und Zweck ist es ja, aus dem einen LAN-Interface des
Cubietrucks mehrere zu machen. Im konkreten Fall zwei, und das
sind auf dem Switch die Ports 4 und 5.
Aus Linux-Sicht heißen die neuen Interfaces
eth0.5 und eth0.6. Ohne die unten folgende interne Bridge
könnten die Ports unabhängig voneinander genutzt werden.
Mit geeigneter Switch- und Linux-Konfiguration wären so vier
LAN-Interfaces möglich. Mit einem größeren Switch
auch mehr.
#!/bin/bash
modprobe 8021q
ip link add link eth0 name eth0.5 type vlan id 5
ip link add link eth0 name eth0.6 type vlan id 6
ip link set eth0 up
ip link set eth0.5 up
ip link set eth0.6 up
ifconfig eth0.5 0.0.0.0
ifconfig eth0.6 0.0.0.0
Bridge zwischen den VLAN
Die Daten des Clients sollen ja durch den WAN-Simulator zum Server gelangen und
die Antworten des Servers wieder zurück zum Client. Dafür muss eine
Verbindung zwischen den LAN-Interfaces eth0.5 und eth0.6 geschaffen werden.
Im Ethernet wird dieses durch eine Bridge realisiert; hier muss also eine
virtuelle innerhalb des Cubietrucks erstellt werden:
#!/bin/bash
brctl addbr br0
brctl setfd br0 0
brctl addif br0 eth0.5
brctl addif br0 eth0.6
ifconfig br0 up
# IPv4-Adresse fuer In-band Mangement setzen:
ifconfig br0 10.0.0.3 netmask 255.255.255.0 up
# schalte alle Filter aus:
for f in /proc/sys/net/bridge/bridge-*; do echo 0 > $f; done
Software netem
Voraussetzung für die Nutzung der Netzwerkemulation netem
ist ein passend konfigurierter Linux-Kernel. Alle meine bisherigen Systeme
hatten die entsprechende Konfiguration enhalten:
Networking / Networking Options / QoS and/or fair queuing (*) / Network emulator (M)
Wenn der Kernel keine passende Unterstützung bietet, gibt es
die Fehlermeldung
RTNETLINK answers: Operation not supported
Falls dieses passiert hilft ein neuer Kernel; zum Beispiel vom netten
Daniel Andersen unter seiner Download-Seite http://dl.danand.de/cubieboard/
Den Kernel danand_a20_3_4_108_d.tgz hat er extra für mich mit diesen Kernel-Optionen gebaut; auch auf diesem Weg nocheinmal vielen Dank!
Die gute man-page zu netem gibt es auch im Netz unter http://lartc.org/manpages/tc.txt.
#!/bin/bash
# neu anlegen (add)
tc qdisc add dev eth0.5 root netem delay 25ms loss 0.5%
tc qdisc add dev eth0.6 root netem delay 25ms loss 0.5%
# aendern (replace wirkt wie entfernen und sofort wieder neu anlegen)
# bei einigen Operationen ist der Wechsel mit change statt replace
# direkt moeglich.
#
tc qdisc replace dev eth0.5 root netem delay 0ms loss 0%
tc qdisc replace dev eth0.6 root netem delay 0ms loss 0%
Exkurs Warum ein neuer Kernel, wenn doch alle meine
bisherigen die richtigen Optionen hatte? Ein Entwickler hatte im
Code des Ethernet-Treibers wohl Probleme im Umgang mit VLAN und
hatte bei jedem Paket nach 802.1q eine Kernel-Ausgabe geschrieben.
Dieses hat die Performance im konkreten Anwendungsfall soweit
reduziert, dass keine vernünftigen Messungen möglich waren.
In-band versus Out-of-band Management
Im üblichen Einsatz eines WAN-Simulators erfolgt ein Out-of-Band
Management, auch um einen Einfluss der Administration auf die
simulierte WAN-Strecke sicher auszuschließen.
Wenn zum Beispiel durch eine geignete zeitliche Abfolge die Steuerung
von der Simulation getrennt werden kann, ist auch ein In-band Mangement
möglich.
Im obigen Code-Ausschnitt zur Konfiguration der Bridge ist zu sehen,
dass für das In-band Management eine IPv4-Adresse an das
Bridge-Interface gebunden wurde.
Der Client hat hier die zentrale Rolle. Erst stellt er auf dem
WAN-Simulator die Parameter ein, dann misst und protokolliert er die
Antwortzeit eines ICMP-Echo-Pakets ("ping") und führt dann einen
Filetransfer einer 100 MByte-Datei durch.
Die vom Filetransferprogramm bereitgestellten Performancedaten werden
ebenfalls protokolliert.
Performance mit diesem Testaufbau
Tests ohne Latenz und ohne Paketverlust zeigen die erreichbaren
Transferraten. Diese liegen in der Größenordnung von
67 Mbps auf Anwendungsebene, also schon abzüglich der
Protokoll-Header. Unter deren Berücksichtigung ist von
mindestens 70 Mbps auszugehen.
Unter optimaler Nutzung der TCP-Funktionalitäten sollte diese
Übertragungsrate bei zunehmender Latenz nicht, bzw. nur minimal
einbrechen solange es keine Paketverluste gibt (die Bandbreite
bleibt ja bestehen und sollte idealerweise die Begrenzung der
erreichbaren Übertragungsrate sein). Sollte aber die
Fenstergröße zu klein, oder eine Blockung in der Anwendung
vorliegen, reduziert sich die erreichbare
Datenrate erheblich.
Lotus Notes (inzwischen IBM) nutzt zum Beispiel in der Anwendung eine
Blockgröße von nur 16 kByte und reagiert damit
empfindlich auf hohe Latenzen. Viele SSL-Implementierungen nutzen die
maximale Blockgröße der Verschlüsselung auch um auf
eine Bestätigung von der Gegenseite zu warten, was ebenfalls als
erhebliche Bremse wirken kann.
Ob die gemessene Obergrenze jetzt die Grenze der eingesetzten
Hardware ist, muss ein Folgetest aufzeigen.
Messung scp auf Basis der openssh-Implementierung
In den folgenden Diagrammen sind die Ergenisse der ersten Messreihen
dargestellt. Der Overhead für die Protokollschichten Ethernet, 802.1q,
IP und TCP wurden nicht hineingerechnet; die Werte beziehen sich also
auf die Werte, die tatsächlich bei der Anwendung "ankommen".
Es ist zu sehen, dass scp alleine durch Latenz signifikant an Performance
verliert. Der Einfluss von Paketverlusten im Promillebereich ist dabei
fast zu vernachlässigen. Oberhalb von 1 Prozent spielt die Latenz
eine untergeordnete Rolle. Die Übertragungsrate bricht schon bei wenigen
Millisekunden Latenz auf Werte unterhalb von 10 Prozent des Maximalwertes
und sinkt mit zunehmender Latenz nur wenig weiter.



HPN-Patches
Vom Pittsburgh Supercomputing Center
gibt es Patches zur Leistungssteigerung der sonst auf openssh basierenden Produkte.
Unter Linux sind die modifizierten Progamme typischerweise als gesonderte Pakete verfügbar.
| |