接続のTCP RTO (retransmission timeout) 値を変更したいのですが、これまでに読んだいくつかの方法でこれを実行できることを示唆していますが、どこにあるかはわかりませんそしてそれを変更する方法。
/proc/sys/net/ipv4
変数を確認しましたが、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
上記は、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の計算時に使用)を微調整できます。微調整に関しては完全な解決策ではありませんが、重要な部分のほとんどはそこにあると思います。最大設定を微調整することはできませんが、どの場合でも一般的にはそれほど役に立ちません。