2017-12-20 13 views
1

現在、ASP.NET MVC4アプリケーションをMicrosoft Azureにデプロイした後、非常に面倒なパフォーマンスの問題が発生しています。アプリを再起動した直後(または何も操作していない状態)に、最初のページを読み込むのに約15秒かかることがあります。その後、クライアントサイドのキャッシュをクリアしても、それらのページは約2秒でロードされます(これはまだ改善が必要ですが、15秒よりも優れています)。ASP.NET MVC4ページの読み込みが極端に遅いMicrosoft Azure

ここで私はすでにこれまでに試したものです:

  • 私はパブリッシュ設定を変更するダミーコード
  • でデータベース関連のコードを置き換えるために、Global.asaxの中のすべてのイベントを通じてコーマ: «パブリッシュ中にプリコンパイル»(すべての出力を1つのアセンブリにまとめます)
  • アズールの«App Performance Analysis»によると、私のアプリは«健康»とみなされます
  • «常にオン»はポータルのアプリケーション設定B1 [Basic、1 Core、1 0.75ギガバイトRAM]、したがって、私は常にオンスイッチは、共有ランタイム設定で上書きされないことを前提とし)

上記弾丸のどれも私がkeppalive-仕事を書くことを試してみた私の問題を解決していないので、定期的にこのようなウェブサイトを要求Quartz.NET使用して:私の場合(

new System.Net.WebClient().OpenRead("https://foo.azurewebsites.net");

を、私は効果がhere述べたようにのWeb.Config内initializationPagesを宣言するとほぼ同じだと思う、ではありませんそれ?)

結果:動作しますが、この特定のURLのみです。すべての可能なルートのリストを確実に維持することは、行く方法ではありません。

この問題に対処したことはありますか?私はあなたの入力を非常に感謝しています!

答えて

2

azureでホストされている組織で働いていたのはしばらくありましたが、実際にはアイドルタイムアウトを0に設定することと同等の「Always On」というラベルを付けることができましたアプリケーションプールに保存し、アプリケーションをメモリにロードしたままにしておきます。あなたのサイトはトラフィックがなく、最初のヒット時にJITに強制されます(初期展開後のように)。

「常時接続」オプションを提供していない低価格層に加入していたときにトラフィックを増やし、メモリからの負荷を避けるために、自分のサイトに模擬HTTPリクエストを作成している人もいました。

編集:ここにある別のSO、それに対処ポスト:私は私が最終的にこの問題に対処する方法を詳細に説明したかった受け入れ答えに加えてApp pool timeout for azure web sites

+0

ありがとうございます。私は言及することを忘れていた:アプリケーションの価格層はB1(無料でも共有計画でもない)です。したがって、この場合、「常にオン」オプションは、それが想定していることを行うべきだと私は思う。ではない?私は質問を更新します。 HTTPリクエストを模擬するのは、まさに私が避けようとしているものです。これは、URLのリストを維持することを意味するためです。 – Alan

+0

@Alan ...これが答えです。私はあなたの状況にちょうどそれを使用します –

+0

私たちはJITコンパイラにそれを暖めるために各ページのHTTPリクエストを嘲笑することはできませんね。 :)私は最終的に自分自身に満足した解決策を詳細に説明する新しい答えを投稿します。しかし、私は正しい方向に私を導くので、私はこの答えを受け入れたものとしてマークします。両方のおかげで、トラビス&ビッグダディ! +1 – Alan

0

。たぶんこれは将来誰か他の人を助けるかもしれない。 重要なサイトでWebリクエストをトリガーするだけで、起動時にアプリケーションをウォーミングアップするコードを書きました(私はこれを1ページごとに行う必要があるという経験をしましたが、ルートアドレスをウォームアップするだけでは不十分です) 。

private void WarmUp() 
{ 
    var baseUrl = "https://foo.azurewebsites.net"; 

    /** 
    * Requests to protected pages need to be authenticated and authorized, otherwise the JIT-Compile won't work 
    * For ASP.NET apps that are using FormsAuthentication just send a POST-request as you normally would do using a html form, 
    * then grab the cookie you get in the response and pass it to the subsequent requests 
    * */ 
    var email = "[email protected]"; 
    var password = "verysecure"; 
    var cookies = new CookieContainer(); 

    var webRequest = WebRequest.Create($"{baseUrl}/Account/Login") as HttpWebRequest; 
    webRequest.Method = "POST"; 
    webRequest.ContentType = "application/x-www-form-urlencoded"; 
    webRequest.CookieContainer = cookies; 

    var requestWriter = new StreamWriter(webRequest.GetRequestStream()); 
    requestWriter.Write($"user={email}&password={password}");//Small example for brevity. Don't forget to extract the requestVerificationToken in production :-) 
    requestWriter.Close(); 
    webRequest.GetResponse().Close(); 

    var urls = new[] { 
    baseUrl, 
    $"{baseUrl}/Home/Contact", 
    $"{baseUrl}/Protected/Stuff", 
    //... 
    }; 
    foreach (var url in urls)//trigger web-requests 
    { 
    webRequest = WebRequest.Create(url) as HttpWebRequest; 
    webRequest.CookieContainer = cookies; 
    webRequest.GetResponse().Close(); 
    } 
} 

アプリは、このようにページを要求するときに恐ろしいパフォーマンスを体験してユーザーの皆様を防止し、展開後/起動時にこれが私たちのために時間のかかるJIT-ものをトリガします。アプリの価格プランがS1以上の場合は、deployment slotsを使用してさらにパフォーマンスを向上させることができます。プロダクションにデプロイする前にアプリをウォーミングアップすることができます。

私の場合(予約価格設定層B1)、Application_Start内でコードを一度実行するだけで十分だと思います。なぜなら、«Always on»は、サイトが自動的にシャットダウンするのを防ぐためですあなたのアプリが共有リソース上で動作している場合は、Cronジョブなどを使ってアプリを生かしてください。

関連する問題