LinuxでTCP RTO値を変更する

LinuxでTCP RTO値を変更する

TCP RTOを変更したいです。(再送タイムアウト)接続の価値、私が読んだいくつかの内容によると、これを行うことができることを示唆していますが、それを変更する場所と方法を明らかにしません。

変数を見てみると、/proc/sys/net/ipv4RTOに関連する変数は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の計算に使用されます)を調整できます。チューニングの面では完全な解決策ではありませんが、重要な部分はほとんどあると思います。最大設定を調整することはできませんが、一般的にどんな場合でもあまり役に立たないと思います。

関連情報