2012/04/26

Windows Server 2008 ネットワーク通信不可!?連続稼動でTIME_WAITバグ問題

対象 OS
Windows Server 2008 の全てのエディション
Windows 7 の全てのエディション
Windows Vista の全てのエディション
Windows Server 2008 R2の全てのエディション
Windows Server 2008(64-bit) の全てのエディション
Windows 7 64ビット の全てのエディション
Windows Vista 64ビット の全てのエディション

業務への影響:TCPを使った新規の通信ができなくなります 
(※ LISTENINGしているサーバーアプリは動き続けます)

復旧作業の必要性:あり
発生頻度:必ず 回避方法:あり


現象と発生条件

[現象]
TCPのセッションが枯渇し、これを使うアプリケーションが通信できなくなります。
このときnetstatコマンドでセッションを確認すると大量のTIME_WAIT状態のセッションが残留したままになっています。
[環境]
特定の環境はありません。
[発生条件]
OS起動後、再起動することなく497日を超えて連続稼働している場合
※連続稼働日数は、タスクマネージャを起動し、パフォーマンスタブにて、起動時間を確認してください。

原因

TCPのTIME_WAIT状態を管理しているタイマー処理に不具合があり、連続稼働が497日を超えるとTIME_WAIT状態から解放されなくなり、セッションが残留するためです。

発生を未然に防止する方法

以下のマイクロソフト社の Webサイトより修正プログラム(*1)(*2)をダウンロードし適用してください。
修正プログラムの適用後、システムの再起動が必要です。
-マイクロソフトサポートオンライン
文書番号: 2553549
All the TCP/IP ports that are in a TIME_WAIT status are not closed after 497 days from system startup in Windows Vista and in Windows Server 2008
http://support.microsoft.com/kb/2553549/en-us
機械翻訳版はこちらです。
http://support.microsoft.com/kb/2553549/ja
*1: 修正プログラムを適用するには、次のいずれかのOSが動作している必要があります。
  • Windows Server 2008 R2 SP1
  • Windows Server 2008 R2
  • Windows Server 2008 SP2
  • Windows Server 2008
  • Windows Server 7 SP1
  • Windows Server 7
  • Windows Server Vista SP2
  • Windows Server Vista SP1
*2: 「修正プログラムのダウンロード」ページで、製品欄に「Windows Vista」とあるものは、Windows Server 2008とWindows Vista双方に適用できます。

修正プログラムを適用できない場合には、以下の[回避方法]を実施してください。
[回避方法]
  • 連続稼働日数が497日を超える前にOSを再起動してください。

何故497日なのか?


32bitであつかえる符号なし(unsigned)整数は0~4294967295までです。
(そのままでは4294967295+1は扱えない)
4294967295ミリ秒は約497日


参考 497日 ‐ 通信用語の基礎知識

問題発生後の復旧方法

OSを再起動してください。


2 件のコメント:

  1. どうも。初めまして^^

    497日に違和感有りましたので、計算しました所、数字が一桁多い気がしました…

    497日ではなく、49.7日ではないでしょうか。

    49.7日だと、49.7*89600*1000 → 4,453,120,000

    497日だと 497*89600*1000 → 44,531,200,000

    返信削除
  2. KUさん

    調べた挙句
    返信していませんでした・・・すみません。

    記事内の参考のリンクになりますが
    何故か10ミリ秒単位で計算するのです。
    ちょっと、理由は分からなかったのですが

    返信削除