Scenariusz: Mamy wielu klientów Windows regularnie przesyłających duże pliki (FTP / SVN / HTTP PUT / SCP) na serwery Linux, które są w odległości ~ 100-160 ms. W biurze mamy synchroniczną przepustowość 1 Gb / s, a serwery są instancjami AWS lub fizycznie hostowane w DC w USA.
Początkowy raport był taki, że przesyłanie do nowej instancji serwera było znacznie wolniejsze niż mogłoby być. Znosiło to w testach i z wielu lokalizacji; klienci widzieli stabilne 2-5 Mb / s na hoście z systemów Windows.
Zerwałem się iperf -s
na wystąpieniu AWS, a następnie z klienta Windows w biurze:
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
Ta ostatnia liczba może się znacznie różnić w kolejnych testach (Vagaries of AWS), ale zwykle wynosi od 70 do 130 Mb / s, co jest więcej niż wystarczające dla naszych potrzeb. Wiresharking sesji, widzę:
iperf -c
Windows SYN - Windows 64kb, Skala 1 - Linux SYN, ACK: Windows 14kb, Skala: 9 (* 512)iperf -c -w1M
Windows SYN - Windows 64kb, Skala 1 - Linux SYN, ACK: Windows 14kb, Skala: 9
Oczywiście łącze może wytrzymać tak wysoką przepustowość, ale muszę dokładnie ustawić rozmiar okna, aby z niego skorzystać, czego większość aplikacji na świecie nie pozwala mi na to. Uściski dłoni TCP używają tych samych punktów początkowych w każdym przypadku, ale wymuszony skaluje się
I odwrotnie, z klienta Linux w tej samej sieci prosta iperf -c
(używając domyślnego systemu 85kb) daje mi:
[ 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
Bez użycia siły skaluje się zgodnie z oczekiwaniami. Nie może to być coś w pośrednich przeskokach ani w naszych lokalnych przełącznikach / routerach i wydaje się mieć wpływ na klientów Windows 7 i 8. Przeczytałem wiele przewodników na temat automatycznego dostrajania, ale zazwyczaj dotyczą one całkowitego wyłączenia skalowania, aby obejść zły zestaw sieci domowej.
Czy ktoś może mi powiedzieć, co się tutaj dzieje i dać mi sposób, aby to naprawić? (Najlepiej coś, co mogę trzymać w rejestrze przez GPO.)
Notatki
Instancja AWS Linux, o której mowa, ma następujące ustawienia jądra 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
Użyłem dd if=/dev/zero | nc
przekierowania /dev/null
na końcu serwera, aby wykluczyć iperf
i usunąć wszelkie inne możliwe wąskie gardła, ale wyniki są prawie takie same. Testy z ncftp
(Cygwin, Native Windows, Linux) są skalowane w podobny sposób, jak powyższe testy Iperf na ich platformach.
Edytować
Zauważyłem tutaj kolejną spójną rzecz, która może być istotna:
Jest to pierwsza sekunda powiększenia 1 MB, powiększenie. Możesz zobaczyć Slow Start w akcji, gdy okno skaluje się i bufor staje się większy. Jest wtedy ten niewielki plateau ~ 0.2s dokładnie w punkcie, w którym domyślny test iperf okna spłaszcza się na zawsze. Ten oczywiście skaluje się do znacznie bardziej zawrotnych wysokości, ale ciekawe, że jest taka przerwa w skalowaniu (wartości to 1022 bajtów * 512 = 523264), zanim to zrobi.
Aktualizacja - 30 czerwca.
W odpowiedzi na różne odpowiedzi:
- Włączanie CTCP - to nie robi różnicy; skalowanie okien jest identyczne. (Jeśli dobrze to rozumiem, to ustawienie zwiększa szybkość powiększania okna przeciążenia, a nie maksymalny rozmiar, jaki może osiągnąć)
- Włączanie znaczników czasu TCP. - Tu też nie ma zmian.
- Algorytm Nagle'a - to ma sens i przynajmniej oznacza, że prawdopodobnie mogę zignorować te konkretne blipy na wykresie jako jakiekolwiek oznaki problemu.
- Pliki pcap: Plik zip dostępny tutaj: https://www.dropbox.com/s/104qdysmk01lnf6/iperf-pcaps-10s-Win%2BLinux-2014-06-30.zip (zanonimizowane za pomocą bittwiste, wyodrębnia do ~ 150 MB, ponieważ istnieje jeden z każdego klienta systemu operacyjnego do porównania)
Aktualizacja 2 - 30 czerwca
O, więc zgodnie z sugestią Kyle'a, włączyłem ctcp i wyłączyłem odciążanie komina: 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
Niestety, nie ma zmiany w przepustowości.
Mam tu jednak pytanie o przyczynę / skutek: wykresy dotyczą wartości RWIN ustawionej w zestawach ACK serwera dla klienta. Czy w przypadku klientów Windows mam rację, myśląc, że Linux nie skaluje tej wartości poza ten najniższy punkt, ponieważ ograniczony CWIN klienta uniemożliwia zapełnienie nawet tego bufora? Czy może istnieć inny powód, dla którego Linux sztucznie ogranicza RWIN?
Uwaga: próbowałem włączyć ECN do cholery; ale bez zmian.
Aktualizacja 3 - 31 czerwca.
Brak zmian po wyłączeniu heurystyki i autotuningu RWIN. Zaktualizowałem sterowniki sieciowe Intel do najnowszej wersji (12.10.28.0) o oprogramowanie, które ujawnia zakładki poprawiania funkcjonalności menedżerów viadevice. Karta to wbudowana karta sieciowa z chipsetem 82579 V - (zamierzam wykonać więcej testów od klientów z Realtek lub innymi dostawcami)
Koncentrując się na chwilę na karcie sieciowej, próbowałem następujących rzeczy (głównie po prostu wykluczając nieoczekiwanych winowajców):
- Zwiększyć bufory odbioru do 2k z 256 i przesłać bufory do 2k z 512 (oba teraz maksymalnie) - Bez zmian
- Wyłączono wszystkie odciążanie sumy kontrolnej IP / TCP / UDP. - Brak zmiany.
- Wyłączone duże wysyłanie odciążenia - Nada.
- Wyłączono planowanie IPv6, QoS - Nowt.
Aktualizacja 3 - 3 lipca
Próbując wyeliminować stronę serwera Linux, uruchomiłem instancję Server 2012R2 i powtórzyłem testy przy użyciu iperf
(cygwin binary) i NTttcp .
Z iperf
musiałem wyraźnie określić -w1m
po obu stronach, zanim połączenie będzie skalowane powyżej ~ 5 Mb / s. (Nawiasem mówiąc, mogłem zostać sprawdzony, a BDP ~ 5 Mb przy opóźnieniu 91 ms to prawie dokładnie 64 kb. Znajdź limit ...)
Pliki binarne ntttcp wykazały teraz takie ograniczenie. Używając ntttcpr -m 1,0,1.2.3.5
na serwerze i ntttcp -s -m 1,0,1.2.3.5 -t 10
kliencie, widzę znacznie lepszą przepustowość:
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 podnosi to na poziomach, które otrzymywałem z wyraźnie dużymi oknami iperf
. Dziwne jednak, że 80 MB w 1273 buforach = bufor 64kB ponownie. Kolejny wireshark pokazuje dobrą, zmienną RWIN wracającą z serwera (współczynnik skali 256), który wydaje się spełniać klient; więc być może ntttcp źle zgłasza okno wysyłania.
Aktualizacja 4 - 3 lipca
Na prośbę @ karyhead wykonałem jeszcze kilka testów i wygenerowałem kilka dodatkowych zdjęć, tutaj: https://www.dropbox.com/s/dtlvy1vi46x75it/iperf%2Bntttcp%2Bftp-pcaps-2014-07-03.zip
- Dwa kolejne
iperf
s, oba z systemu Windows na ten sam serwer Linux jak poprzednio (1.2.3.4): Jeden z gniazdem o wielkości 128 kb i domyślnym oknem 64 k (ponownie ogranicza się do ~ 5 Mb / s), a drugi z oknem wysyłania 1 MB i domyślnym gniazdem 8 kb rozmiar. (skaluje się wyżej) - Jeden
ntttcp
ślad z tego samego klienta Windows do wystąpienia Server 2012R2 EC2 (1.2.3.5). tutaj przepustowość dobrze się skaluje. Uwaga: NTttcp robi coś dziwnego na porcie 6001, zanim otworzy połączenie testowe. Nie jestem pewien, co się tam dzieje. - Jeden ślad danych FTP, przesyłanie 20 MB
/dev/urandom
do prawie identycznego hosta Linux (1.2.3.6) przy użyciu Cygwinncftp
. Znowu jest limit. Wzór jest taki sam w przypadku Windows Filezilla.
Zmiana iperf
długości bufora robi oczekiwaną różnicę w wykresie sekwencji czasowej (znacznie więcej pionowych odcinków), ale faktyczna przepustowość pozostaje niezmieniona.
netsh int tcp set global timestamps=enabled