テクニカル情報

[サポート]OutOfMemoryException の発生時の対策について

 ASP.NETやSQL Serverは特に面倒な設定をしなくても、効率よくマシン上のメモリを管理しています。しかし、アクセス数が増大し、マシンの持っているパフォーマンスの限界近くを使う場合には、それぞれのメモリ管理の調整が必要になる場合があります。この調整により安定性の向上や、限界を超えた場合のプロセスリサイクルによるすばやいシステム復帰(短時間のプロセスリサイクルによるメモリ開放、セッションは切れ、ログインは継続する)が行われます。逆に不適切な調整により、限界を超えた場合は「System.OutOfMemoryException」などが発生し、プロセスが停止する場合があります。そのような状況と対策について記述します。



[状況]

高負荷のかかっている運用環境で、「System.OutOfMemoryException」などが発生します。
このエラーは、イベントビューアのアプリケーションログで確認できます。
それ以外にも高負荷の場合にプロセスリサイクルが発生し、ブラウザからは動作が一瞬停止したように見える場合があります。プロセスリサイクルはアプリケーションログでi-SITEが再起動していることで確認できます。

[原因]
・ASP.NETとSQL Serverを別サーバーで運用する場合 
32bitCPUにて4Gbytesのメモリを実装している環境で、IISのワーカープロセスリサイクル制限値が実際に使えるプロセス用仮想アドレス空間の規定値 (32bitメモリ空間で最大2 GB) よりも大きいため、高負荷の場合「System.OutOfMemoryException」例外処理が発生し、、頻発するとラピッドフェール保護によりプロセスが停止する。参考)別掲記事「4GBを実装した運用環境について

・ASP.NETとSQL Serverを同一サーバーで運用する場合
上記の問題に加え、SQL Serverは必要になって確保したメモリを開放しないが、それによって実際に使えるメモリが圧迫される場合がある。この状態でIISのワーカープロセスリサイクル制限値がシステム全体のメモリ量に対し固定的に計算、設定されている場合に、リサイクル制限値以下でもメモリが不足し、「System.OutOfMemoryException」例外処理が発生し、頻発するとラピッドフェール保護によりプロセスが停止する。


[対策]

それぞれの環境にあわせ、メモリ制限の設定を行います。


ワーカープロセスのメモリリサイクルについて

■ Windows Server 2003 (IIS6) での設定方法
IIS マネージャのアプリケーションプール・プロパティ「リサイクル」内 メモリのリサイクルにある[最大使用メモリ] (メガバイト単位) の設定を使って、ワーカープロセスが使用する最大メモリを設定(制限)できます。

アプリケーションプールのプロパティ画面
一例として上図では、[最大仮想メモリ]、[最大使用メモリ]を 32bitメモリ空間 2 GB の60%としています。

資料Web
「.NET アプリケーションのパフォーマンスとスケーラビリティの向上」(Microsoft)
「第 17 章 「.NET アプリケーション パフォーマンスのチューニング」
「ASP.NET のチューニング」の「メモリ制限を設定する」項


 

■ Windows Server 2000 (IIS5)での設定方法
"C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\CONFIG\machine.config" ファイルのprocessModel 要素の memoryLimit 属性の修正にて対応可能となります。

・memoryLimit属性の設定により、ASP.NET が新しいプロセスを起動して既存の要求を再割り当てするまでにワーカー スレッドが消費できる最大メモリ サイズを、システム メモリ全体に対する割合として指定します。

既定値は 60 です。

詳細について以下のマイクロソフトのサイトを参照ください。

    「processModel 要素 (ASP.NET 設定スキーマ)」
    http://msdn.microsoft.com/ja-jp/library/7w2sway1(VS.80).aspx



「System.OutOfMemoryException」例外処理が繰り返されることによるプロセス停止について

■ ラピッドフェール保護の設定について
ラピッドフェール保護とはシステムの異常な状態を察知し、該当ワーカープロセスを停止させます。IIS マネージャのアプリケーションプール・プロパティ「状態」内 の以下の画面の赤枠部分を変更することで、高負荷時の不用意なシステム停止を抑制することが可能です。
※初期値では、5分間に5回のワーカープロセスエラー(「System.OutOfMemoryException」例外処理など)によってシステムを停止します。この値を変更することは推奨しません。メモリを十分確保したのち、ワーカープロセスリサイクルの制限値を調整してワーカープロセスリサイクルを行い、「System.OutOfMemoryException」例外処理が頻発しないようにしてください。

ラピッドフェール保護



 

 Microsoft SQL Server でのメモリ設定について

ASP.NETと同一サーバー上で稼動するSQL Serverでは以下のような値を推奨します。上述のプロセスリサイクルの制限値はその差分の60%を推奨します。例えば1GBytesで382MBytes、2GBytesで921MBytes、3もしくは4GBytesでは上述の2GBytesの制限がかかるため1228MBytesです。

メモリ制限推奨値
システム メモリ SQL Server プロセスリサイクル
1 GB 386 MB 382 MB
2 GB 512 MB 921 MB
3 GB 764 MB 1228 MB
4 GB 1024 MB 1228 MB
参考:http://support.microsoft.com/kb/909636/ja

■ Microsoft SQL Server 2000
「Enterprise Manager」で「SQL Server 2000 のプロパティ」より「メモリ」タブを調整することができます。

内容は以下のサイトを参照下さい。
http://www.atmarkit.co.jp/fdb/rensai/drk02/drk02_2.html
※図4 SQL Server 2000のプロパティ画面 ここで、メモリサイズを指定すると上限となります。

sql2000

■ Microsoft SQL Server 2005
「Microsoft SQL Server Management Studio」で「サーバーのプロパティ」より「メモリ」ページで調整することができます。

内容は以下のサイトを参照下さい。
http://www.atmarkit.co.jp/fdb/rensai/drk02/drk02_2.html
※図5 SQL Server 2005のプロパティ画面 ここで、メモリサイズを指定すると上限となります。

sql2005