QA@IT

ASP.NET Application Initialization Module 使用方法

6810 PV

現在下記環境でASP.NET Web アプリケーションを開発しています。
開発環境:Windows7 Professional 32bit/Visual Web Developer 2010 Express/C#
サーバー:Windows Server 2008 R2/IIS 7.5/ASP.NET4/Framework 4.0
ブラウザ:IE9
プログラム更新後の初期起動がとても遅いため下記サイトを参考に
Application Initialization Moduleをインストールしました。
http://blogs.gine.jp/kusa/archives/1902
なんとかweb.configに設定しているremapManagedRequestsTo="iisstart.html"のページを表示することができ、
プロセスでw3wp.exeが動いていることが確認できたのですが、相変わらずプログラム更新後は初期起動が遅いままです。
(web.configの設定は上記サイトと同様にしています。)
アプリケーション全体のページを予めコンパイルさせたい場合にはどうすれば良いのでしょうか?
また、このApplication Initialization Moduleはプログラム更新時に自動的にコンパイルしてくれるのでしょうか?
(更新方法は、Visual Web Developerの発行で行っています。)
勉強不足で申し訳ないのですが、ご教授お願いいたします。

  • MVC なのか Web Forms なのか、どちらですか? Web Forms の場合、Web サイトプロジェクト or Web アプリケーションプロジェクトのどちらで作っているのですか? -
  • Web FormsでWeb アプリケーションプロジェクトで作成しています。 -
  • Web アプリケーションプロジェクトであれば、開発環境でコンパイルした .dll をサーバーにアップロードすることになるのでプリコンパイルうんぬんの問題ではないと思うのですが・・・ IIS でアプリケーションプールを再起動するだけで同じ問題が出るのではないですか? -
  • SurferOnWwwさんにWebアプリorサイトを尋ねられて調べたところプリコンパイルが関係ないことが分かりました。仰る通り、アプリケーションプールの再起動で同じことが起こります。この問題は、回避できないのでしょうか? -
  • 「既製品の表コントロール」を使う前は問題なかったのですよね? そうであれば、「既製品」のメーカーに聞いた方がいいと思うのですが・・・ ひょっとして ClosedXML とかですか? -
  • SPREAD for ASP.NETというものです。
    メーカーに問い合わせたところ、同じ事例があるが原因が分かっていないとのことでした。
    今まで標準のGridViewでも若干初期起動の遅れはあったのですが、特に気になるほどではありませんでした。
    -
  • メーカーでも分からないとなると、少なくとも自分には初期化に時間がかかる原因も解決策もわかりません。 -
  • トライアル版で評価している段階なのでもう少し検討してみようと思います。
    貴重な意見をくださり、ありがとうございました。
    -
  • ワーカープロセスの再起動時に時間がかかるのが一番の問題だと思いますが、それは再起動を影響の少ない深夜に設定し、質問者さんが導入した Application Initialization Module で影響をミニマムに抑えることはできるのではないですか? プログラムの更新も影響の少ない時間にできるでしょうし。 -

回答

返事が遅れてしまい申し訳ございません。
SurferOnWwwさんの仰る様に影響の無い時間にApplication Initialization Moduleでウォームアップさせる方法を取りたいと思います。ありがとうございます。
SurferOnWwwさんのコメントをベストアンサーとしたいです。
ただ、色々試してはいるのですがいまいち求めている結果が得られません。
Application Initialization Moduleはアプリケーションプールがリサイクルしたタイミングでウォームアップを開始してくれるのでしょうか?
また、web.configのadd initializationPageにはウォームアップさせたいページを指定すれば良いのでしょうか?

編集 履歴 (0)
  • 参考にされている記事にも書いてあるように、初回実行時のリクエスト処理を高速化するために、このモジュールを使わない場合はリサイクルされた後の初回リクエストの際に行われる初期化をあらかじめやっておくというのが目的です。どうやって試しているか分かりませんが、その目的に沿った試し方をしているでしょうか? -
  • initializationPage というのは自分は知らなかったのですが、参考にされている記事を読む限り初期化中でアプリが実行できないときに一時的に表示しておくページのようですが? 何にせよ、初期化するのはアプリケーション全体であって、特定のページは関係ないです。 -
  • MSDN ブログの記事もご参考に紹介しておきます。
    http://blogs.msdn.com/b/chack/archive/2013/09/25/using-aspnet-iis-auto-start-on-windows-azure-cloud-services.aspx
    -

既製品て、市販の製品ですかね?
起動の遅さですが、30秒以上とか異常に遅かったりしますか?
また、遅いときの、プロセスのCPU使用率はどうなっているでしょうか?
※ほとんど0なのか、コア一つ分は占有していそうか?

あくまで可能性の一つとしての話ですが、もしCPUをほとんど使ってなくて、何十秒も待たされるようなら、既製品のdllにデジタル署名がついているか確認してみてください。

編集 履歴 (0)
  • SPREAD for ASP.NETというものです。
    サーバー処理が18秒ほどかかっています。
    サーバーのCPU使用率は、0%→25%ほどまで上がっていました。
    dllのデジタル署名は、プロパティを見てもデジタル署名タブは出ていませんでした。
    (デジタル署名はついていないということでしょうか?)
    -
  • それだと違うようですね。忘れてください。
    署名付きアセンブリをインターネットに直接接続できない環境で使うと、CRLのダウンロードでタイムアウトするまで止まるという現象があったりするのです。
    デジタル署名がなくて、CPU負荷もあるなら関係ないですね。
    -
  • よく考えたらこの現象は4以降では起こらなくなったはずなのでどちらにしても関係なかったですね… -

nachaさんありがとうございます。
既製品の表コントロールを使用した際に非常に遅くなってしまったので、
それが原因だと思います。

ですので、プログラム更新時などの再起動処理は早くなりません。

そうなのですね。ありがとうございます。

アプリケーション自身の初期処理が重い場合、プリコンパイルもあまり効果はありません。

検索したらプリコンパイルの方法としてaspnet_compiler.exeを使用する方法があったのですが
これでも初回起動時と2日目以降の表示時間の差分を無くすことは難しいのでしょうか?
aspnet_compiler.exeを使ってコンパイルしようと試みているのですが、エラーが出てしまい
うまく扱えていません。

編集 履歴 (0)
  • 特にWebアプリケーションの場合、UIコード部分以外(正確ではないですが)はすでにコンパイル済みですので、効果は限定されますし、たいていの場合そこまで大きな差にはなりません。
    もちろん試してみるのがいいとは思いますが。
    ちょっと覚えてないですが、発行のオプションとかでプリコンパイルの指定って出来ないんでしたっけね?
    -
  • 簡単なプロジェクトで試してみたのですが、ほとんど変化がありませんでした。
    発行オプションのプリコンパイルは"Can't find the valid AspnetMergePath"というエラーが出てしまい出来ませんでした。MSDNにもExpressEditionではサポートされていないと書かれていました。
    -

起動が遅いのは、たいていの場合アプリケーション自身の初期処理が重いからです。
件のモジュールは、起動が遅いからあらかじめ起動しておく、と言うものであって、起動処理そのものが早くなるわけではありません。
ですので、プログラム更新時などの再起動処理は早くなりません。
アプリケーション自身の初期処理が重い場合、プリコンパイルもあまり効果はありません。
あまりに遅い場合は、できれば起動処理そのものを見直すことが望ましいです。

編集 履歴 (0)
ウォッチ

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