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の設定を微調整することはできませんが、どのような場合でも一般的にはそれほど役に立ちません。