IISの遅い初期ロードの修正


129

IISには、未使用のワーカープロセスをリサイクルする低トラフィックのWebサイト向けの迷惑な機能があり、しばらくすると最初のユーザーがサイトにアクセスし、非常に長い遅延(30秒以上)が発生します。

私は問題の解決策を探していましたが、これらの潜在的な解決策を見つけました。

A. アプリケーション初期化プラグインを使用する

B. .NET 4で自動起動を使用する

C. アイドルタイムアウトを無効にする(IISリセット時)

D. サイトをプリコンパイルする

これらのうちどれが好ましいのでしょうか。さらに重要なのは、なぜ同じ問題に対して非常に多くの解決策があるのでしょうか。(私の推測では、そうではなく、私は何かを正しく理解していないだけです)。

編集する

実行Cは暖め、私のサイトを維持するのに十分であるように思わが、私は自分のサイトの遅さの本当のルートは、私はそれが風邪を起こっている理由を把握することができないようEntity Frameworkの、に関係していることを発見しました。残念ながらまだ答えられていないこの質問を見てください!

最終的には、ウォームアップスクリプト作成して、たまに自分のサイトにアクセスして、スピーディな状態を維持する必要がありました。


こんにちは、Performing Cで十分ですか?どうして ?私たちはそれを使用する必要があるだけですか、リサイクルも無効にする必要がありますか?IIS7.5の2日目の最初のリクエストは非常に遅いといつも感じています
qakmak

回答:


36

オプションA、B、Dは、最初の開始時間にのみ影響を与えるため、同じカテゴリーにあるようです。コンパイルやライブラリーのメモリーへのロードなど、Webサイトのウォームアップを行います。

Cを使用してアイドルタイムアウトを設定することで、サーバーへの後続のリクエストが高速に処理されるようになります(アプリプールの再起動には数秒程度の時間がかかります)。

私の知る限り、タイムアウトは、そのマシンで並行して実行されている他のWebサイトが必要とする可能性があるメモリを節約するために存在します。価格は、ロード時間が1回遅いことです。

ユーザーが非アクティブの場合にアプリプールがシャットダウンされるという事実に加えて、アプリプールはデフォルトで1740分(29時間)ごとにリサイクルされます。

テクネットから:

インターネットインフォメーションサービス(IIS)アプリケーションプールを定期的にリサイクルして、アプリケーションのクラッシュ、ハング、またはメモリリークにつながる不安定な状態を回避できます。

アプリプールのリサイクルがオンになっている限り、それで十分です。ただし、ほとんどのコンポーネントで最高のパフォーマンスが本当に必要な場合は、前述のアプリケーション初期化モジュールのようなものも使用する必要があります。


アイドルタイムアウトを無効にすることをお勧めしますか?それは問題を引き起こしますか(理由があると思います)?
Cavyn VonDeylen、2012年

3
これは実際には私の問題を修正しません(私の編集を参照してください)が、私の元の質問に答えてくれたので受け入れた。
Cavyn VonDeylen、2012年

10

ウェブホスティングチャレンジ

私たちの多く(小規模の企業や個人)と同じように、共有サーバーでホストされている場合は、どのマシン構成オプションも使用できないことに注意してください。

ASP.NET MVCオーバーヘッド

サイトが20分以上ヒットしなかった(そしてWebアプリが停止した)場合、少なくとも30秒かかります。ひどいです。

パフォーマンスをテストする別の方法

それがASP.NET MVCの起動か何かであるかをテストする別の方法があります。直接ヒットできる通常のHTMLページをサイトにドロップします。
問題がASP.NET MVCの起動に関連している場合、Webアプリが起動されていなくても、HTMLページはほとんどすぐにレンダリングされます。
これが、ASP.NET MVCの起動に問題があることを最初に認識した方法です。私はいつでもHTMLページをロードしましたが、非常に高速にロードされました。次に、そのHTMLページにアクセスした後、ASP.NET MVC URLの1つにアクセスし、Chromeメッセージ「Watting for raddev.us ...」が表示されます。

役立つスクリプトを使用した別のテスト

その後、私はLINQPad(http://linqpad.netをチェックしてください)スクリプトを8分ごとに(つまり、アプリがアンロードされるまでの時間-20分未満)ヒットするスクリプトを書いて、それは数時間実行されます。

スクリプトが実行されている間、私は自分のWebサイトにアクセスし、毎回私のサイトが非常に高速に起動しました。これは、私が経験していた遅いのはASP.NET MVCの起動時間が原因である可能性が高いと考えています。

LinqPadを入手すると、次のスクリプトを実行できます。URLを自分のURLに変更して実行するだけで、簡単にテストできます。幸運を。

:LinqPadでは、F4キーを押してSystem.Netへの参照を追加し、ページを取得するライブラリを追加する必要があります。

また:エンジンが実行されるように、ASP.NET MVCサイトからルートをロードするURLを指すように文字列URL変数を必ず変更してください。

System.Timers.Timer webKeepAlive = new System.Timers.Timer();
Int64 counter = 0;
void Main()
{
    webKeepAlive.Interval = 5000;
    webKeepAlive.Elapsed += WebKeepAlive_Elapsed;
    webKeepAlive.Start();
}

private void WebKeepAlive_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    webKeepAlive.Stop();
    try
    {
        // ONLY the first time it retrieves the content it will print the string
        String finalHtml = GetWebContent();
        if (counter < 1)
        {
            Console.WriteLine(finalHtml);
        }
        counter++;
    }
    finally
    {
        webKeepAlive.Interval = 480000; // every 8 minutes
        webKeepAlive.Start();
    }
}

