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ć?