it-swarm.com.de

Simulieren Sie verzögerte und verworfene Pakete unter Linux

Ich möchte die Paketverzögerung und den Paketverlust für UDP und TCP unter Linux simulieren, um die Leistung einer Anwendung zu messen. Gibt es eine einfache Möglichkeit, dies zu tun?

231
Alec

netem nutzt Funktionen, die bereits in Linux- und Userspace-Dienstprogrammen integriert sind, um Netzwerke zu simulieren. Darauf bezieht sich eigentlich 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 WAN-Verzögerungen

Dies ist das einfachste Beispiel. Es wird lediglich eine feste Verzögerung für alle Pakete hinzugefügt, die vom lokalen Ethernet ausgehen.

# tc qdisc add dev eth0 root netem delay 100ms

Ein einfacher Ping-Test zum Host im lokalen Netzwerk sollte nun eine Erhöhung von 100 Millisekunden anzeigen. Die Verzögerung wird durch die Taktauflösung des Kernels (Hz) begrenzt. Bei den meisten 2.4-Systemen läuft die Systemuhr 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 zeigen Variabilität, so dass es möglich ist, zufällige Variationen hinzuzufügen.

# tc qdisc change dev eth0 root netem delay 100ms 10ms

Dies bewirkt, dass die hinzugefügte 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 Element abhängt. Dies ist keine echte statistische Korrelation, sondern eine Annäherung.

Verteilung verzögern

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 eine Tabelle verwenden, um eine ungleichmäßige Verteilung anzugeben.

# tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal

Die eigentlichen Tabellen (normal, Pareto, paretonormal) werden im Rahmen der iproute2-Kompilierung generiert und in/usr/lib/tc abgelegt. es ist also mit einigem Aufwand möglich, eine eigene Distribution auf der Basis von 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 bewirkt, dass 1/10 eines Prozentes (d. H. 1 von 1000) Pakete zufällig fallengelassen werden.

Eine optionale Korrelation kann ebenfalls hinzugefügt werden. Dies bewirkt, dass der Zufallszahlengenerator weniger zufällig ist, und kann verwendet werden, um Paketburstverluste zu emulieren.

# tc qdisc change dev eth0 root netem loss 0.3% 25%

Dadurch gehen 0,3% der Pakete verloren, und jede nachfolgende Wahrscheinlichkeit hängt um ein Viertel von der letzten ab.

Probn = 0,25 × Probn-1 + 0,75 × zufällig

Beachten Sie , dass Sie tc qdisc add Verwenden sollten, wenn Sie keine Regeln für diese Schnittstelle haben, oder tc qdisc change, Wenn Sie bereits Regeln für haben diese Schnittstelle. Der Versuch, tc qdisc change Für eine Schnittstelle ohne Regeln zu verwenden, führt zu dem Fehler RTNETLINK answers: No such file or directory.

309
ephemient

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 zum Stillstand kommen.

Schauen Sie sich man iptables an und suchen Sie nach "Statistik", um weitere Informationen zu erhalten.

83

Einer meiner Kollegen nutzt dazu tc. Weitere Informationen finden Sie auf der Manpage. Sie können ein Beispiel für seine Verwendung sehen hier .

7
Mark

iptables (8) verfügt über ein Statistikmodul, mit dem jedes n-te Paket abgeglichen werden kann. Fügen Sie einfach - j DROP hinzu, um dieses Paket abzulegen.

5
hillu

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 öffentlichen Latenz und packetLoss Variablen der Verbindungsklasse in der Datei Connection.h des herunterladbaren Quellcodes .

3
Judge Maygarden

Sie können versuchen http://snad.ncsl.nist.gov/nistnet/ Es ist ein ziemlich altes NIST-Projekt (letzte Version 2005), aber es funktioniert für mich.

1
Elalfer

Eines der am häufigsten verwendeten Tools in der wissenschaftlichen Community ist DummyNet . Nachdem Sie das Kernelmodul ipfw 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.

1
gaetano

Ich habe es nicht selbst ausprobiert, aber diese Seite hat eine Liste von Plug-in-Modulen, die in dem in iptables integrierten IP-Filtersystem von Linux ausgeführt werden. Eines der Module heißt "nth" und ermöglicht das Einrichten einer Regel, mit der eine konfigurierbare Rate der Pakete verworfen wird. Könnte zumindest ein guter Anfang sein.

1
unwind

Ein einfach zu verwendendes Tool zur Netzwerkfehlerinjektion ist Saboteur . Es kann simulieren:

  • Gesamtnetzwerkpartition
  • Remote-Dienst nicht verfügbar (lauscht nicht auf dem erwarteten Port)
  • Verzögerungen
  • Paketverlust - Timeout der TCP-Verbindung (wie häufig, wenn zwei Systeme durch eine Stateful Firewall getrennt sind)
1
Alex Giotis