Szenario: Wir haben eine Reihe von Windows-Clients, die regelmäßig große Dateien (FTP / SVN / HTTP PUT / SCP) auf Linux-Server hochladen, die ca. 100-160 ms entfernt sind. Wir haben eine synchrone Bandbreite von 1 Gbit / s im Büro und die Server sind entweder AWS-Instanzen oder werden physisch in US-DCs gehostet.
Der erste Bericht war, dass Uploads auf eine neue Serverinstanz viel langsamer waren, als sie sein konnten. Dies hat sich in Tests und an verschiedenen Orten bestätigt. Clients sahen stabile 2-5 Mbit / s für den Host von ihren Windows-Systemen aus.
Ich bin iperf -s
auf einer AWS-Instanz und dann auf einem Windows- Client im Büro ausgebrochen :
iperf -c 1.2.3.4
[ 5] local 10.169.40.14 port 5001 connected with 1.2.3.4 port 55185
[ 5] 0.0-10.0 sec 6.55 MBytes 5.48 Mbits/sec
iperf -w1M -c 1.2.3.4
[ 4] local 10.169.40.14 port 5001 connected with 1.2.3.4 port 55239
[ 4] 0.0-18.3 sec 196 MBytes 89.6 Mbits/sec
Die letztgenannte Zahl kann bei nachfolgenden Tests (Vagaries of AWS) erheblich variieren, liegt jedoch normalerweise zwischen 70 und 130 Mbit / s, was für unsere Anforderungen mehr als ausreichend ist. Während der Sitzung sehe ich:
iperf -c
Windows SYN - Windows 64 KB, Maßstab 1 - Linux SYN, ACK: Windows 14 KB, Maßstab 9 (* 512)iperf -c -w1M
Windows SYN - Windows 64 KB, Maßstab 1 - Linux SYN, ACK: Windows 14 KB, Maßstab 9
Natürlich kann der Link diesen hohen Durchsatz aufrechterhalten, aber ich muss die Fenstergröße explizit festlegen, um ihn zu nutzen, was bei den meisten realen Anwendungen nicht möglich ist. Die TCP-Handshakes verwenden jeweils die gleichen Startpunkte, der erzwungene skaliert jedoch
Umgekehrt iperf -c
gibt mir ein Straight von einem Linux-Client im selben Netzwerk (unter Verwendung der Systemstandardeinstellung 85 KB) Folgendes:
[ 5] local 10.169.40.14 port 5001 connected with 1.2.3.4 port 33263
[ 5] 0.0-10.8 sec 142 MBytes 110 Mbits/sec
Ohne Kraftaufwand skaliert es wie erwartet. Dies kann nicht an den dazwischenliegenden Hops oder unseren lokalen Switches / Routern liegen und scheint Windows 7- und Windows 8-Clients gleichermaßen zu betreffen. Ich habe viele Anleitungen zur automatischen Optimierung gelesen, in denen es jedoch in der Regel darum geht, die Skalierung insgesamt zu deaktivieren, um schlechtes Heimnetzwerk-Kit zu umgehen.
Kann mir jemand sagen, was hier passiert und wie ich es beheben kann? (Am liebsten kann ich mich über ein Gruppenrichtlinienobjekt an die Registrierung halten.)
Anmerkungen
Auf die betreffende AWS Linux-Instanz werden die folgenden Kernel-Einstellungen angewendet sysctl.conf
:
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 1048576
net.core.wmem_default = 1048576
net.ipv4.tcp_rmem = 4096 1048576 16777216
net.ipv4.tcp_wmem = 4096 1048576 16777216
Ich habe die dd if=/dev/zero | nc
Umleitung /dev/null
auf das Serverende verwendet, iperf
um andere mögliche Engpässe auszuschließen und zu beseitigen, aber die Ergebnisse sind ähnlich. Tests mit ncftp
(Cygwin, Native Windows, Linux) lassen sich auf die gleiche Weise skalieren wie die obigen iperf-Tests auf den jeweiligen Plattformen.
Bearbeiten
Ich habe hier eine weitere konsistente Sache entdeckt, die relevant sein könnte:
Dies ist die erste Sekunde der 1-MB-Aufnahme, die vergrößert wird. Sie können Slow Start in Aktion sehen, wenn das Fenster vergrößert wird und der Puffer größer wird. Es gibt dann dieses winzige Plateau von ~ 0,2 s genau an dem Punkt, an dem der Standardfenster-Iperf-Test für immer abflacht. Dieser skaliert natürlich zu viel schwindligeren Höhen, aber es ist merkwürdig, dass die Skalierung eine Pause enthält (Werte sind 1022 Byte * 512 = 523264), bevor dies geschieht.
Update - 30. Juni.
Verfolgung der verschiedenen Antworten:
- CTCP aktivieren - Das macht keinen Unterschied. Die Fensterskalierung ist identisch. (Wenn ich das richtig verstehe, erhöht diese Einstellung die Rate, mit der das Überlastungsfenster vergrößert wird, anstatt die maximale Größe, die es erreichen kann.)
- Aktivieren von TCP-Zeitstempeln. - Auch hier keine Änderung.
- Nagles Algorithmus - Das macht Sinn und bedeutet zumindest, dass ich diese bestimmten Punkte in der Grafik als Hinweis auf das Problem ignorieren kann.
- PCAP - Dateien: Zip - Datei finden Sie hier: https://www.dropbox.com/s/104qdysmk01lnf6/iperf-pcaps-10s-Win%2BLinux-2014-06-30.zip (Anonymisierte mit bittwiste, Extrakte auf ~ 150MB wie es eine von jedem OS-Client zum Vergleich)
Update 2 - 30. Juni
O, also, nachdem ich Kyle vorgeschlagen habe, habe ich das Abladen von Schornsteinen über das TCP-Protokoll aktiviert und deaktiviert: TCP Global Parameters
----------------------------------------------
Receive-Side Scaling State : enabled
Chimney Offload State : disabled
NetDMA State : enabled
Direct Cache Acess (DCA) : disabled
Receive Window Auto-Tuning Level : normal
Add-On Congestion Control Provider : ctcp
ECN Capability : disabled
RFC 1323 Timestamps : enabled
Initial RTO : 3000
Non Sack Rtt Resiliency : disabled
Aber leider keine Änderung des Durchsatzes.
Ich habe hier jedoch eine Ursache / Wirkung-Frage: Die Diagramme beziehen sich auf den RWIN-Wert, der in den ACKs des Servers für den Client festgelegt ist. Habe ich bei Windows-Clients Recht, wenn ich denke, dass Linux diesen Wert nicht über diesen Tiefpunkt hinaus skaliert, weil die begrenzte CWIN des Clients verhindert, dass selbst dieser Puffer gefüllt wird? Könnte es einen anderen Grund dafür geben, dass Linux den RWIN künstlich einschränkt?
Hinweis: Ich habe zum Teufel versucht, ECN einzuschalten. aber da ist keine Veränderung.
Update 3 - 31. Juni.
Keine Änderung nach Deaktivierung der Heuristik und des RWIN-Autotunings. Die Intel-Netzwerktreiber wurden mit einer Software auf den neuesten Stand (12.10.28.0) gebracht, mit der die Funktionen der Viadevice-Manager-Registerkarten optimiert werden. Bei der Karte handelt es sich um eine integrierte Netzwerkkarte mit 82579V-Chipsatz. (Ich werde weitere Tests von Kunden mit Realtek oder anderen Anbietern durchführen.)
Ich habe mich für einen Moment auf die Netzwerkkarte konzentriert und Folgendes versucht (meistens nur, um unwahrscheinliche Schuldige auszuschließen):
- Erhöhen Sie die Empfangspuffer von 256 auf 2 KB und die Sendepuffer von 512 auf 2 KB (beide jetzt maximal) - Keine Änderung
- Alle IP / TCP / UDP-Prüfsummenverschiebungen wurden deaktiviert. - Keine Änderung.
- Deaktivierte Large Send Offload - Nada.
- IPv6, QoS-Planung deaktiviert - Nowt.
Update 3 - 3. Juli
Um die Linux-Serverseite zu beseitigen, habe ich eine Server 2012R2-Instanz gestartet und die Tests mit iperf
(cygwin binary) und NTttcp wiederholt .
Bei iperf
musste ich -w1m
auf beiden Seiten explizit angeben, bevor die Verbindung über ~ 5Mbit / s skalieren würde. (Ich könnte übrigens überprüft werden und die BDP von ~ 5Mbit bei 91ms Latenz beträgt fast genau 64kb. Finde das Limit ...)
Die ntttcp-Binärdateien zeigten nun eine solche Einschränkung. Wenn ich ntttcpr -m 1,0,1.2.3.5
auf dem Server und ntttcp -s -m 1,0,1.2.3.5 -t 10
auf dem Client arbeite, sehe ich einen viel besseren Durchsatz:
Copyright Version 5.28
Network activity progressing...
Thread Time(s) Throughput(KB/s) Avg B / Compl
====== ======= ================ =============
0 9.990 8155.355 65536.000
##### Totals: #####
Bytes(MEG) realtime(s) Avg Frame Size Throughput(MB/s)
================ =========== ============== ================
79.562500 10.001 1442.556 7.955
Throughput(Buffers/s) Cycles/Byte Buffers
===================== =========== =============
127.287 308.256 1273.000
DPCs(count/s) Pkts(num/DPC) Intr(count/s) Pkts(num/intr)
============= ============= =============== ==============
1868.713 0.785 9336.366 0.157
Packets Sent Packets Received Retransmits Errors Avg. CPU %
============ ================ =========== ====== ==========
57833 14664 0 0 9.476
8MB / s bringt es auf die Level, die ich mit explizit großen Fenstern in bekommen habe iperf
. Seltsamerweise sind 80 MB in 1273 Puffern wieder ein 64-kB-Puffer. Ein weiterer Wireshark zeigt eine gute, variable RWIN, die vom Server zurückkommt (Skalierungsfaktor 256) und die der Client zu erfüllen scheint. Vielleicht meldet ntttcp das Sendefenster falsch.
Update 4 - 3. Juli
Auf Anfrage von @ karyhead habe ich weitere Tests durchgeführt und ein paar weitere Captures generiert, hier: https://www.dropbox.com/s/dtlvy1vi46x75it/iperf%2Bntttcp%2Bftp-pcaps-2014-07-03.zip
- Zwei weitere
iperf
s, beide von Windows zu demselben Linux-Server wie zuvor (1.2.3.4): Einer mit einer Socket-Größe von 128 KB und einem Standardfenster von 64 KB (wieder auf ~ 5 MBit / s beschränkt) und einer mit einem Sendefenster von 1 MB und einem Standard-Socket von 8 KBit / s Größe. (skaliert höher) - Eine
ntttcp
Ablaufverfolgung von demselben Windows-Client zu einer Server 2012R2 EC2-Instanz (1.2.3.5). hier lässt sich der durchsatz gut skalieren. Hinweis: NTttcp führt an Port 6001 etwas Ungewöhnliches aus, bevor die Testverbindung geöffnet wird. Ich bin nicht sicher, was dort passiert. - Ein FTP-Datentrace,
/dev/urandom
bei dem mit Cygwin 20 MB auf einen nahezu identischen Linux-Host (1.2.3.6) hochgeladen werdenncftp
. Wieder ist die Grenze da. Das Muster ist mit Windows Filezilla ähnlich.
Durch Ändern der iperf
Pufferlänge wird zwar der erwartete Unterschied zum Zeitablaufdiagramm (viel mehr vertikale Abschnitte) erzielt, der tatsächliche Durchsatz bleibt jedoch unverändert.
netsh int tcp set global timestamps=enabled