トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

Linux:OSのtcpタイムアウトのデフォルト値について

Last-modified: 2013-08-24 (土) 02:14:21 (3898d)
Top / Linux:OSのtcpタイムアウトのデフォルト値について

Linux:OSのtcpタイムアウトのデフォルト値について

例えば、curlを使用して、タイムアウト値を300秒に指定し、タイムアウトさせるよう無いことをしても、実際180秒を超えたくらいでタイムアウトする事象が発生していました。

これが、curlだけじゃなくて、例えばapacheのmod_proxy_balancerのバックエンドサーバへのタイムアウトについても、タイムアウト値を300秒とかでせっていしても、実際は180秒ちょいでタイムアウトしてしまっていました。

これについて、ちょっと調べたところどうもLinuxのOSとして持っているTCPのタイムアウト値が効いているようだ、ということがわかりました。

ここを見ると分かります。

#cat /proc/sys/net/ipv4/tcp_syn_retries 
5

これはtcpのsynを送信するリトライ回数みたいで、以下のロジックでリトライをされるようです。

3*2^(N-1)秒の間隔(NはN回目のSYN)を空けてSYNパケットが送信される

詳しくはこちらのサイトで解説されています。

※一部引用

最初のSYN送信    (0秒経過)

3秒経過してACKが、戻らないとき、SYN(1)を再送します。  (3秒経過)

また、6秒経過してACKが、戻らないとき、SYN(2)を再送します。  (9秒経過)

また、12秒経過してACKが、戻らないとき、SYN(3)を再送します。  (21秒経過)

また、24秒経過してACKが、戻らないとき、SYN(4)を再送します。  (45秒経過)

また、48秒経過してACKが、戻らないとき、SYN(5)を再送します。  (93秒経過)

また、96秒経過してACKが、戻らないとき、ここでタイムアウトが発生します  (189秒経過)

なるほど!こういうことで189秒とかでTCPがタイムアウトしてしまうわけですね!

勉強になりましたw

ちなみに、設定変更は「/proc/sys/net/ipv4/tcp_syn_retries」の値を書き換えてあげればよいみたいです。