Scenario: abbiamo un certo numero di client Windows che caricano regolarmente file di grandi dimensioni (FTP / SVN / HTTP PUT / SCP) su server Linux che distano ~ 100-160 ms. Abbiamo una larghezza di banda sincrona di 1 Gbit / s in ufficio e i server sono istanze AWS o ospitati fisicamente in DC statunitensi.
Il rapporto iniziale era che i caricamenti su una nuova istanza del server erano molto più lenti di quanto potessero essere. Ciò si è sviluppato durante i test e da più posizioni; i client vedevano stabili 2-5 Mbit / s sull'host dai loro sistemi Windows.
Sono uscito iperf -s
su un'istanza AWS e poi da un client Windows in ufficio:
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
Quest'ultima cifra può variare in modo significativo nei test successivi (Vagaries of AWS) ma di solito è compresa tra 70 e 130 Mbit / s, il che è più che sufficiente per le nostre esigenze. Wiresharking la sessione, posso vedere:
iperf -c
Windows SYN - Window 64kb, Scala 1 - Linux SYN, ACK: Window 14kb, Scala: 9 (* 512)iperf -c -w1M
Windows SYN - Windows 64kb, Scala 1 - Linux SYN, ACK: Finestra 14kb, Scala: 9
Chiaramente il collegamento può sostenere questo elevato throughput, ma devo esplicitamente impostare le dimensioni della finestra per farne uso, cosa che la maggior parte delle applicazioni del mondo reale non mi consente di fare. Gli handshake TCP usano gli stessi punti di partenza in ogni caso, ma quello forzato si ridimensiona
Viceversa, da un client Linux sulla stessa rete un diritto iperf -c
(usando il 85kb predefinito di sistema) mi dà:
[ 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
Senza forzature, si ridimensiona come previsto. Questo non può essere qualcosa negli hop intermedi o nei nostri switch / router locali e sembra influenzare allo stesso modo i client Windows 7 e 8. Ho letto molte guide sull'auto-tuning, ma in genere riguardano la disabilitazione del ridimensionamento per aggirare il terribile kit di reti domestiche.
Qualcuno può dirmi cosa sta succedendo qui e darmi un modo per risolverlo? (Preferibilmente qualcosa su cui posso aderire al registro tramite GPO.)
Appunti
L'istanza AWS Linux in questione ha le seguenti impostazioni del kernel applicate in 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
Ho usato il dd if=/dev/zero | nc
reindirizzamento a /dev/null
fine server per escludere iperf
e rimuovere eventuali altri colli di bottiglia, ma i risultati sono più o meno gli stessi. I test con ncftp
(Cygwin, Native Windows, Linux) si adattano più o meno allo stesso modo dei precedenti test iperf sulle rispettive piattaforme.
modificare
Ho notato un'altra cosa coerente qui che potrebbe essere rilevante:
Questo è il primo secondo dell'acquisizione da 1 MB, ingrandito. Puoi vedere l' Avvio lento in azione mentre la finestra si ingrandisce e il buffer si ingrandisce. C'è quindi questo piccolo altopiano di ~ 0,2s esattamente nel punto in cui il test iperf della finestra predefinito si appiattisce per sempre. Questo ovviamente scala ad altezze molto più vertiginose, ma è curioso che ci sia questa pausa nel ridimensionamento (i valori sono 1022 byte * 512 = 523264) prima di farlo.
Aggiornamento - 30 giugno.
Seguendo le varie risposte:
- Abilitazione CTCP - Questo non fa differenza; il ridimensionamento delle finestre è identico. (Se lo capisco correttamente, questa impostazione aumenta la velocità con cui la finestra di congestione viene ingrandita anziché la dimensione massima che può raggiungere)
- Abilitazione dei timestamp TCP. - Nessun cambiamento qui neanche.
- Algoritmo di Nagle - Questo ha senso e almeno significa che probabilmente posso ignorare quel particolare blip nel grafico come qualsiasi indicazione del problema.
- file pcap: file zip disponibile qui: https://www.dropbox.com/s/104qdysmk01lnf6/iperf-pcaps-10s-Win%2BLinux-2014-06-30.zip (reso anonimo con bittwiste, estratto da ~ 150 MB in quanto è presente uno per ciascun client OS per il confronto)
Aggiornamento 2 - 30 giugno
O, quindi a seguito dell'op su suggerimento di Kyle, ho abilitato ctcp e disabilitato lo scarico del camino: parametri globali TCP
----------------------------------------------
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
Ma purtroppo, nessun cambiamento nel throughput.
Qui ho una domanda causa / effetto: I grafici sono del valore RWIN impostato negli ACK del server al client. Con i client Windows, ho ragione nel pensare che Linux non ridimensiona questo valore oltre quel punto basso perché il CWIN limitato del client impedisce persino il riempimento di quel buffer? Potrebbe esserci qualche altra ragione per cui Linux sta limitando artificialmente RWIN?
Nota: ho provato ad attivare ECN per l'inferno; ma nessun cambiamento, lì.
Aggiornamento 3 - 31 giugno.
Nessuna modifica a seguito della disabilitazione dell'euristica e dell'autotuning RWIN. Hanno aggiornato i driver di rete Intel alla versione più recente (12.10.28.0) con un software che espone le modifiche delle funzionalità tramite le schede del gestore dispositivi. La scheda è una scheda di rete integrata a chipset da 82579 V - (farò altri test da parte di clienti con realtek o altri fornitori)
Concentrandomi sulla scheda di rete per un momento, ho provato quanto segue (principalmente escludendo improbabili colpevoli):
- Aumenta i buffer di ricezione a 2k da 256 e trasmetti i buffer a 2k da 512 (entrambi ora al massimo) - Nessuna modifica
- Disabilitato tutto l'offload del checksum IP / TCP / UDP. - Nessun cambiamento.
- Offload invio grande disabilitato - Nada.
- Disattivato IPv6, programmazione QoS - Nowt.
Aggiornamento 3 - 3 luglio
Nel tentativo di eliminare il lato server Linux, ho avviato un'istanza di Server 2012R2 e ripetuto i test utilizzando iperf
(cygwin binary) e NTttcp .
Con iperf
, ho dovuto specificare esplicitamente -w1m
su entrambi i lati prima che la connessione si ridimensionasse oltre ~ 5Mbit / s. (Per inciso, potrei essere controllato e il BDP di ~ 5Mbit a 91ms di latenza è quasi esattamente 64kb. Trova il limite ...)
I binari ntttcp hanno mostrato ora tale limitazione. Usando ntttcpr -m 1,0,1.2.3.5
sul server e ntttcp -s -m 1,0,1.2.3.5 -t 10
sul client, posso vedere un throughput molto migliore:
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
8 MB / s lo mette ai livelli che stavo ottenendo con finestre esplicitamente grandi in iperf
. Stranamente, tuttavia, 80 MB in buffer 1273 = di nuovo un buffer da 64 kB. Un ulteriore wirehark mostra un RWIN buono e variabile che ritorna dal server (fattore di scala 256) che il client sembra soddisfare; quindi forse ntttcp sta segnalando erroneamente la finestra di invio.
Aggiornamento 4 - 3 luglio
Su richiesta di @ karyhead, ho fatto qualche altro test e generato altre acquisizioni, qui: https://www.dropbox.com/s/dtlvy1vi46x75it/iperf%2Bntttcp%2Bftp-pcaps-2014-07-03.zip
- Altri due
iperf
s, entrambi da Windows allo stesso server Linux di prima (1.2.3.4): uno con una dimensione socket 128k e una finestra predefinita 64k (limitata a ~ 5Mbit / s di nuovo) e uno con una finestra di invio 1MB e socket predefinito 8kb taglia. (scala superiore) - Una
ntttcp
traccia dallo stesso client Windows a un'istanza Server 2012R2 EC2 (1.2.3.5). qui, il throughput si ridimensiona bene. Nota: NTttcp fa qualcosa di strano sulla porta 6001 prima di aprire la connessione di prova. Non sono sicuro di cosa stia succedendo lì. - Una traccia di dati FTP, caricando 20 MB su
/dev/urandom
un host Linux quasi identico (1.2.3.6) usando Cygwinncftp
. Ancora una volta il limite è lì. Il modello è più o meno lo stesso con Windows Filezilla.
La modifica della iperf
lunghezza del buffer fa la differenza prevista per il grafico della sequenza temporale (molte più sezioni verticali), ma la velocità effettiva rimane invariata.
netsh int tcp set global timestamps=enabled