public String GetWebContent()
{
    try
    {
    String URL = "http://YOURURL.COM";
    WebRequest request = WebRequest.Create(URL);
    WebResponse response = request.GetResponse();
    Stream data = response.GetResponseStream();
    string html = String.Empty;
    using (StreamReader sr = new StreamReader(data))
    {
        html = sr.ReadToEnd();
    }
    Console.WriteLine (String.Format("{0} : success",DateTime.Now));
    return html;
    }
    catch (Exception ex)
    {
        Console.WriteLine (String.Format("{0} -- GetWebContent() : {1}",DateTime.Now,ex.Message));
        return "fail";
    }
}

3

完全に制御できるので、アイドル状態のWebサイトにアクセスするためのpingサービス/スクリプトを作成するのが最も良い方法です。あなたが言及した他のオプションは、専用のホスティングボックスをリースしている場合に利用できます。

共有ホスティングスペースでは、ウォームアップスクリプトが最高の第一レベルの防御です(セルフヘルプが最良のヘルプです)。これは、独自のWebアプリケーションからそれを行う方法についてのアイデアを共有する記事です


誰かが同じスレッドを検索した場合に備えて、この古いスレッドを更新しました
David Chelliah

2

Bを使用するのは、ワーカープロセスのリサイクルと組み合わせることで、リサイクル中に遅延が発生するだけだからです。これにより、アイドル後の最初の要求に応じて、初期化に通常伴う遅延が回避されます。また、リサイクルのメリットを維持できます。


2

定期的にサイトにpingを送信するための適切なオプションは、Microsoft Flowを使用することです。これは、毎月最大750回の実行が無料です。毎時間サイトをヒットしてフローを維持するフローを作成するのは非常に簡単です。サイトの複数のヒットを分離する遅延のある単一のフローを作成することで、上限の750を回避することもできます。

https://flow.microsoft.com


1

パフォーマンスの問題を解決するためのヒントについては、この記事を参照してください。これには、「コールドスタート」セクションにある起動に関連する両方のパフォーマンスの問題が含まれます。ローカルまたは本番環境で使用しているサーバーのタイプに関係なく、これのほとんどは重要です。

http://blogs.msdn.com/b/mcsuksoldev/archive/2011/01/19/common-performance-issues-on-asp-net-web-sites.aspx

アプリケーションがXML(およびWebサービスを含む)から何かを逆シリアル化する場合は、逆シリアル化に関連するすべてのバイナリに対してSGENが実行されていることを確認し、結果のDLLをグローバルアセンブリキャッシュ(GAC)に配置します。これにより、SGENが実行されたアセンブリで使用されるすべてのシリアル化オブジェクトがプリコンパイルされ、結果のDLLにキャッシュされます。これにより、ディスクからの構成ファイルの最初の逆シリアル化(読み込み)とWebサービスへの最初の呼び出しにかかる時間を大幅に節約できます。 http://msdn.microsoft.com/en-us/library/bk3w6240(VS.80).aspx

IISサーバーがインターネットへの発信アクセスを持たない場合は、generatePublisherEvidence =” false”をmachine.configに追加して、Authenticodeバイナリの証明書失効リスト(CRL)チェックをオフにします。それ以外の場合、CRLリストを取得するためにインターネットに接続しようとするとタイムアウトになり、起動中にすべてのワーカープロセスが20秒以上ハングする可能性があります。 http://blogs.msdn.com/amolravande/archive/2008/07/20/startup-performance-disable-the-generatepublisherevidence-property.aspx

http://msdn.microsoft.com/en-us/library/bb629393.aspx

すべてのアセンブリでNGENを使用することを検討してください。ただし、注意深く使用しないと、パフォーマンスはあまり向上しません。これは、各プロセスによってロードされるすべてのバイナリのベースロードアドレスが、重複しないようにビルド時に注意深く設定する必要があるためです。アドレスの衝突のために、ロード時にバイナリをリベースする必要がある場合、NGENを使用することによるパフォーマンスの向上はほとんど失われます。 http://msdn.microsoft.com/en-us/magazine/cc163610.aspx


0

4分間何も操作しないと、最初のリクエストで一貫して15秒の遅延が発生していました。私の問題は、アプリがSQL Serverに対してWindows統合認証を使用しており、サービスプロファイルがサーバーとは異なるドメインにあることでした。これにより、アプリの初期化時にIISからSQLへのクロスドメイン認証が発生しました。これが私の遅延の本当の原因でした。Windows認証の代わりにSQLログインを使用するように変更しました。遅れはすぐになくなった。パフォーマンスの向上に役立つように、すべてのアプリ初期化設定をまだ用意していますが、私の場合、それらはまったく必要なかった可能性があります。

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