uzullaがブログ

uzullaがブログです。

500 Days Later... (邦題、Windowsサーバーで起動から500日)

先日より突然投げ渡されたWindowsシステムを扱う事になってる私ですが、様々な洗礼を受け、着々とウインドーズ力を高めております。

さて、タイトルだけでWindowsマスターの皆様なら、「ああ…」ってわかりますよね、それにひっかかりました。

正しくは、497日2時間27分52秒950ミリ秒

http://support.microsoft.com/kb/2553549/ja
http://operationslab.wordpress.com/2013/03/01/windows-%E3%81%AE497%E6%97%A5%E5%95%8F%E9%A1%8C-%E3%81%9D%E3%81%AE%E5%BE%8C/

去年くらいに話題になった、「Windows VistaWindows 7Windows Server 2008 および Windows Server 2008 R2 で、システム起動から 497 日経過すると、TIME_WAIT 状態であるすべての TCP/IP ポートが閉じられない」というバグを見事踏むことに成功しました。

いや、このバグきいたときは「うわーw」って思ってたんですが、まさかそこからしばらくして自分が踏むとはおもわなんだ。


結構面白い挙動だったので、少しお話したいと思います。

環境

該当のサーバーはWindows Server 2008 SP2 で、上で動いているソフトウェアはMysqlです。
TCPのチューニングはしていないシステムです。

どうなった?

さて、これ497日経過すると一気に*1死ぬのかとおもっていましたが、どうもそういうわけではないみたいです。
約5xx日を経過した所で、まだ通信は断続的にできます。リモートデスクトップも(内部でリトライはしてるんでしょうが)つながります。


ただし、Mysqldへの接続も断続的に失敗しますし、塩梅は悪化の一途をたどります。*2


どうも、「すべてのTCP/IPポート」とありますが、「本当に全く再利用できない」というわけではないような気がします、いくらかは回収されているんですかね?
数日単位でだんだんと悪化した、という感触があります。

具体的には?

Mysqlが出力するエラーは、PHPだとこのようなものになります。

SQLSTATE[HY000] [2002] 接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。または接続済みのホストが応答しなかったため、確立された接続は失敗しました。

リトライするとなにもなかったようにスムーズにつながったり、またつながらなかったりします。
CPU負荷もメモリ負荷もなにもあがりません、一般的な資源監視ツールだと平和に見えます。


ちなみに、Mysql Workbenchだと、なぜか一度も接続に失敗しませんでした。
これも謎ですが、まあ内部リトライなのかもしれません。

netstat -naの出力

Mysqlの3306への接続等、大体4000行くらい出力されていました。

2008は、計15000ポート位がユーザポートで利用できるはずなのですが*3、3〜4000って全然それにとどいてない感じですね。わりとこの辺りになにか限界みたいなものがあるのかもしれません。


netstatが全部出力していない、という可能性もなきにしもあらずだし、
Mysql自体のFDがうまってるとか*4あったのかもしれません。
(ただし、後述しますがMysqlが報告するコネクション数、スレッド数は10程度でした)


どうでもいいけど、TIME_WAIT状態のポートは45000あたりから65000あたりでキレイに染まっていたので、ああ、WS2008はホントにこのレンジでポートをつかっているのだなーという感じです。

で?

いやー洗礼だったなーって感じです。


まあ、
・サーバーでもちゃんとWindowsUpdateやってれば起こらない(≒月一再起動)
Windowsを無再起動で2年近く回すとかどうなの?*5
・そもそもこれ既知情報じゃん、なんで対応しなかったの*6
・さっさと再起動しないで観察するなよ*7
という感じっすね。


ただ、現実として起こってみれば、微妙な挙動で「はー!これは面白い!」と思ってしまった一件でした、他人ごとや!

でも自分の身にふりかかると、これつらいわ。

最初単純にMysqlにつながらないという問題だったので、PHPのコードやネットワークを疑い、
Mysqlのコネクション数の問題とか、色々あるけどそこらへんもちゃんと調査した上で10ポートくらいしか食ってないし、マジなんなのこれ、死にたい、Windows独特ななにかの問題か?*8、いやそうやってWindowsの所為にする根性は是正しないといけない!!などとウンウン悩み…。


途中TIME_WAITが大量に発生しているのを見つけて、なんかアタックでもくらっているのだろうか、でもこいつFWの内側だしな、IPもDMZ内だしな…。
PHPのコード(他人が書いたもので、私は1行もまだ手をいれていない)が悪いのだろうか、なんだろうなんだろうと悩んで全部さらってみても問題はみつからず。

TIME_WAITであふれる問題はLinuxでもしばしばある話で、TCPのパラメタチューニングをやったりするのが定番なので、TIME_WAITが「本当にへらない」というのはなかなか想像ができませんでしたね。


結局TIME_WAITの寿命短縮とポートレンジ増やそう、という結論にいたって、その周辺を調査していたらみつけましたね。


はーーー。「マジなんなのこれ、死にたい、逃げたい」というつらみがやっと解決して本当に嬉しい。


まあ、次々とまた洗礼は襲いかかるはずで*9、胸がいっぱいです。

作業時に地味に困ったのが

windows、wcコマンドがないので、netstat -naの出力が何行か数えるのに一瞬とまどった。

・スクロールバッファを9999にして、なんとなくスクロールバーの位置から推測した
netstat -na > out.txtで保存してから、エディタでひらいて行数をみた(余分な行も数えてしまうが…)

という感じでした。
Win向けの良いwcコマンド、探さないとな。

で、結局どうなったの?

まあ、再起動したら当然のように安定しはじめましたw
パッチが効いてるのかとかはまた500日待つ案件なので、わかりませんね!


おわり

おまけ、色々しらべていた件。

flush hosts問題、Mysqlがbanすることがある。

http://serverfault.com/questions/495985/mysql-blocking-new-connections-and-mysqladmin-flush-hosts
https://my.bluehost.com/cgi/help/575

Error: 1129 SQLSTATE: HY000 (ER_HOST_IS_BLOCKED) Host 'web' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'

(Host '%s' は many connection error のため、拒否されました. 'mysqladmin flush-hosts' で解除してください)

おわりといいつつ、最近してなかった宣伝

http://tailf.cfe.jp/

あなたのInstagramFacebookGoogle+Picasa)の画像をTOLOTフォトブックに超カンタンに変換します。
500円で62枚のフォトブックは前代未聞の安さとおもいますので、是非。
(ちなみに、このサービスはLinuxサーバ上で動いております)

リリース時の詳細エントリ

http://uzulla.hateblo.jp/entry/2013/05/08/124552

Youtubeにあがっている、利用者のレポート


TAILFでinstagramフォトブックを作ろう! - YouTube

*1:TCP接続とか、毎秒ペースでガンガン発生するものですし

*2:最初は、負荷が高いんですかね〜?というレベルだったのだが…

*3:2003までは、もっとすくなくて、5000ポートくらいしか割り当てがないし、2Kだと、さらにTIME_WAITの寿命が240秒でノーチューンだと結構つらい

*4:Windowsだとファイルハンドル?この辺りのWindowsの特性はまだ不勉強です

*5:まあ、色々(略)

*6: 色々NDA

*7: ありまし10

*8:まあ、正解ですが

*9:すでに襲い掛かられていますが