LinuxでのTCP RTO値の変更


12

接続のTCP RTO (再送信タイムアウト)値を変更したいのですが、読んだところ、これが可能であることが示唆されていますが、どこでどのように変更するかはわかりません。

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


これは私にはうまくいきません。最小で、「ms」とrto時間を含めるとエラーが発生します。コマンドは機能しましたが、ss -iはそれ以外のことを示しています。さらに、2つのsysctl変数は存在しません。私は4.4カーネルで実行しています
Mark Seger '21

私は最近のディストリビューションを試してみましたが、ip route replace代わりに成功しました- ip route構文が少し変わったようです。でも、うまく修正することができました。注意してほしいのは、私にpingを送信したい場合の質問ではなく、回答にコメントすることです。私は基本的に偶然、これが最近の幸運だと思っていました:)
Adam C

回答:


30

RTOを具体的に変更できないのは、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

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

したがって、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は15msですが、SSH接続(変更前)は以前と同様に200以上です。

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


説明のために@Adam Cに感謝しますが、最小(200ミリ)と最大(120秒)について説明しましたが、これらのいずれか(最小または最大)を変更できますか?はいの場合、どうですか?...
obiigbe91 2015年

私はそれらがコード内の定数であると信じており、それらを動的に設定する方法を認識していませんが、コードを変更して独自のカーネルをコンパイルするのが少し多いと想定しているので少し掘り下げて確認します:)
Adam C

rto_minを微調整する方法を理解し、それと他のいくつかの関連事項を回答に追加しました:)
Adam C

なんでこんなところないのrto_max?グローバル最大タイムアウトを設定するにはどうすればよいですか?
EST

あなたが最小(またはデフォルトを受け入れる)を設定し、再試行回数(変更した場合net.ipv4.tcp_retries1net.ipv4.tcp_retries2または類似IIRC)を許可され、私はあなたがRTOの最大の同等に得ることができると思います。
Adam C
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.