【ASP.NET】システム リソースが不足しているため、要求されたサービスを完了できません


ASP.NETで作成されたWebシステム(イントラ)があり、
100MBのファイルをアップロードをしようとすると、標題の例外が発生します。
50MBであればアップできることは確認できています。

エラー発生時にタスクマネージャを監視したところ、
w3wp.exeが使用する仮想メモリが徐々に増えていき、
130MB程度に到達するや一気に250MB超に変化し、
そこで例外発生→140MB程度に戻る…という変化を辿っています。

なお、このシステムは他社が開発したもので、ソースの改編は
容易にはできないため、できれば.NET、IIS、ハードウェア等の
設定で対応したいと考えています。
これらの情報から、疑わしいと思われる設定値等があればご教示ください。
よろしくお願いします。

※環境
OS:Windows Server 2003 R2 Standard Edition SP2
物理メモリ:1GB(仮想メモリは大きくしても現象は解消しませんでした)
.NET Framework:Ver1.1.4322

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/08/31 16:40:24
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:windofjuly No.1

回答回数2625ベストアンサー獲得回数1149

ポイント200pt

ASP.NETのアップロード耐性は非常に低く(デフォルト4MB、推奨10MB-20MB)、
設定変更で50MBに引き揚げているだけですね。

100MB以上に変更は可能ですが、安定運用のためにはWindowsファイル共有やFTP転送といった別の方法を併用したほうが良いでしょう。

詳細は下記、MSのナレッジベース参照。
http://support.microsoft.com/kb/323245/ja

デフォルトでは、ASP.NET では 4,096 KB (4 MB) 以下のファイルのみを Web サーバーにアップロードすることができます。これよりも大きなファイルをアップロードするには、Web.config ファイルの <httpRuntime> セクションの maxRequestLength パラメータを変更する必要があります。

ASP.NET では、アップロード中に、ファイル全体をメモリに読み込んでからファイルをディスクに保存します。このため、Machine.config ファイルの processModel タグにある memoryLimit 属性の設定によって、このプロセスがリサイクルされることがあります。memoryLimit 属性では、プロセスが自動的にリサイクルされるまで ASP.NET ワーカー プロセスで利用可能な物理メモリをパーセンテージで指定します。プロセスをリサイクルすることによって、メモリ リークによる ASP.NET のクラッシュや応答の停止を防止します。

また、アップロード可能な最大ファイル サイズに影響を与える要因は他にもあります。これには、使用できるメモリ、ハード ディスクの空き領域、プロセッサの速度、および、現在のネットワーク トラフィックが含まれます。標準的なトラフィックでファイル アップロードが行われている場合、10 ~ 20 MB の範囲の最大ファイル サイズを使用することをお勧めします。ファイルのアップロードをまれにしか行わない場合は、最大ファイル サイズを 100 MB に設定することもできます。

注 : ASP.NET では 100 MB を超えるファイルをアップロードできますが、アップロードするファイルの最大サイズについては、この資料に記載されている内容に従うことを推奨します。ファイルの最大アップロード サイズをより厳密に決定するには、実際の運用環境に近いコンピュータでストレス テストを実行してください。

他4件のコメントを見る
id:windofjuly

以下の記事を見つけました。参考になるかもしれません。
http://d.hatena.ne.jp/griefworker/20110531/windows_azure_webrole_upload

2012/08/30 17:08:55
id:j1987

情報ありがとうございます。
こちらの内容を見ていて、IISのバージョンを書いていないことに気づきました。
IISは6.0です。
requestFilteringはIIS7.0から導入されたみたいですね。
IIS6.0でrequestFilteringにあたるものはurlscanというアドオンらしいのですが、
これは使用していないので、該当しませんでした。
また、Metabase.xmlのAspMaxRequestEntityAllowedを修正する、といった情報もありましたが、
これを拡張しても現象は変わりませんでした。

