RTO'yu özellikle değiştirememenizin nedeni, statik bir değer olmamasıdır. Bunun yerine (ilk SYN hariç, doğal olarak) her bağlantı için RTT'ye (Gidiş Dönüş Süresi) dayanır. Aslında, RTT'nin düzeltilmiş bir versiyonuna ve karışıma atılan bazı sabitlerle RTT varyansına dayanmaktadır. Bu nedenle, her TCP bağlantısı için dinamik, hesaplanmış bir değerdir ve genel olarak hesaplama ve RTO hakkında daha ayrıntılı olan bu makaleyi tavsiye ederim .
Ayrıca ilgili olan RFC 6298 (diğer birçok şey arasında):
RTO hesaplandığında, 1 saniyeden azsa, RTO 1 saniyeye yuvarlanmalıdır.
Çekirdek RTO'yu her zaman 1 saniyeye ayarlıyor mu? Linux ile açık bağlantılarınız için geçerli RTO değerlerini şu ss -i
komutu çalıştırarak gösterebilirsiniz :
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 10.0.2.15:52861 216.58.219.46:http
cubic rto:204 rtt:4/2 cwnd:10 send 29.2Mbps rcv_space:14600
ESTAB 0 0 10.0.2.15:ssh 10.0.2.2:52586
cubic rto:201 rtt:1.5/0.75 ato:40 cwnd:10 send 77.9Mbps rcv_space:14600
ESTAB 0 0 10.0.2.15:52864 216.58.219.46:http
cubic rto:204 rtt:4.5/4.5 cwnd:10 send 26.0Mbps rcv_space:14600
Yukarıdaki, SSH ile giriş yaptığım ve google.com'a açık birkaç bağlantıya sahip bir VM'den çıktı. Gördüğünüz gibi, RTO aslında 200-ish (milisaniye) olarak ayarlanmıştır. Bunun RFC'den 1 saniye değerine yuvarlanmadığını ve bunun biraz yüksek olduğunu düşünebilirsiniz. Bunun nedeni, Linux için RTO söz konusu olduğunda oyunda minimum (200 milisaniye) ve maksimum (120 saniye) sınırların bulunmasıdır (bunun, yukarıda bağladığım makalede bunun büyük bir açıklaması vardır).
Bu nedenle, RTO değerini doğrudan değiştiremezsiniz, ancak kayıplı ağlar için (kablosuz gibi) F-RTO'yu değiştirmeyi deneyebilirsiniz (dağıtımınıza bağlı olarak zaten etkinleştirilebilir). Aslında F-RTO ile ilgili iki seçenek var ( burada iyi bir özet ):
net.ipv4.tcp_frto
net.ipv4.tcp_frto_response
Neyi optimize etmeye çalıştığınıza bağlı olarak, bunlar yararlı olabilir veya olmayabilir.
EDIT: yorumlardan TCP rto_min / max değerleri tweak yeteneği takip.
TCP için küresel minimum RTO'yu değiştiremezsiniz (bir yana, SCTP için yapabilirsiniz - sysctl'de olanlar), ancak iyi haber, RTO'nun minimum değerini her rotada değiştirebileceğinizdir. temeli. İşte CentOS VM'imdeki yönlendirme tablom:
ip route
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15
169.254.0.0/16 dev eth0 scope link metric 1002
default via 10.0.2.2 dev eth0
Varsayılan rotadaki rto_min değerini aşağıdaki gibi değiştirebilirim:
ip route change default via 10.0.2.2 dev eth0 rto_min 5ms
Ve şimdi, yönlendirme tablom şöyle görünüyor:
ip route
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15
169.254.0.0/16 dev eth0 scope link metric 1002
default via 10.0.2.2 dev eth0 rto_min lock 5ms
Son olarak, bir bağlantı başlatalım ve buna ss -i
uyulup uyulmadığını kontrol edelim :
ss -i
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 10.0.2.15:ssh 10.0.2.2:50714
cubic rto:201 rtt:1.5/0.75 ato:40 cwnd:10 send 77.9Mbps rcv_space:14600
ESTAB 0 0 10.0.2.15:39042 216.58.216.14:http
cubic rto:15 rtt:5/2.5 cwnd:10 send 23.4Mbps rcv_space:14600
Başarı! HTTP bağlantısındaki rto (değişiklikten sonra) 15ms iken, SSH bağlantısı (değişiklikten önce) önceki gibi 200+'dir.
Aslında bu yaklaşımı seviyorum - diğer trafiği azaltabileceği küresel değil, uygun güzergahlarda daha düşük bir değer ayarlamanıza izin veriyor. Benzer şekilde ( ip man sayfasına bakın ) rota için ilk rtt tahminini ve başlangıç rttvarını değiştirebilirsiniz (dinamik RTO hesaplanırken kullanılır). Tweaking açısından tam bir çözüm olmasa da, önemli parçaların çoğunun orada olduğunu düşünüyorum. Maks ayarını değiştiremezsiniz, ancak bunun her durumda genellikle yararlı olmayacağını düşünüyorum.