QA@IT

IISのメモリー消費内容を調査する方法やメモリー消費を抑える方法についてアドバイスください

27205 PV

始めまして、ASP.NET MVCでWebアプリを作成して1年になる初心者です。
IIS7.5のメモリー消費について質問させてください。
質問の背景についてですが、
1年ほど前よりASP.NET MVCで作成したソリューションを共用レンタルサーバーにデプロイしてASP.NETの技術取得を行っています。
最近になって、レンタルサーバー環境でセッション情報が消えるという現象が発生し、アプリケーションプールのプライベートメモリ設定よるリサイクルが発生していることが判明しました。
その環境では、正確な情報は不明ですがおおよそ100MB程度であればリサイクルは発生しないとのことです。
セッション情報の消失についてはセッションモードをInprocからStateServerに切り替える対応をとりました。
この現象に遭遇するまで、IISのメモリーリソースについては無関心だったのですが、現状のアプリがメモリを過大に消費しているのでは?と心配になってきました。

現在、開発環境上(Windoews7)のIIS7.5でwebアプリを稼働させ、タスクマネージャーでw3wp.exeのメモリ(プライベートワーキングセット)をみると、最初のページを表示した時点で312MB使用しています。また、アプリケーションプールのリサイクル設定でプライベートメモリ使用量を600MBに設定すると、リサイクルは発生しなくなるといった状況です。

今後、レンタルサーバーを変更し、メモリーをまずは1GBまで用意しようと思ってはいるのですが、このアプリをこのまま機能拡張していくと2GBでも不足する状況になってしまうのではと不安です。
経済的な理由からレンタルサーバーのメモリーは2GBで押さえたいのです。

尚現状、ファイルのアップロード機能などは実装していません、また、データベースとのコネクションも都度Disposeをかけています(はずです)。
メモリーを消費する要因を追及したいのですがいい方法はありませんでしょうか?
また、「プライベートメモリ使用量600MB設定はちょっと大きい」とか「リサイクルが発生するのは普通のことなのでこだわるな」などなんでも結構です。アドバイスをお待ちしております。
初心者の漠然とした質問で恐縮ですが宜しくお願いいたします。

回答

ご自分でも Session があやしいと疑っているのですよね? どの程度のサイズのデータを Session に格納しているのでしょうか? 

「Web アプリケーション構築技法」という本の受け売りですが、ユーザー数やハードのスペックなどにもよるので一概に言えないが目安として数 100KB を超える場合は注意が必要とのことです。

運用環境では SQL Server を利用することになると思いますが、その場合でもシリアル化とネットワーク転送のオーバーヘッドの問題で数 100KB を越えるあたりから要注意とのこと。

開発の際に、ある値を超えたら例外をスローして開発者に知らせるようなロジックを組み込んでおくことが提案されてます。

編集 履歴 (1)
  • 早々のご回答ありがとうございました。
    Session のデータサイズにつきましては、以下の情報を参考にさせて頂き、おおむね、2600バイト(2.5KB)に収まっています。[Sessionデータサイズの算出方法](http://www.atmarkit.co.jp/fdotnet/entwebapp/entwebapp06/entwebapp06_03.html)
    設計上からも納得できる値です。
    -
  • ということは、メモリーリークなどの問題があるわけではなくて、100MB の制限が妥当かを知りたいということでしょうか? それは質問者さんの Web アプリの実装しだいなので分かりませんが、自分が試した限りでは 100MB は簡単に超えるので、少なすぎる気がします。 -
  • 「最初のページを表示した時点で312MB使用」が妥当かと聞かれると、それも分かりませんけど、初期画面でそんなに多いということは、何か特別なことをしているようにも思えます。でも、その理由が明確で、メモリーリークの問題はないということであれば、妥当という結論になるかと思いますが。 -
  • ご回答ありがとうございました。
    >>100MB は簡単に超える
    そうなんですね。Webアプリの作成は初めてで、自分のプロジェクトがとんでもないことをしでかしてるのでは?と心配になってきているところでした。サイジングに関する知識がないため、このまま開発を続けてプロジェクトが大きくなってきたら想定しているメモリ2GBでは全く動かなくなるのではと危惧してました。
    引き続き様子見してみます。
    -
  • 「何か特別なことをしている」つもりはないのですが。。「理由」をまだ把握できていません。IISのサイジングに関する情報を取集してみます。ありがとうございました。 -

「リサイクルが発生するのは普通のことなのでこだわるな」

要因はいくつかありますが、リサイクルは発生する前提でシステム設計をするべきです。

リサイクルよりも発生確率は低いかもしれませんが、システムの予期せぬリブートやシャットダウンなどが起こる可能性はゼロではありません、長期の運用を想定しているなら、どれも考慮するべき要素です。

編集 履歴 (0)
  • ご回答ありがとうございました。「リサイクルは発生する前提でシステム設計をするべき」ですね。IISに関する知識が全くなくて、リサイクルについても今回初めて学びました。現在は、セッションモードをInprocからStateServerに替え、リサイクル発生時「もっさり」した操作感にはなりますが、処理継続できています。
    開発の最初から、セッションモードはInproc以外に設定するべきですね。
    -
  • StateService は、ワーカープロセスのリサイクルが発生してもセッションステートを保持してくれますが
    ・StateService に不具合が起きるなどして停止・再起動した時
    ・マシンそのものが停止・再起動した時
    セッションステートは失われてしまいます。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。