2013年5月19日日曜日

原因不明の障害: WSAECONNRESET (10054)


対象OS:
Windows2003 SP1 64bit
Windows2003 R2 SP2 64bit
Windows2003 R2 SP2 32bit


【概要】

同じポートに対し、大量にセッションの接続切断を繰り返しているうちに、
サーバOSが勝手にセッションを切断している様子。

microsoftのHPより抜粋(http://support.microsoft.com/kb/819124/ja) 
---
WSAECONNRESET (10054)
    意味 : ピアによって接続がリセットされました。
    説明 : 既存の接続が、リモート ホストによって強制的に切断されました。このエラーは、通常、リモート ホストのピア プログラムが突然停止された場合、ホストが再起動された場合、またはリモート ホストが強制終了した場合に発生します。リモート ソケットの SO_LINGER オプションの詳細については、setsockopt (Wsapiref_94aa.asp) を参照してください。このエラーは、1 つまたは複数の操作の実行中に keep-alive 動作によってエラーが検出され、そのために接続が切断された場合に発生することもあります。実行中であった操作は、WSAENETRESET で失敗します。以降の操作は、WSAECONNRESET で失敗します。
---





【発生した現象】
アプリ(ミドル)が強制切断される。


OracleやHirDB、SQLServerなどDB関連のアプリで発生することが多い。
おそらく、サーバスペックがかなり高めでないと発生しないのかもしれない。
(再現テストなどやってみたが、普通のスペックのサーバでは再現できなかった)


Oracle- listener.log
---
TNS-12560: TNS: プロトコル・アダプタ・エラー
TNS-00530: プロトコル・アダプタ・エラーです。
  64-bit Windows Error: 54: Unknown error
  TNS-12518: TNS: リスナーはクライアント接続をハンドオフできません。
    TNS-12571: TNS: パケット・ライターに障害が発生しました。
    TNS-12560: TNS: プロトコル・アダプタ・エラー
      TNS-00530: プロトコル・アダプタ・エラーです。
      64-bit Windows Error: 54: Unknown error
---


Windows Errorの補足
---
net helpmsg 54
ネットワークがビジーです。

net helpmsg 10054
既存の接続はリモート ホストに強制的に切断されました。
---


■発生時に確認する内容
・ネットワークの負荷やミドルウエア、アプリの負荷を見てみる。
 

 例)
 netstat -ano
 パフォーマンスモニタ
 ミドルウェアから見たセッション数とか



■対策

①netstatコマンドで、「CLOSE_WAIT」「TIME_WAIT」が多数の場合

・Windows2003SP1の場合は有効かも?

 <レジストリ キー>
 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\
 SynAttackProtect
 値 00000000

 ⇒Dos攻撃と間違えて徐々にポートを閉じる現象
 Windows2003R2以降は対策が不要らしいが。


・ポート数不足の場合(デフォルト5000)
 <レジストリ キー>
 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\
 MaxUserPorts
 値 65534


②ミドル(特にDB)からセッション数の確認
 DBへの接続方法見直し
 ⇒コネクションプーリングが有効か?確認



③OSパッチ
 最近知りましたが、パッチが出ているようです。


 http://support.microsoft.com/kb/979230/ja 


但し、有効な対策については対象システムによって違うと思うので
調査/検証は行ってください。


1 件のコメント: