2011年8月2日火曜日

SYN ACKが返ってこない太郎

すげ、こまったお。

LBの配下に、WEBサーバ(apache)を複数台置いて画像を配信してたら
MAC(OS X10.8.6)、ubuntu(11.04)で画像が見れたり、見れなかったり。

状況kwsk
・LBの振分ルールはラウンドロビン。
・LBからWEBサーバに対しては、SNATしてる。
・WEBサーバは常時2000コネクションくらい張っているんだけど
接続がまったくない状態でも同じ現象が発生する。
・逆にWEBサーバが1台やら2台だと再現しない。
・上記端末から、画像取得ができない(WindowsXP、Vista、7)はさくさくいける。
・ブラウザ依存じゃなかった(Firefox、Opera、Safari、Choromeでもだめ)
・IPV6はONでもOFFでもでる。
・Wiresharkでキャプチャしたら、SYN+ACKが返ってこない・SYNのリトライたくさん。

原因は・・・

・サーバ側で、net.ipv4.tcp_tw_recycleが有効になってて
・クライアント側のnet.ipv4.tcp_timestampsが有効になってて
・NATしてる環境だとSYNパケットを落とす?ようだ。

なんでかと考えたら。

クライアント側が持ってるTCPのタイムスタンプとサーバ側で保持してるタイムスタンプに
相違がでてうまく通信できないのか・・・サーバ側が、net.ipv4.tcp_tw_recycleを
有効にしてる=すぐ再利用しようとする→タイムスタンプがすれる?ってことかな・・

うーン
説明難しい太郎

WEBサーバ側で↓の設定いれたらとりあえず解決した。

#今の設定確認
/sbin/sysctl -a | grep tw_recycle
net.ipv4.tcp_tw_recycle = 1

#sysctl.confをバックアップ・編集
cp -rp /etc/sysctl.conf /etc/sysctl.conf.back

vim /etc/sysctl.conf

#追記
net.ipv4.tcp_tw_recycle = 0

#差分確認
vimdiff /etc/sysctl.conf /etc/sysctl.conf.back

#反映
/sbin/sysctl -p

#確認
/sbin/sysctl -a | grep tw_recycle
net.ipv4.tcp_tw_recycle = 0



ただ、無効にするとTIME_WAITの数が多くなるので
socket使い果たさないようにきをつけお

0 件のコメント: