人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

【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

●質問者: j1987
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● うぃんど
●200ポイント ベストアンサー

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


j1987さんのコメント
回答ありがとうございます。 補足に記入しましたが、maxRequestLengthとmemoryLimitは確認しました。 いただいた情報からは、あと「プロセッサの速度」があやしい部分ではありますが… 処理が遅くてタイムアウトになる、なら分かるのですが、 「システム リソースが不足」という例外で途中で落ちるというのがどうも想像がつきません。 memoryLimitは「利用可能な物理メモリ」の指定とのことですが、 例えば「利用可能な仮想メモリ」という設定があって、それが250MB付近になっている、というようなことはないのでしょうか…? どうしても、使用している仮想メモリが急に倍増するところで落ちる、という挙動が気になっています。。。

j1987さんのコメント
追加です。 リンク先に示されている「ページを表示できません」「サーバー アプリケーションは使用できません。 」などのメッセージは出ず、 Windowsのイベントログにも何もあがってきていません。 (これは、プログラムの方で例外を捕捉して、エラーページに飛ばしてしまっているせいかもしれませんが…)

うぃんどさんのコメント
executionTimeout は?

j1987さんのコメント
Web.configでexecutionTimeout="1200"(直接関係ないかもしれませんがcompilation debug="false")、 sessionState timeout="720"になっています。

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

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

質問者から

・Web.configでmaxRequestLength="307200"としてあります。
・Machine.configでmemoryLimit="60"としてあります。
・VM環境で物理メモリを2GBに増やしても現象変わらず。
・VM環境では、Webサーバ自身でシステムを操作しており(他の接続クライアントなし)、それでも同様の現象。


関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