Ich möchte Paketverzögerung und -verlust für UDP
und TCP
unter Linux simulieren , um die Leistung einer Anwendung zu messen. Gibt es eine einfache Möglichkeit, dies zu tun?
Ich möchte Paketverzögerung und -verlust für UDP
und TCP
unter Linux simulieren , um die Leistung einer Anwendung zu messen. Gibt es eine einfache Möglichkeit, dies zu tun?
Antworten:
netem nutzt Funktionen, die bereits in Linux- und Userspace-Dienstprogrammen integriert sind, um Netzwerke zu simulieren. Darauf bezieht sich Marks Antwort mit einem anderen Namen.
Die Beispiele auf ihrer Homepage zeigen bereits, wie Sie das erreichen können, wonach Sie gefragt haben:
Beispiele
Emulieren von Verzögerungen im Weitverkehrsnetz
Dies ist das einfachste Beispiel. Es fügt lediglich allen Paketen, die aus dem lokalen Ethernet gesendet werden, eine feste Verzögerung hinzu.
# tc qdisc add dev eth0 root netem delay 100ms
Ein einfacher Ping-Test zum Hosten im lokalen Netzwerk sollte nun einen Anstieg von 100 Millisekunden anzeigen. Die Verzögerung wird durch die Taktauflösung des Kernels (Hz) begrenzt. Auf den meisten 2.4-Systemen läuft der Systemtakt mit 100 Hz, was Verzögerungen in Schritten von 10 ms ermöglicht. Bei 2.6 ist der Wert ein Konfigurationsparameter von 1000 bis 100 Hz.
Spätere Beispiele ändern nur die Parameter, ohne die qdisc neu zu laden
Reale Weitverkehrsnetze weisen Variabilität auf, sodass zufällige Variationen hinzugefügt werden können.
# tc qdisc change dev eth0 root netem delay 100ms 10ms
Dies bewirkt, dass die zusätzliche Verzögerung 100 ± 10 ms beträgt. Die Variation der Netzwerkverzögerung ist nicht rein zufällig, um zu emulieren, dass es auch einen Korrelationswert gibt.
# tc qdisc change dev eth0 root netem delay 100ms 10ms 25%
Dies bewirkt, dass die hinzugefügte Verzögerung 100 ± 10 ms beträgt, wobei das nächste zufällige Element 25% vom letzten abhängt. Dies ist keine echte statistische Korrelation, sondern eine Annäherung.
Verzögerungsverteilung
Typischerweise ist die Verzögerung in einem Netzwerk nicht einheitlich. Es ist üblicher, eine Normalverteilung zu verwenden, um die Variation der Verzögerung zu beschreiben. Die Netem-Disziplin kann anhand einer Tabelle eine ungleichmäßige Verteilung angeben.
# tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal
Die tatsächlichen Tabellen (normal, pareto, paretonormal) werden im Rahmen der iproute2-Kompilierung generiert und in / usr / lib / tc abgelegt. So ist es mit einigem Aufwand möglich, eine eigene Verteilung basierend auf experimentellen Daten zu erstellen.
Paketverlust
Der zufällige Paketverlust wird im Befehl 'tc' in Prozent angegeben. Der kleinstmögliche Wert ungleich Null ist:
2 - 32 = 0,0000000232%
# tc qdisc change dev eth0 root netem loss 0.1%
Dies führt dazu, dass 1/10 Prozent (dh 1 von 1000) Paketen zufällig verworfen werden.
Eine optionale Korrelation kann ebenfalls hinzugefügt werden. Dies führt dazu, dass der Zufallszahlengenerator weniger zufällig ist und zum Emulieren von Paketburstverlusten verwendet werden kann.
# tc qdisc change dev eth0 root netem loss 0.3% 25%
Dadurch gehen 0,3% der Pakete verloren, und jede aufeinanderfolgende Wahrscheinlichkeit hängt um ein Viertel von der letzten ab.
Prob n = 0,25 × Prob n-1 + 0,75 × zufällig
Beachten Sie, dass Sie verwenden sollten, tc qdisc add
wenn Sie keine Regeln für diese Schnittstelle haben oder tc qdisc change
wenn Sie bereits Regeln für diese Schnittstelle haben. Der Versuch, tc qdisc change
auf einer Schnittstelle ohne Regeln zu verwenden, führt zu dem Fehler RTNETLINK answers: No such file or directory
.
tc -p qdisc ls dev eth0
die aktuell definierten Regeln tc qdisc del dev eth0 root
Für verworfene Pakete würde ich einfach iptables und das Statistikmodul verwenden .
iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP
Oben wird ein eingehendes Paket mit einer Wahrscheinlichkeit von 1% verworfen. Seien Sie vorsichtig, alles über 0,14 und die meisten von Ihnen TCP-Verbindungen werden höchstwahrscheinlich vollständig blockieren.
Werfen Sie einen Blick auf man iptables und suchen Sie nach "Statistik" für weitere Informationen.
DROP
bei ausgehenden Verbindungen auf lächerliche Weise send()
Operationen zurückgegeben werden EPERM
, anstatt nur Pakete zu verwerfen (wie es sollte).
iptables -D INPUT -m statistic --mode random --probability 0.01 -j DROP
Einer meiner Kollegen benutzt dazu tc. Weitere Informationen finden Sie in der Manpage. Ein Beispiel für die Verwendung finden Sie hier .
Dieses Tutorial zu Netzwerkphysik-Simulationen enthält eine C ++ - Klasse im Beispielcode zur Simulation von Latenz und Paketverlust in einer UDP-Verbindung und kann als Anleitung dienen. Siehe die Variablen für öffentliche Latenz und packetLoss der Connection- Klasse in der Datei Connection.h des herunterladbaren Quellcodes .
Ich habe es nicht selbst ausprobiert, aber diese Seite enthält eine Liste der Plugin-Module, die unter Linux 'integriertem iptables IP-Filtersystem ausgeführt werden. Eines der Module heißt "n-te" und ermöglicht es Ihnen, eine Regel einzurichten, mit der eine konfigurierbare Rate der Pakete verworfen wird. Könnte zumindest ein guter Anfang sein.
Sie können http://snad.ncsl.nist.gov/nistnet/ ausprobieren. Es ist ein ziemlich altes NIST-Projekt (letzte Version 2005), aber es funktioniert für mich.
Ein einfach zu verwendendes Tool zur Injektion von Netzwerkfehlern ist Saboteur . Es kann simulieren:
- Gesamtnetzwerkpartition
- Remote-Service tot (der erwartete Port wird nicht abgehört)
- Verzögerungen
- Zeitverlust bei Paketverlust - TCP-Verbindung (wie es häufig vorkommt, wenn zwei Systeme durch eine zustandsbehaftete Firewall getrennt sind)
Eines der am häufigsten verwendeten Tools in der wissenschaftlichen Gemeinschaft zu diesem Zweck ist DummyNet . Nachdem Sie das ipfw
Kernelmodul installiert haben, führen Sie einfach die folgenden Befehle aus, um eine Laufzeitverzögerung von 50 ms zwischen zwei Computern einzuführen:
./ipfw pipe 1 config delay 50ms
./ipfw add 1000 pipe 1 ip from $IP_MACHINE_1 to $IP_MACHINE_2
Um auch 50% der Paketverluste einzuführen, müssen Sie Folgendes ausführen:
./ipfw pipe 1 config plr 0.5
Hier mehr Details.