2009-05-03 8 views
8

私は最近、光り輝く新しいVPSにASP.NETアプリケーションを配備しました.VPSが共有ホスティングソリューションに与える一般的なパフォーマンスの向上に満足していますが、私はアプリケーションの起動時間に不満です。私のASP.NETアプリケーションを常に "生きている"ように保つ方法は、悪い考えなら、どうしたらいいのですか?

クライアントが最初にヒットすると、Webアプリケーションの起動にかなりの時間がかかります。私はデバッグモードで実行していません(私のweb.configで無効にしています)。起動時に実際に作業する必要はありません。アプリケーションの開始イベントハンドラにコードはありません。余分なスレッド、何も。私のクライアントが初めてアプリケーションに当たると、応答に15〜20秒かかることがあります。私のアプリケーションがシャットダウンするのを数分待たない限り、その後の呼び出しには1〜2秒かかります。その後、15-20秒の起動時間に戻ります。

(私のタイミングベンチマークは非常に非科学的であることを認識しています。これらの数値は、私のアプリの起動時のパフォーマンスを感じるだけのものです)。

私は、IIS(この場合は7.0)が初めて実行されたときにWebアプリケーションをコンパイルしてから、Webアプリケーションが変更されるまでこれらのバイナリをキャッシュすることを理解しました。私の理解は間違っていますか?

だから、その本のサイズの序文の後、ここに私の質問は以下のとおりです。

  • は、ASP.NETのコンパイルの私の理解が間違っていますか?それは実際にどのように機能しますか?
  • IISにバイナリをキャッシュさせる方法や、アプリケーションを無期限に保存する方法はありますか?
  • 私の前の質問でどちらかのことをするのは悪い考えですが、それはなぜ悪い考えですか?代わりにスタートアップのパフォーマンスを向上させるにはどうすればよいですか?

ありがとう!

編集:私の質問はthis questionの少し重複しているようです(私はここでこれに対する答えを探しています。しかし、私の質問はより包括的であり、これに対処するためのより良い、既に尋ねられている質問がない限り、重複していないと感謝します。

+1

他の似たような質問の回答者が提案したのとまったく同じアプローチを提案するつもりでした。あなたは、その質問に対する回答があなたのニーズを満たしていないと確信していますか?私は彼らが状況をかなりうまく説明していると思う。 – DOK

+0

@DOK、あなたのフィードバックのおかげで、他の質問は私の質問の「方法」までは良いものでしたが、私の質問はこの問題の「なぜ」とベストプラクティスの詳細をカバーしていると思います。 –

+1

私はSO上で使用される検索アルゴリズムが本当に悪いと思うので、重複しています。 –

答えて

3

IISは、設定に応じて、指定した時間が経過するとWebアプリケーションをシャットダウンします。私はIIS7とこれを設定する場所に慣れていないので、これを設定する方法について少し研究したいかもしれません(starting point?)。

悪いですか?あなたのコードがどれほど良いかによって異なります。メモリやリソースが漏れていない場合は、おそらくそうではありません。

他の解決策はprecompile your websiteです。これはあなたのためのより良い選択肢かもしれません。しかし、ウェブサイトとのやり取りの仕方によっては、それが下に来るかもしれないので、あなたはそれをチェックして見なければならないでしょう。

+2

上記で説明したように、アプリケーションがメモリからすぐに削除されないようにするには、IISで 'Idle Time-out'を設定する必要があります(デフォルトは20分です)。これは、プリコンパイルに加えて、最大値は、アプリケーションプールのリサイクル時間とそれ自身の上限によって制限されます。 アプリケーションプール> [使用中のプール]> [詳細設定]> [アイドルタイムアウト] – rjarmstrong

2

私は、IIS(この場合は7.0)が初めて実行されたときにWebアプリケーションをコンパイルしてから、Webアプリケーションが変更されるまでこれらのバイナリをキャッシュすることを理解しました。私の理解は間違っていますか?

これは間違いありません。具体的には、アセンブリはシャドウコピーとして作成されます(ボリュームスナップショットサービス/シャドウコピー機能と混同しないでください)。これにより、既存の実行セッションに影響を与えずに、フォルダ内のコードをオンザフライで置き換えることができます。 ASP.NETは変更を検出し、新しいバージョンをターゲットディレクトリにコンパイルします(通常Temporary ASP.NET Files)。そのプロセスの詳細:Understanding ASP.NET Dynamic Compilation

1

純粋にコンパイル時には、しばしば最も効率的な方法は、リサイクル後に自分でウェブサイトをヒットすることです。定期的に電話をして、クライアントではなく15秒遅れていることを確認してください。

しかし、それはすべてのコンパイル時間(ハードウェアによって異なる)であれば驚くでしょう - クラスの静的インスタンスがたくさんありますか?彼らはスタートアップ時に多くの作業をしますか?

トレースやプロファイリングのいずれかを使用すると、起動時間がどこで費やされたかがかなり早く分かります。

なぜプロセスを維持するのが悪い考えであるかについては、私はそれがクリアアップされていると考えています。私たちがデータをどの程度うまくやっていても、GCがどれくらいうまく動作していても、プロセスを再起動することで正常に完了します。断片化のようなものは消え去り、時間の経過とともに蓄積する他のリソースの問題は解決されます。したがって、サーバープロセスを無期限に実行し続けることは、非常に悪い考えです。

関連する問題