2012/08/31 09:10:17

その他の回答0件)

id:windofjuly No.1

回答回数2625ベストアンサー獲得回数1149ここでベストアンサー

ポイント200pt

ASP.NETのアップロード耐性は非常に低く(デフォルト4MB、推奨10MB-20MB)、
設定変更で50MBに引き揚げているだけですね。

100MB以上に変更は可能ですが、安定運用のためにはWindowsファイル共有やFTP転送といった別の方法を併用したほうが良いでしょう。

詳細は下記、MSのナレッジベース参照。
http://support.microsoft.com/kb/323245/ja

デフォルトでは、ASP.NET では 4,096 KB (4 MB) 以下のファイルのみを Web サーバーにアップロードすることができます。これよりも大きなファイルをアップロードするには、Web.config ファイルの <httpRuntime> セクションの maxRequestLength パラメータを変更する必要があります。

ASP.NET では、アップロード中に、ファイル全体をメモリに読み込んでからファイルをディスクに保存します。このため、Machine.config ファイルの processModel タグにある memoryLimit 属性の設定によって、このプロセスがリサイクルされることがあります。memoryLimit 属性では、プロセスが自動的にリサイクルされるまで ASP.NET ワーカー プロセスで利用可能な物理メモリをパーセンテージで指定します。プロセスをリサイクルすることによって、メモリ リークによる ASP.NET のクラッシュや応答の停止を防止します。

また、アップロード可能な最大ファイル サイズに影響を与える要因は他にもあります。これには、使用できるメモリ、ハード ディスクの空き領域、プロセッサの速度、および、現在のネットワーク トラフィックが含まれます。標準的なトラフィックでファイル アップロードが行われている場合、10 ~ 20 MB の範囲の最大ファイル サイズを使用することをお勧めします。ファイルのアップロードをまれにしか行わない場合は、最大ファイル サイズを 100 MB に設定することもできます。

注 : ASP.NET では 100 MB を超えるファイルをアップロードできますが、アップロードするファイルの最大サイズについては、この資料に記載されている内容に従うことを推奨します。ファイルの最大アップロード サイズをより厳密に決定するには、実際の運用環境に近いコンピュータでストレス テストを実行してください。

他4件のコメントを見る
id:windofjuly

以下の記事を見つけました。参考になるかもしれません。
http://d.hatena.ne.jp/griefworker/20110531/windows_azure_webrole_upload

2012/08/30 17:08:55
id:j1987

情報ありがとうございます。
こちらの内容を見ていて、IISのバージョンを書いていないことに気づきました。
IISは6.0です。
requestFilteringはIIS7.0から導入されたみたいですね。
IIS6.0でrequestFilteringにあたるものはurlscanというアドオンらしいのですが、
これは使用していないので、該当しませんでした。
また、Metabase.xmlのAspMaxRequestEntityAllowedを修正する、といった情報もありましたが、
これを拡張しても現象は変わりませんでした。

2012/08/31 09:10:17
id:j1987

質問者から

j19872012/08/31 10:23:37

・Web.configでmaxRequestLength="307200"としてあります。

・Machine.configでmemoryLimit="60"としてあります。

・VM環境で物理メモリを2GBに増やしても現象変わらず。

・VM環境では、Webサーバ自身でシステムを操作しており(他の接続クライアントなし)、それでも同様の現象。

8/31追記

同じ設定で他のVMサーバにて動かしたところ、

100MBのファイルでもアップロードできるケースがあることが判明しました。

よって、設定の問題ではなく、パフォーマンス面の問題である可能性が高くなってきました。

そうなると、やはり仮想メモリの挙動が気になってくるところですが…

これはCPUの処理能力、HDDのアクセス速度等によっても影響されるところなのでしょうか…?

(どのタイミングで「リソース不足」と判断するのか、その指標値みたいなものがある?)

このあたりのことについて、情報を戴けると助かります。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません