2013年8月21日水曜日

The SQL Server Network Interface library was unable to close socket handle due to a closesocket failure under memory pressure.

■現象
The SQL Server Network Interface library was unable to close socket
handle due to a closesocket failure under memory pressure.
Winsock error code: 0x2747.
または、
「ユーザーsaはログインできませんでした」
のエラーが出て、SQL Serverにつながらなくなる。

■原因
サーバメモリ不足の可能性がある。
正確には、アプリケーションが利用可能なメモリの限界に達した。
と言い換えることができる。
メモリ不足のため、ネットワークライブラリがクライアントからの接続を
受け付けなくなり、ログインできませんのエラーが発生した。

■調査
まず、前提として、物理メモリは、OSとアプリで分け合って利用している。
もともと利用可能な割合は決まっていて、32ビットOSで4GBメモリならば
OSは2GB、アプリは2GBとなる。

・物理アドレス拡張 (PAE)
  http://www.atmarkit.co.jp/fwin2k/win2ktips/1125paeon/paeon.html
・3GBスイッチ
 http://webdesign-ginou.com/pc/pc_mac_kiki/3gb_switch.html
のオプションでこれらの割合は変更可能であるが、今回は未設定という
前提で対処方法を検討してみる。

■検証
仮に32ビットOSで4GBメモリが実装済みとする。
最大使用可能量は、 OSは2GB、アプリは2GBとなる。
ここで、SQL Serverは、最大2GB使用可能であると言える。

SQL Serverでは、「 max server memory 」のパラメータでメモリ使用量を
調整可能であるが、注意点としてSQLServer全体の使用量上限でなく
あくまでバッファキャッシュの上限を決めることができる。

http://technet.microsoft.com/ja-jp/library/ms180797(v=sql.105).aspx
「プロセスとしての SQL Server は、max server memory オプションで
指定された容量を超える」とあることから「 max server memory 」に
2GB割り当ててしまうと、メモリ不足エラーが発生する。
※SQL Server総使用メモリ=プロセス使用分+バッファキャッシュ割り当て分

■対処
今回のエラーの場合は、 SQL Serverサービスの再起動が必要である。

メモリ使用量が少ないからといって、DBに割り当て過ぎると
今回のような障害が発生する可能性がある。
 
他のアプリケーションの最大メモリ使用を見ながら、 SQL Serverの
「 max server memory 」には、余裕を見て初めは少なめに割り当て
すると良いだろう。 バッファキャッシュは、検索などを早くするためなので
少なめであっても使えなくはならないはずだ。

補足ではあるが、AWEオプションを有効にしていると、仮想メモリに
待避できないようなので、物理メモリを SQL Serverが占有しやすくなる。
このオプションをOFFにすると、パフォーマンスは下がるだろうが
メモリを占有するなどの障害は減るかもしれない。
http://technet.microsoft.com/ja-jp/library/ms190673(v=sql.105).aspx

■今後
まずサーバのメモリを増やす方法が考えられる。
64ビットOSにリプレイスすれば、使用可能メモリも大幅に増やせる。
もし、32ビットOSでメモリが不足気味であれば、先に述べたように
メモリの割り当てを少なめにして、他のアプリがムダに占有していないか
調査も必要であろう。またSQLを見直すことでも使用メモリを減らせるはずだ。














0 件のコメント:

コメントを投稿