2012-03-23 10 views
0

Ich verwende tc mit Kernel 2.6.38.8 für Traffic Shaping. Limit bandwidth funktioniert, Hinzufügen von Verzögerung funktioniert, aber wenn die Bandbreite mit Verzögerung geformt wird, ist die erreichte Bandbreite immer viel niedriger als die Grenze, wenn das Limit> 1,5 Mbps oder so ist.Traffic Shaping mit TC ist ungenau mit hoher Bandbreite und Verzögerung

Beispiel:

tc qdisc del dev usb0 root 
tc qdisc add dev usb0 root handle 1: tbf rate 2Mbit burst 100kb latency 300ms 
tc qdisc add dev usb0 parent 1:1 handle 10: netem limit 2000 delay 200ms 

ergibt eine Verzögerung (von ping) von 201 ms, aber eine Kapazität von nur 1,66 Mbps (von iPerf). Wenn ich die Verzögerung eliminiere, ist die Bandbreite genau 2 Mbps. Wenn ich eine Bandbreite von 1 Mbit/s und 200 ms RTT vorschlage, funktioniert alles. Ich habe auch versucht, ipfw + dummynet, die ähnliche Ergebnisse liefert.

Ich habe versucht, den Kernel mit HZ=1000 in Kconfig neu zu erstellen - das hat das Problem nicht behoben. Andere Ideen?

Antwort

5

Es ist eigentlich kein Problem, es verhält sich genau so, wie es sollte. Da Sie eine Latenz von 200 ms hinzugefügt haben, wird die volle 2-Mbit/s-Leitung nicht in vollem Umfang genutzt. Ich würde vorschlagen, dass Sie das TCP/IP-Protokoll genauer studieren, aber hier ist eine kurze Zusammenfassung dessen, was mit iperf passiert: Ihre Standard-Fenstergröße ist vielleicht 3 Pakete (wahrscheinlich jeweils 1500 Bytes). Sie füllen Ihre Pipe mit 3 Paketen, müssen aber jetzt warten, bis Sie eine Bestätigung zurückbekommen (dies ist Teil des Überlastungskontrollmechanismus). Da Sie das Senden für 200ms verzögern, wird dies eine Weile dauern. Jetzt wird Ihre Fenstergröße verdoppelt und Sie können als nächstes 6 Pakete senden, müssen aber wieder 200ms warten. Dann verdoppelt sich die Fenstergröße wieder, aber wenn Ihr Fenster vollständig geöffnet ist, ist der Standard-10-Sekunden-Iperf-Test fast vorbei und Ihre durchschnittliche Bandbreite ist offensichtlich kleiner.

0

Betrachten Sie es wie folgt aus:

Angenommen, Sie Ihre Latenz auf 1 Stunde eingestellt und die Geschwindigkeit bis zu 2 Mbit/s.

2 Mbit/s benötigt (zum Beispiel) 50 Kbit/s für TCP-ACKs. Da die ACKs eine Stunde benötigen, um die Quelle zu erreichen, kann die Quelle nicht weiter mit 2 Mbit/s senden, da das TCP-Fenster immer noch auf die erste Bestätigung wartet.

Latenz und Bandbreite sind mehr verwandt als Sie denken (in TCP zumindest. UDP ist eine andere Geschichte)