Linux'ta TCP RTO değerini değiştirme


12

Bir bağlantı için TCP RTO (yeniden iletim zaman aşımı) değerini değiştirmek istiyorum ve yaptığım bazı okuma ben bunu yapabilir, ancak nerede ve nasıl değiştirileceğini ortaya koymaz gösterir.

/proc/sys/net/ipv4Değişkenlere baktım , ancak değişkenlerin hiçbiri RTO ile ilgili değil. Birisi bana bu değeri nasıl değiştirebileceğimi söylese çok sevinirim.


Bu benim için işe yaramıyor. En azından rto zamanı ile 'ms' dahil olmak bana bir hata veriyor! Komutu çalýţtým, ama ss -i aksini söylüyor. Ayrıca, 2 sistem vars mevcut değildir. 4.4 çekirdeğe koşuyorum
Mark Seger

Daha yeni bir dağıtımda denedim ve ip route replacebunun yerine başarılı oldum - ip routesözdizimi biraz değişti gibi görünüyor . Ancak değişikliği başarıyla yapabildim. Sadece not etmek gerekirse, bana ping atmak istiyorsanız soruyu değil, cevabı yorumlamalısınız - Temelde bunu kazara gördüm, son zamanlarda saf şans :)
Adam C

Yanıtlar:


30

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 -ikomutu ç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 -iuyulup 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.


Açıklama için @Adam C'ye teşekkürler, ama min (200 mili) ve max (120 sn) 'den bahsettiniz, bunlardan herhangi birini değiştirebilir miyim (min veya maks)? evet ise, nasıl? ...
obiigbe91

Ben kod sabitleri olduğuna inanıyorum, ve onları dinamik olarak ayarlamak için bir yol farkında değilim ama biraz kazmak ve kodu değiştirmek ve kendi çekirdek derleme biraz fazla olduğunu varsayalım görmek biraz :)
Adam C

Rto_min nasıl tweak anladım ve cevap ve diğer ilgili birkaç şey cevap ekledi :)
Adam C

Neden böyle bir şey yok rto_max? Küresel bir maksimum zaman aşımı süresini nasıl belirleriz?
est

Minimum değeri ayarlarsanız (veya varsayılanı kabul ederseniz) ve ardından izin verilen yeniden deneme sayısını ( net.ipv4.tcp_retries1ve / net.ipv4.tcp_retries2veya benzer IIRC'yi) değiştirirseniz, RTO maksimum değerine eşit bir değer elde edebileceğinizi düşünüyorum.
Adam C
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.