TCP RTOを変更したいです。(再送タイムアウト)接続の価値、私が読んだいくつかの内容によると、これを行うことができることを示唆していますが、それを変更する場所と方法を明らかにしません。
変数を見てみると、/proc/sys/net/ipv4
RTOに関連する変数は1つもありませんでした。誰でもこの値を変更する方法を教えてください。
答え1
RTOを具体的に変更できない理由は、RTOが固定値ではないためです。代わりに(当然初期SYNを除く)、各接続のRTT(往復時間)に基づいています。実際、これは平滑化されたRTTバージョンとRTT分散といくつかの定数の混合に基づいています。したがって、各TCP接続に対して動的に計算された値であるため、強くお勧めします。この記事計算と一般的なRTOについて詳しく説明します。
また関連性があるのはRFC 6298(他の多くの中で)どんな内容がありますか?
RTOを計算するたびに1秒未満の場合は、RTOを1秒に丸める必要があります。
では、カーネルは常にRTOを1秒に設定しますか? Linuxでは、次のコマンドを実行して開いている接続の現在のRTO値を表示できますss -i
。
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への複数の接続が開いている仮想マシンの出力です。ご覧のとおり、RTOは実際には約200(ミリ秒)に設定されています。この値はRFCで1秒の値に丸められず、少し高いと考えることもできます。これは、LinuxのRTOに最小(200ミリ秒)と最大(120秒)の制限があるためです(上記のリンクには良い説明があります)。
したがって、RTO値を直接変更することはできませんが、損失の多いネットワーク(ワイヤレスなど)の場合は、調整を試すことができます。高速RTO(配布パネルによってはすでにアクティブになっている可能性があります)。実際に調整できる2つのF-RTO関連オプションがあります(良い要約ここ):
net.ipv4.tcp_frto
net.ipv4.tcp_frto_response
最適化したいターゲットによっては、役に立つ場合もあればそうでない場合もあります。
編集:コメントに基づいてTCPのrto_min / max値を調整する機能を追跡します。
TCPのグローバル最小RTOは変更できません(ただし、SCTPに対してこれを行うことができます。これはsysctlに表示されます)。しかし、良いニュースは、ルートごとに最小RTOを調整できることです。私のCentOS仮想マシンのルーティングテーブルは次のとおりです。
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接続のrto(変更前)は以前と同じ200+です。
私は実際にこのアプローチが好きです。これにより、他のトラフィックを台無しにする可能性がある全体的に低い値を設定するのではなく、適切なルートに低い値を設定できます。同様に(参照IP マニュアルページ)パスの初期rtt推定値と初期rttvar(動的RTOの計算に使用されます)を調整できます。チューニングの面では完全な解決策ではありませんが、重要な部分はほとんどあると思います。最大設定を調整することはできませんが、一般的にどんな場合でもあまり役に立たないと思います。