■現象
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を見直すことでも使用メモリを減らせるはずだ。