Mam serwer z połączeniem 10GbE do przełącznika i 10 klientów, każdy z połączeniem 1GbE do tego samego przełącznika.
Uruchamiając nuttcp równolegle na każdym kliencie, mogę przesyłać jednocześnie 10 strumieni TCP danych do serwera z prędkością zbliżoną do prędkości drutu (tj. Po prostu 100 megabajtów na sekundę dla wszystkich 10 klientów jednocześnie).
Jednak gdy odwracam kierunek i wysyłam dane z serwera do klientów - tj. 10 strumieni TCP, jeden do każdego klienta - retransmisje TCP gwałtownie rosną, a wydajność spada do 30, 20, a nawet 10 megabajtów na sekundę na klienta. Chcę zwiększyć te liczby, ponieważ ten wzorzec ruchu jest reprezentatywny dla niektórych aplikacji, na których mi zależy.
Sprawdziłem, czy mój serwer jest w stanie nasycić łącze 10GbE, wykonując ten sam eksperyment na połączeniu 10GbE z podobnym serwerem. Sprawdziłem, czy nie ma błędów na żadnym z moich portów.
Wreszcie, kiedy siłą zamykam (ograniczam) rozmiar okna TCP odbiornika, mogę uzyskać nieco większą przepustowość (30-40 megabajtów / sek); a jeśli ustawię go bardzo nisko, mogę wyzerować retransmisje (z absurdalnie niską przepustowością).
Dlatego jestem dość pewny, że przekraczam bufory mojego przełącznika, co powoduje utratę pakietów z powodu przeciążenia. Myślałem jednak, że kontrola przeciążenia TCP powinna sobie z tym poradzić, ostatecznie stabilizując się na poziomie powyżej 50% prędkości drutu.
Moje pierwsze pytanie jest więc bardzo proste: który algorytm kontroli przeciążenia TCP byłby najlepszy w mojej sytuacji? Dostępnych jest ich mnóstwo, ale w większości wydają się być ukierunkowane na sieci stratne, sieci o dużych opóźnieniach lub sieciach bezprzewodowych ... Żadne z nich nie dotyczy mojej sytuacji.
Drugie pytanie: czy jest coś jeszcze, co mogę spróbować?
źródło
Odpowiedzi:
Potrzebujesz algorytmu, w którym rozmiar okna nie jest drastycznie zmniejszony, gdy występuje spadek pakietu. Jest to drastyczny spadek wielkości okna, który powoduje nagły spadek przepustowości w ruchu TCP.
Jeśli przełącznik i serwer obsługują kontrolę przepływu, spróbuj włączyć kontrolę przepływu. To, jak dobrze to działa, zależy prawie całkowicie od krzemu i oprogramowania układowego Switcha. Zasadniczo przełącznik wykryje przeciążenie wyjścia na porcie podłączonym do klienta, określi, skąd pochodzą pakiety, i wyśle ramki kontroli przepływu z portu wejściowego (tj. Z powrotem na serwer). Jeśli serwer rozumie ramki kontroli przepływu, zmniejszy prędkość transmisji. Jeśli wszystko działa dobrze, uzyskasz optymalną przepustowość przy praktycznie zerowych spadkach pakietów występujących w buforze wyjściowym przełącznika.
źródło