Bessere TCP-Leistung über ein „Netzwerk mit hoher Verzögerung“

8

Ich versuche, meinen TCP-Durchsatz über ein "Netzwerk mit hoher Verzögerung" zwischen Linux-Computern zu verbessern.

Ich habe tcp_mem, tcp_wmemund tcp_rmemauf „8192 7061504 7061504“.
Ich habe rmem_max, wmem_max, rmem_defaultund wmem_defaultauf „7061504“.
Ich setze netdev_max_backlogund txqueuelenauf 10000.
Ich setze tcp_congestion_controlauf "skalierbar".

Ich verwende "nist" (cnistnet), um eine Verzögerung von 100 ms zu simulieren, und das BW, das ich erreiche, beträgt ungefähr 200 MBit / s (ohne Verzögerung erreiche ich ungefähr 790 MBit / s).

Ich verwende iperf, um die Tests durchzuführen, und TCPTrace, um die Ergebnisse zu analysieren, und hier ist, was ich habe:

Auf der Empfängerseite:
max win adv: 5294720 Bytes
Durchschnitt win adv: 5273959 Bytes
sack pkts gesendet: 0

Auf der Absenderseite:
tatsächliche Datenbytes: 3085179704
rexmt Datenbytes: 9018144
max owin: 5294577 bytes
avg owin: 3317125 bytes
RTT min: 19,2 ms
RTT max: 218,2 ms
RTT avg: 98,0 ms

Warum erreiche ich nur 200 MBit / s? Ich vermute, dass der „Owin“ etwas damit zu tun hat, bin mir aber nicht sicher (diese Ergebnisse beziehen sich auf einen Test von 2 Minuten. Ein 1-Minuten-Test hatte einen „durchschnittlichen Owin“ von 1552900)…

Bin ich falsch zu erwarten, dass der Durchsatz fast 790 MBit / s beträgt, selbst wenn die Verzögerung 100 ms beträgt?

(Ich habe versucht, größere Zahlen in den Fensterkonfigurationen zu verwenden, aber es schien keinen Effekt zu haben.)


quelle
Sie haben hier echte Hardware. TCP nehmen CPU, NIC haben einen eigenen Puffer, ACPI haben ein eigenes Limit, etc ..
J-16 SDiZ

Antworten:

3

Dies ist ein häufiges TCP-Problem namens "Long Fat Pipe". Wenn Sie diesen Satz und TCP googeln, finden Sie viele Informationen zu diesem Problem und mögliche Lösungen.

Dieser Thread enthält eine Reihe von Berechnungen und Vorschlägen zum Optimieren des Linux-TCP-Stacks für diese Art von Dingen.

3dinfluence
quelle
1

Der Standort

http://www.psc.edu/networking/projects/tcptune/

erwähnt, dass Linux heutzutage die TCP-Einstellungen automatisch abstimmt und das Durcheinander mit den Werten die Dinge wahrscheinlich nicht verbessern wird.

Davon abgesehen können vielleicht 100 ms zusammen mit einer großen Bandbreite (mindestens 790 Mbit / s) zu einem enormen BDP führen. Vielleicht entscheidet das Autotuning, dass etwas nicht stimmt und nicht weit genug geht.

janneb
quelle
Abhängig von der Kernel-Version habe ich gesehen, dass die automatische Optimierung weit über 20 MB hinausgeht.
Pfo
Sieht so aus, als wäre dies zu psc.edu/index.php/networking/641-tcp-tune
dland
0

Versuchen Sie, die Größe des iperf-Fensters so einzustellen, dass das Bandbreitenverzögerungsprodukt dieser Verbindung wirklich verändert wird. Also durchschn. RTT * 1 Gbit / s sollte ungefähr 10 MB ergeben. Sehen Sie, ob das die Dinge verbessert.

pfo
quelle
0

Der einzige Weg, um wirklich zu verstehen, was vor sich geht, besteht darin, mehr Daten zu erhalten - ansonsten raten Sie nur oder bitten andere Leute, zu raten. Ich empfehle, eine Ansicht auf Systemebene (CPU, Speicher, Interrupts usw.) saraus dem iostatPaket zu erhalten. Außerdem sollten Sie einen Paketspeicherauszug mit Wireshark oder tcpdump erhalten. Sie können dann Wireshark verwenden, um es zu analysieren, da es viele Tools dafür hat. Sie können die Fenstergröße über die Zeit, den Paketverlust usw. grafisch darstellen.

Selbst ein kleiner Paketverlust auf einer Verbindung mit hoher Latenz kann die Bandbreite erheblich beeinträchtigen. Obwohl simuliert - das ist ein bisschen seltsam. Viele kleine Pakete können auch hohe Interrupts verursachen (obwohl diese auch simuliert werden können?).

Kurz gesagt, lassen Sie TCPDump und Sar sehen, was auf Paketebene und mit Ihren Systemressourcen vor sich geht.

Kyle Brandt
quelle
0

Wie viel Speicher hat diese Maschine? Die tcp_memEinstellungen scheinen verrückt zu sein, es wurden 28 GB (7061504 * 4 KB) für TCP-Daten weltweit konfiguriert. (Dies ist jedoch nicht Ihr Perf-Problem, da Sie diese Grenze bei einem Testlauf mit wenigen Sockets höchstwahrscheinlich nicht erreichen. Ich wollte es nur erwähnen, da das Setzen von tcp_mem auf tcp_xmem-Werte ein sehr häufiges Missverständnis aufweist.)

Die 7 MB, die Sie für die Standardeinstellung konfiguriert haben, scheinen in Ordnung zu sein. Das Maximum kann jedoch bei Rohren mit großer Verzögerung viel höher sein. Zum Testen würde ich 64 MB als maximale Anzahl für tcp_wmemund verwenden tcp_rmem, dann können Sie ausschließen, dass dies Ihr begrenzender Faktor ist. (Dies bläht Ihre Puffer auf, sodass es nur funktioniert, wenn Sie nur eine begrenzte Parallelität haben und die Verbindung wenig Jitter und Drops aufweist.)

eckes
quelle