141

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

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

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

B..NET4で自動起動を使用する

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

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

私はこれらのどれが好ましいのか疑問に思っています、そしてもっと重要なことに、なぜ同じ問題に対してこれほど多くの解決策があるのですか?(私の推測では、彼らはそうではなく、私は何かを正しく理解していないだけです)。

編集

Cを実行することでサイトをウォームアップするのに十分なようですが、サイトの速度低下の本当の原因はEntity Frameworkに関係していることがわかりました。これは、なぜ寒くなるのか理解できないようです。残念ながらまだ回答されていないこの質問を参照してください。

最終的には、サイトをスピーディーに保つために、時々自分のサイトにアクセスするためのウォームアップスクリプトを作成する必要がありました。

4

7 に答える 7

40

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

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

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

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

technetから:

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

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

于 2012-11-14T20:12:08.080 に答える
10

Webホスティングチャレンジ

私たちの多く(中小企業や個人)がそうであるように、共有サーバーでホストされている場合、マシン構成オプションはどれも利用できないことを覚えておく必要があります。

ASP.NETMVCオーバーヘッド

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

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

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

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

その後、8分ごとに(アプリがアンロードされる時間よりも短い時間である20分)WebサイトにアクセスするLINQPad(詳細についてはhttp://linqpad.netを確認してください)スクリプトを作成しました。それは何時間も実行されます。

スクリプトの実行中に、私は自分のWebサイトにアクセスし、サイトが非常に速く起動するたびにアクセスしました。これにより、ASP.NETMVCの起動時間が原因で速度が低下した可能性が高いと考えられます。

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

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

また、String URL変数を変更して、 ASP.NETMVCサイトからルートをロードする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";
    }
}
于 2016-08-11T01:26:49.267 に答える
3

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

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

于 2016-05-21T22:09:10.287 に答える
2

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

于 2012-11-14T20:31:57.887 に答える
2

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

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

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

IISサーバーにインターネットへの発信アクセスがない場合は、machine.configにgeneratePublisherEvidence =” false”を追加して、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

于 2015-10-28T21:20:01.610 に答える
2

スケジュールに従ってサイトにpingを実行するための適切なオプションは、Microsoft Flowを使用することです。これは、1か月あたり最大750回の「実行」が無料です。サイトを暖かく保つために、1時間ごとにサイトにヒットするフローを作成するのは非常に簡単です。サイトの複数のヒットを分離する遅延を伴う単一のフローを作成することにより、750の制限を回避することもできます。

https://flow.microsoft.com

于 2016-11-27T20:40:21.033 に答える
0

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

于 2019-08-22T20:10:15.800 に答える