2011-12-15 67 views
20

この質問はどこから始めるのが本当にわかりませんが、時には作業しているサイトにはかなり遅いページがロードされています。特にビルドを行った後には、必ずしもそうではありません。私は通常、実際に現れる前にページを5-10回更新する必要があります。私は、どこを見始めるべきかを見極めようとしていると思う。ASP.NET MVC 3サイト読み込みが極端に遅い

ASP.NET MVC 3 Ninject AutoMapper Entity Frameworkのコードファースト4.1 SQL Server 2008の レイザー

UPDATES

質問のいくつかについては、それはすべての上で、この長いロードを行うことができますそれはすべてのページでかなり速く読み込まれた後です。

これを投稿して返信を受け取った後、私はアプリケーションを起動しましたが、まだロードされていて、ブラウザのリロードをクリックしない限りロードされません。

キャッシングなしで、EFモデルは巨大ではありません。

6GBのメモリとI7プロセッサを搭載したRazorとVisual Studio 2010を使用しています。

デバッグ時にIIS ExpressとデフォルトWebサーバーを使用しています。これは、メインサーバーのIIS7でも行います。

MVC ProfilerとGlimpseを見て、私が見つけたものを見ることができます。

以下、ホームページにヒットしたときに実行するコードがあります。最初にサーバを起動したときに、ロードされることはありません。私は決して打撃を受けないvarモデルにブレークポイントを設定します。私がページをリロードすると、それが実行されます。

public ActionResult Index() 
     { 
      var model = new HomeViewModel(); 

      model.RecentHeadlines = _headlineService.GetHeadlines(1, Config.RecentHeadlinesPageSize, string.Empty); 

      return View(model); 
     } 

以下は私のdatacontext設定です。

public class DatabaseFactory : Disposable, IDatabaseFactory 
    { 
     private DataContext _dataContext; 
     public DataContext Get() 
     { 
      return _dataContext ?? (_dataContext = new DataContext()); 
     } 
     protected override void DisposeCore() 
     { 
      if (_dataContext != null) 
       _dataContext.Dispose(); 
     } 
    } 

public class Disposable : IDisposable 
    { 
     private bool isDisposed; 

     ~Disposable() 
     { 
      Dispose(false); 
     } 

     public void Dispose() 
     { 
      Dispose(true); 
      GC.SuppressFinalize(this); 
     } 
     private void Dispose(bool disposing) 
     { 
      if (!isDisposed && disposing) 
      { 
       DisposeCore(); 
      } 

      isDisposed = true; 
     } 

     protected virtual void DisposeCore() 
     { 
     } 
    } 

public class UnitOfWork : IUnitOfWork 
    { 
     private readonly IDatabaseFactory _databaseFactory; 
     private DataContext _dataContext; 

     public UnitOfWork(IDatabaseFactory databaseFactory) 
     { 
      _databaseFactory = databaseFactory; 
     } 

     protected DataContext DataContext 
     { 
      get { return _dataContext ?? (_dataContext = _databaseFactory.Get()); } 
     } 

     public void Commit() 
     { 
      DataContext.Commit(); 
     } 
    } 
+1

さらに詳しい情報が必要です。これは最初のページに当たったことですか?すべてのページ?特定のページのみ?一貫してまたは散発的に起こりますか? – Lester

+0

あなたのEFモデルの大きさはどれくらいですか?アプリケーションにキャッシュがありますか?特にビルド後、または初めてビルドした後にアプリケーションにアクセスするとき(アプリケーションの再起動時)はいつですか? –

+0

遅いマシンの場合もあります。どのくらいの記憶がありますか?いくつのCPUコア?それはラップトップですか、ワークステーションですか? – danludwig

答えて

14

私はタイムアウト自体をリサイクルするためのプロセスのためにIISでに設定されているものを確認することから始めたいです。

私はまた、MVC Mini-Profilerの非常に大きなファンで、ページの読み込みのさまざまな部分が正確にどのくらいの時間を取っているかを正確に見ることができます。

編集:

それはGlimpse projectは、これらの日、このタスクのためにも偉大であることは注目に値します。

+0

私はMVC Miniプロファイラをインストールしましたが、それは私に手がかりを与えました。私は非同期のコントローラメソッドに長いポーリングajaxリクエストを作成していました。何かが起こっていた、私はページを去ったときにきれいになったり停止したりしなかった。このコードをコメントアウトした後、期待される初期のビルドを除いて、ページがロードされ始めました。 MiniProfilerの場合は –

+2

+1です。 – avenmore

6

ビルド後または非アクティブな時間が経過した後にIIS AppPoolのリサイクルに問題があるようです。

AppPoolのタイムアウトを助けるために、batch fileを作成して問題を軽減することができます。

ASP.NET MVCアプリケーションを初回実行時にJITコンパイルする必要があるため、新しいビルド後に問題が解決されません。あなたが本当にその問題を解消したいなら、ASP.NET precompliationを使うことができます。

+1

私はAppPoolについてあなたの意見が好きです。 +1 –

+0

うわー、これは大きな違いをもたらしました。私は、私が時折訪問するたびに、私のテストサーバーがウォーミングするのを待つ必要がなくなりました。 idleTimeoutのデフォルトは何ですか? – avenmore

+0

@avenmoreはホストによって異なります。一般的には、デフォルトのタイムアウトは20分だと思いますが、私はあまりよく分かりません。 IIS IMHOへのアクセスレベルがある場合は、明示的に設定することをお勧めします。 – Aaronontheweb

1

Glimpseを試してください。またはASP.NET Tracingを使用してください。

Razor Single File Generator for MVC経由でレイザービューエンジンを使用している場合は、precompile your viewsとすることもできます。

+2

あなたがチェックする可能性がある他の項目は、**外部MVCの依存関係** - ** Session State **、** Data Services **などです。過剰なSQL Serverセッション状態のトラフィックによりサイトがクロールしてしまった(* 200人以上のユーザーの追加*)問題が発生しました。これはトレースに現れませんでした。 – SliverNinja

0

以前の実行で何が起きたかによって異なります。エラーが発生してもそれをクリアしないと、アプリケーションを実行する際に問題が発生することがあります。エラーが発生した場合は、ビルドするたびにブラウザを再起動すると便利です。

しかし、これはキャッシングの問題である可能性があります。コンテキストの処理が不適切なため、データベースがキャッシュされている可能性があります。これにより、ページ内で発生したように、ルックアップがより高速かつ高速に実行されます。データベーストランザクションが終了したら、常に.dispose()を呼び出すようにしてください。

0

面白い - 私はユニティとmvcで一度似たようなことに気がつきましたが、私は自分自身で解決したと思う問題です。また、ANTSプロファイラを使用して、問題がMVC外にあるかどうかを確認することもできます。

(5回以上のリクエストをせずに)1つのリクエストをそこに置くと、何が起こりますか? 1つのリクエストを実行させる - あなたのコードがヒットしましたか? (ログインログlog4net、nlogなど)を実行してapplication_startなどを実行し、コンパイル後にコードが呼び出されるかどうかを確認します。

関連する問題