Ich versuche, meinen TCP-Durchsatz über ein "Netzwerk mit hoher Verzögerung" zwischen Linux-Computern zu verbessern.
Ich habe tcp_mem
, tcp_wmem
und tcp_rmem
auf „8192 7061504 7061504“.
Ich habe rmem_max
, wmem_max
, rmem_default
und wmem_default
auf „7061504“.
Ich setze netdev_max_backlog
und txqueuelen
auf 10000.
Ich setze tcp_congestion_control
auf "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.)
Antworten:
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.
quelle
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.
quelle
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.
quelle
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.)
sar
aus demiostat
Paket 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.
quelle
Wie viel Speicher hat diese Maschine? Die
tcp_mem
Einstellungen 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_wmem
und verwendentcp_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.)quelle