web-dev-qa-db-ja.com

LinuxでTCP RTO値を変更する

接続のTCP RTO (retransmission timeout) 値を変更したいのですが、これまでに読んだいくつかの方法でこれを実行できることを示唆していますが、どこにあるかはわかりませんそしてそれを変更する方法。

/proc/sys/net/ipv4変数を確認しましたが、RTOに関連する変数はありません。誰かがこの値を変更する方法を教えてもらえれば幸いです。

12
obiigbe91

RTOを具体的に変更できないのは、それが静的な値ではないためです。代わりに(最初のSYNを除いて、当然)、各接続のRTT(往復時間)に基づいています。実際には、RTTの平滑化されたバージョンと、いくつかの定数が混合されたRTT分散に基づいています。したがって、これは各TCP接続の動的計算値であり、一般的に計算とRTOについて詳しく説明する この記事 を強くお勧めします。

また関連があります RFC 6298 (他の多くのものの中で)と述べています:

RTOが計算されるときは常に、それが1秒未満の場合、RTOは1秒に切り上げられる必要があります(SHOULD)。

カーネルは常にRTOを1秒に設定しますか? Linuxでは、ss -iコマンドを実行して、開いている接続の現在のRTO値を表示できます。

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

上記は、VMからの出力であり、SSHでログインしており、google.comにいくつかの接続が開いています。ご覧のとおり、RTOは実際には200に設定されています。 ish(ミリ秒)。これは、RFCの1秒の値に丸められないことに注意してください。また、少し高いと思うかもしれません。これは、最小(200ミリ秒)と最大(120秒)の境界が機能しているためですLinuxのRTOに関しては(上記でリンクした記事に、これに関するすばらしい説明があります)。

したがって、RTO値を直接変更することはできませんが、(ワイヤレスのような)損失の多いネットワークでは、微調整を試すことができます F-RTO (これはディストリビューションによっては既に有効になっている場合があります)。 F-RTOに関連する2つの関連オプションが実際にあり、調整できます(良い要約 ここ ):

net.ipv4.tcp_frto
net.ipv4.tcp_frto_response

最適化しようとしているものに応じて、これらが役立つ場合と役に立たない場合があります。

編集:TCPのrto_min/max値をコメントから微調整する機能のフォローアップ。

TCPのグローバル最小RTOを変更することはできません(余談ですが、SCTPでも変更できます-これらはsysctlで公開されています)。しかし、朗報は最小値を微調整できることです。ルートごとのRTOの値これは、私のCentOS VM上のルーティングテーブルです。

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値を次のように変更できます。

ip route change default via 10.0.2.2 dev eth0 rto_min 5ms

そして今、私のルーティングテーブルは次のようになります:

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

最後に、接続を開始し、ss -iをチェックして、これが尊重されているかどうかを確認します。

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

成功! HTTP接続(変更後)のrtoは15ミリ秒ですが、SSH接続(変更前)は以前と同様に200以上です。

私は実際にこのアプローチが好きです。他のトラフィックを圧迫する可能性があるグローバルな場所ではなく、適切なルートに低い値を設定できます。同様に( ip manページ を参照)、ルートの初期rtt見積もりと初期rttvar(動的RTOの計算時に使用)を微調整できます。微調整に関しては完全な解決策ではありませんが、重要な部分のほとんどはそこにあると思います。最大設定を微調整することはできませんが、どの場合でも一般的にはそれほど役に立ちません。

30
Adam C