LinuxのTCP輻輳ウィンドウサイズやスロースタート閾値のキャッシュを無効化する

TCP通信の状態を監視していたところ、スロースタート閾値の初期値が、カーネル内で定義されている初期値と異なっていることがありました。調査したところ、Linuxに実装されているtcp_metricsが原因でした。本記事では、tcp_metricsの無効化方法について説明します。

Linuxカーネル2.6.6以降のTCP通信にはtcp_metricsという機能があります。tcp_metricsは、スロースタート閾値や輻輳ウィンドウサイズ、RTTといったTCP情報を送信先IPアドレスと関連付け、TCPコネクション終了時にキャッシュします。そして、キャッシュされた送信先IPアドレスへTCPコネクションを開始する時に、キャッシュしたTCP情報をその通信の初期値に設定します。

送信先IPアドレスのTCP情報をキャッシュすることで輻輳を防ぐことができる機能ですが、例えばiperfなどを使ってスループットを測定する時には、TCP情報の初期値を勝手に書き換えてしまうため、正確な測定の妨げになります。

以下のコマンドで、tcp_metricsがTCP情報をキャッシュすることを無効にします。

$ sudo sh -c "echo 1 > /proc/sys/net/ipv4/tcp_no_metrics_save"

これだけではtcp_metricsは新たにTCP情報をキャッシュしないだけで、既にキャッシュしているTCP情報は設定されるので、キャッシュを消去します。

$ sudo ip tcp_metrics flush

確認します。何も表示されなければキャッシュは消去されています。

$ ip tcp_metrics show

 

tcp_metricsがTCP情報をキャッシュすることで、TCP情報の初期値が書き換えられてしまいます。前のTCPコネクションの影響を受けたくない場合は無効化したほうが良いと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*