Chcę zmienić wartość TCP RTO (limit czasu retransmisji) dla połączenia, a niektóre odczytane wyniki sugerują, że mógłbym to zrobić, ale nie ujawniają, gdzie i jak to zmienić.
Patrzyłem na /proc/sys/net/ipv4
zmienne, ale żadna ze zmiennych nie jest związana z RTO. Byłbym wdzięczny, gdyby ktoś mógł mi powiedzieć, jak zmienić tę wartość.
linux
linux-kernel
tcp
obiigbe91
źródło
źródło
ip route replace
- wydaje się, żeip route
składnia nieco się zmieniła. Udało mi się jednak dokonać modyfikacji. Dla przypomnienia, powinieneś skomentować odpowiedź, a nie pytanie, czy chcesz mnie pingować - Zasadniczo widziałem to przez przypadek, szczęście, że to było ostatnie :)Odpowiedzi:
Powodem, dla którego nie możesz zmienić RTO, jest to, że nie jest to wartość statyczna. Zamiast tego (oczywiście z wyjątkiem początkowej SYN), jest ona oparta na RTT (Round Trip Time) dla każdego połączenia. W rzeczywistości opiera się na wygładzonej wersji RTT i wariancji RTT z pewnymi stałymi wrzuconymi do miksu. Dlatego jest to dynamiczna, obliczona wartość dla każdego połączenia TCP i bardzo polecam ten artykuł, który szczegółowo omawia obliczenia i RTO.
Istotna jest również RFC 6298, która stwierdza (między innymi):
Czy wtedy jądro zawsze ustawia RTO na 1 sekundę? Cóż, w systemie Linux możesz wyświetlić bieżące wartości RTO dla otwartych połączeń, uruchamiając
ss -i
polecenie:Powyżej jest wyjście z maszyny wirtualnej, do której jestem zalogowany za pomocą SSH i ma kilka połączeń otwartych na google.com. Jak widać RTO jest ustawiony na 200-ish (milisekund). Zauważysz, że nie jest on zaokrąglany do 1 sekundy wartości z RFC, i możesz również pomyśleć, że jest trochę wysoki. To dlatego, że istnieją granice min (200 milisekund) i maksimum (120 sekund), jeśli chodzi o RTO dla Linuksa (jest to świetne wyjaśnienie w artykule, który podłączyłem powyżej).
Nie możesz więc bezpośrednio zmieniać wartości RTO, ale w przypadku sieci o dużej mocy (takich jak sieć bezprzewodowa) możesz spróbować ulepszyć F-RTO (może to być już włączone w zależności od dystrybucji). W rzeczywistości istnieją dwie powiązane opcje związane z F-RTO, które można dostosować (dobre podsumowanie tutaj ):
W zależności od tego, co próbujesz zoptymalizować, mogą one być przydatne lub nie.
EDYCJA: w następstwie możliwości dostosowania wartości rto_min / max dla TCP z komentarzy.
Nie możesz zmienić globalnego minimalnego RTO dla TCP (na marginesie, możesz to zrobić dla SCTP - są one widoczne w sysctl), ale dobrą wiadomością jest to, że możesz dostosować minimalną wartość RTO na trasie podstawa. Oto moja tabela routingu na mojej maszynie Wirtualnej CentOS:
Mogę zmienić wartość rto_min na domyślnej trasie w następujący sposób:
A teraz moja tabela routingu wygląda następująco:
Na koniec zainicjuj połączenie i sprawdź,
ss -i
czy zostało to przestrzegane:Sukces! Rto na połączeniu HTTP (po zmianie) wynosi 15ms, podczas gdy połączenie SSH (przed zmianą) wynosi 200+ jak poprzednio.
Naprawdę podoba mi się to podejście - pozwala ustawić niższą wartość na odpowiednich trasach, a nie globalnie, gdzie może to zepsuć inny ruch. Podobnie (patrz strona podręcznika użytkownika ip ) możesz dostosować początkową wartość szacunkową rtt i początkową wartość rttvar dla trasy (używaną przy obliczaniu dynamicznego RTO). Chociaż nie jest to kompletne rozwiązanie w zakresie poprawiania, myślę, że większość ważnych elementów jest tam. Nie możesz zmienić maksymalnego ustawienia, ale myślę, że w ogóle nie będzie to tak przydatne.
źródło
rto_max
? Jak ustawić globalny maksymalny limit czasu?net.ipv4.tcp_retries1
inet.ipv4.tcp_retries2
podobnych IIRC), myślę, że możesz uzyskać równowartość maksimum RTO.