Linuxカーネルの「TCP_TIMEWAIT_LEN」変更は無意味?

Web企業ではわりと広くTCP_TIMEWAIT_LENを書き換えて毎回カーネルをリコンパイルしてると聞いて調べてみた
39
小崎 資広 (KOSAKI Motohiro) @kosaki55tea

. @sonots から日本のWeb界隈ではTCP_TIMEWAIT_LEN を変更してカーネルリコンパイルがデファクトという話を聞いて軽くぐぐってみたところ、たしかに大量にそのようなページがヒットする。しかもどれ一つとして理由が書いてない。そして日本特有の現象

2015-09-09 00:03:14
小崎 資広 (KOSAKI Motohiro) @kosaki55tea

軽くソースを見た感じだと、tcp_tw_reuse をセットすると1秒で TIME_WAITのsocketは再利用が始まるので、いまひとつリコンパイルの必要性が分からず。これ、ソース呼んで妥当性チェックした人がいるノウハウなのかなあ

2015-09-09 00:04:39
K.Namba/(お菓子|おやつ)エバンジェリストDX🍩 @ipv6labs

@kosaki55tea @sonots なにそれ・・・ こういうのって、パラメータで調整するのでは? リコンパイルとか ちょっと後のこと考えてください(死

2015-09-09 00:05:30
小崎 資広 (KOSAKI Motohiro) @kosaki55tea

カーネル論理としては、TIME_WAITにかぎらずTCPは紛失したと思ってたパケットがやってくるものである。だからシーケンスナンバーおかしいやつは捨てる。だからシーケンスナンバーの初期値を十分ずらしてやれば TIME-WAITなsocketを再利用しても安全

2015-09-09 00:09:06
小崎 資広 (KOSAKI Motohiro) @kosaki55tea

というのがtw_reuseの考え方に見える。わたしネットワークは素人だから間違ってるかもしれないけど。それが正しいとすると、TIME-WAITを短くすることに拘る理由はあまりない。netstatの出力が綺麗になるかどうかだけの問題

2015-09-09 00:10:14
そのっつ (Naotoshi Seo) @sonots

@kosaki55tea え、ソケット開かれすぎて、time wait table がオーバーフローしてエラーになっちゃうとか書いてありません?namikawaさんの良い記事あった > d.hatena.ne.jp/rx7/touch/2013…

2015-09-09 00:12:49
Emma Haruka Iwao 🏳️‍🌈🏳️‍⚧️ @Yuryu

私もTIME_WAITを短くする理由はないと思います。同じIPに接続する場合はtw_reuseでポート再利用されるし、そうでない場合はきちんと待つべきだと思うので。 twitter.com/kosaki55tea/st…

2015-09-09 00:14:03
Mitsuru SHIMAMURA @smbd

@kosaki55tea d.hatena.ne.jp/rx7/20120329/p1 この辺を見ると、tcp_tw_reuse=1にしてもTIME_WAITが減らなかった、となっていますね

2015-09-09 00:14:41
小崎 資広 (KOSAKI Motohiro) @kosaki55tea

@sonots あなたが言っている tcp wait tableとはなんのことだい?

2015-09-09 00:14:47
methane @methane

@kosaki55tea むしろ tcp_tw_reuse を使えばいいから、 TCP_TIMEWAIT_LEN を設定不可能にしてますね。

2015-09-09 00:16:06
小崎 資広 (KOSAKI Motohiro) @kosaki55tea

@smbd TIME_WAIT中のやつをreuseするオプションなので減らないのは当然で、その結果port不足が発生するかどうかが検証されてないように見えます。なんか間違ってる?

2015-09-09 00:16:23
そのっつ (Naotoshi Seo) @sonots

@kosaki55tea こういうエラーが出る認識です > Mar 29 18:08:02 hostname kernel: TCP: time wait bucket table overflow cf. d.hatena.ne.jp/rx7/touch/2012…

2015-09-09 00:16:27
小崎 資広 (KOSAKI Motohiro) @kosaki55tea

@methane だよねえ。ソース見て同じ感想をもった。

2015-09-09 00:16:47
methane @methane

@smbd @kosaki55tea TIME_WAIT なソケットを管理するコストすら気にする競技向けの設定なのかもしれないけど、ベンチマークは見た事無いですね。

2015-09-09 00:16:54
小崎 資広 (KOSAKI Motohiro) @kosaki55tea

@sonots tcp_tw_reuseのところ、TIME_WAITが減らなかった、としか書いてなくて、検証になってないよ。

2015-09-09 00:17:57
Mitsuru SHIMAMURA @smbd

@kosaki55tea d.hatena.ne.jp/hirose31/20071… たしかに、こちらではtw_reuse=1にすると接続エラーにならないとなってますね

2015-09-09 00:18:15
methane @methane

TIME_WAIT が本当に要らないと分かってる環境なら、 FIN じゃなくて RST を送れば TIME_WAIT なくせるという Tips

2015-09-09 00:18:57
そのっつ (Naotoshi Seo) @sonots

@kosaki55tea あー、この記事だと確かにそうですね。reuse ですから減らないですね。

2015-09-09 00:19:20
ふりっぱぁ @fripper1214

@kosaki55tea @smbd 空きがあるうちは普通に増えて、足りなくなって初めてreuseされる、だから、よほどの負荷を掛けた試験をしない限りはTIMEWAIT状態のものは減ったようには見えない…で認識良いですかね?

2015-09-09 00:20:52
そのっつ (Naotoshi Seo) @sonots

@methane それ、tcp flow が汚れて(汚れたように見えて)やなんですよねー。アプリケーションでの対応がいるし。

2015-09-09 00:20:57
methane @methane

developerweb.net/viewtopic.php?… The TIME_WAIT state is there for a reason; it's your friend and it's there to help you :-)

2015-09-09 00:21:05
小崎 資広 (KOSAKI Motohiro) @kosaki55tea

@fripper1214 @smbd じゃなくて、TIME_WAITのsocketのうち、reuseしても安全なものはreuseするというオプションなので減らす効果はまったくない。TIME_WAITのsocketが増えるとreuse条件に合致しやすくなるのでなかなか溢れないだけ

2015-09-09 00:26:20
まとめたひと
小崎 資広 (KOSAKI Motohiro) @kosaki55tea

Linuxカーネル開発者で主にメモリ管理を変更しています。Rubyのコミッタもやっています、最近「Rubyをもっとも知らないコミッタ」を3代目に奪われました。kernel watchの中の人でもあります。