再起動するたびに、ローカルの.NETサイトが初めてロードするのに時間がかかるのはなぜですか?[閉まっている]


27

.NETプラットフォームに基づいてサイトを開発しています。通常、これらのサイトをローカルIISに展開します。これにより、稼働する前にそれらをテストして機能を確認できます。ただし、Windowsを再起動するたびに、サイトの初回実行に時間がかかるようです。

私はJITについて知っていますが、この質問にも気づいていますが、私の質問には答えません。

JITは、ウィンドウを再起動するたびに発生しますか?w3wp.exeプロセスの作成に関連していますか?再起動後の最初のリクエストでサイトが非常に遅いのはなぜですか?


3
これは「コールドスタート」または何かとして知られています。システム等、また、関連するすべてのDLLを必要とする、メモリへのw3wpをロードおそらくJITもの、プロセスのインポートテーブル、それはRAMキャッシュにないよう、ディスクからデータを読み取るために持っている
コーダー

@Coder、あなたのコメントに対して+1。しかし、私と他の開発者が利益を活用できるように、答えでもっと説明してください。:)
サイードネアマティ

IISは私の専門ではないので、誰かがより良い答えをすることを願っています。ここで私はしばらく前に開始した同様のトピックですstackoverflow.com/questions/3807791/cold-startup-optimizationを多分それはいくつかのより多くのを助けるでしょうが。
コーダー

4
この質問は、概念的なプログラミングの問題ではなく、実装の問題に関するものであるため、トピック外のようです。

回答:


32

この問題はJITコンパイルです。アプリケーションプールは、ライブラリの処理を開始する前にライブラリを構築する時間が必要です。これは、ウォームアップスクリプトを使用して高速化できますが、発生する必要があるものです。また、Webサイトを使用しているか、Webアプリケーションプロジェクトを使用しているかによっても異なります。WebサイトはすべてのページのJITであるため、最初のヒットは遅く、新しいページのヒットごとに余分なコンパイル時間があります。Webアプリケーションプロジェクトはプリコンパイルされているため、このヒットがひどく受けることはありませんが、ライブラリをロードする必要があります。ライブラリ/ツールが多ければ多いほど、このヒットは悪化する傾向があります。ウォームアップについて説明するリンクを次に示します。

http://weblogs.asp.net/gunnarpeipman/archive/2010/01/22/iis-application-warm-up-module.aspx http://blogs.iis.net/steveschofield/archive/2009/05/30 /application-pool-warm-up.aspx https://stackoverflow.com/questions/2063461/iis-web-applications-warmup http://sharepoint.smayes.com/2011/06/application-pool-specific-warm -up-scripts /


6
これはほとんど正しいですが、コンパイルとジッターには違いがあり、この回答では明確ではありません。Jittingは、.NETバイトコードをマシンコードにコンパイルしています。ASP.NETは、実際にWebアプリケーションプロジェクトでも(aspnet_compilerを使用しない限り)それらのWebページをコンパイルしています。コンパイル/ビルド時間に加えて、ジッターおよびライブラリのロード時間がすべて非常に遅い理由です。
アーロンノート

JITはジャストインタイムの略です。コンパイルされるコードのタイミングと量を超えて、「ジッター」と「コンパイル」の間に違いはありません。また、JITコンパイルは、ページごとではなく、訪問されていないコードごとにのみ行われます。たとえば、同じテンプレートを使用する場合、コンパイルは必要ありません。もちろん、ライブラリが増えるとコンパイルにかかる時間が長くなるという発言は完全に真実です。
コーネリアス

9

最初の要求に対する反応が遅いのは、IISが最初の着信要求でのみサイトまたはアプリケーションプールを開始/ロードするためです。そして、一定の時間が経過した後、サーバーに新しい着信要求が届かない場合、IISはサイトを再度停止します(アプリプールのリサイクル)。

ASP.NET 4.0には、自動起動と呼ばれる新しい機能があります。この機能を使用すると、アプリケーションプールまたは個々のサイトを設定して、要求の前に自身を開始できます。これは、起動時(IISの起動時)またはASP.NETサイトの更新時(サイトの停止時)にトリガーされます。

<applicationPools>
    <add name="MyAppPool" managedRuntimeVersion="v4.0" startMode="AlwaysRunning" />
</applicationPools>

<sites>
    <site name="MySite" id="1">
        <application path="/" serviceAutoStartEnabled="true" />
    </site>
</sites>

これを使用するにはIIS 7.5が必要です。

たとえば、自動起動が開始されたときに特定の追加タスクを実行するオプションもあります。データをキャッシュにプリロードします。


通常、Webサーバーに配置する前にサイト全体をコンパイルするため、最初の要求でコードをコンパイルする必要はありません。JITは、Webサイトでソースコードを公開するApp_codeフォルダーを使用するサイトでのみ使用されます。
スティーフ

2

問題の一部はGACでもあります。ライブラリは、ロードするたびにセキュリティをチェックする必要があります。つまり、暗号化タイプの作業がすべて実行されるため、処理が大幅に遅くなります。この問題を説明したMSからしばらく前にWPFのパフォーマンスについての話がありました-彼らの答えは「あなたがそれを助けることができないならGACに物を入れないでください」でした


1
それは二重の否定を避けるために「それを助けることができる」べきである
リチャードSzalay 14年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.