2011-12-15 40 views
20

Tôi thực sự không biết bắt đầu từ đâu với câu hỏi này, nhưng trang web tôi đang làm việc vào những thời điểm có tải trang thực sự chậm. Đặc biệt là sau khi xây dựng, nhưng không phải lúc nào cũng vậy. Tôi thường phải làm mới trang 5-10 lần trước khi nó thực sự xuất hiện. Tôi đoán tôi đang cố gắng để xem chính xác nơi tôi nên bắt đầu tìm.ASP.NET MVC 3 Tải trang web cực kỳ chậm

ASP.NET MVC 3 Ninject AutoMapper Entity Framework Mã Đầu tiên 4.1 SQL Server 2008 Razor

CẬP NHẬT

Về một số câu hỏi, nó có thể làm bốc dài này trên tất cả các trang, nhưng sau khi tải nó khá nhanh trên tất cả các trang.

Sau khi đăng bài này và nhận được trả lời của bạn, tôi đã khởi động ứng dụng và nó vẫn đang tải và có thể sẽ không bao giờ tải trừ khi tôi nhấp vào tải lại trên trình duyệt.

Không có bộ nhớ đệm và các mô hình EF không lớn.

Tôi đang sử dụng Razor và Visual Studio 2010 với bộ nhớ 6 GB và bộ xử lý I7.

Tôi đang sử dụng IIS Express và máy chủ web mặc định khi gỡ lỗi. Nó cũng làm điều này trên IIS7 trên máy chủ chính.

Tôi có thể xem xét Hồ sơ MVC và thoáng nhìn để xem những gì tôi có thể tìm thấy.

Dưới đây tôi có một số mã này chạy khi nó truy cập trang chủ. Tôi sẽ nói nó không bao giờ tải khi tôi lần đầu tiên khởi động máy chủ. Tôi đặt một điểm break tại mô hình var mà không bao giờ bị đánh. Nếu tôi tải lại trang thì có.

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

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

      return View(model); 
     } 

Dưới đây là thiết lập văn bản dữ liệu của tôi.

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

Cần thêm một số chi tiết. Đây có phải là để đánh trang đầu tiên không? Mỗi trang? Chỉ một số trang nhất định? Xảy ra một cách nhất quán hoặc không thường xuyên? – Lester

+0

Mô hình EF của bạn lớn cỡ nào? Có bộ nhớ đệm nào trong ứng dụng của bạn không? Có phải đặc biệt là sau khi xây dựng hoặc luôn luôn khi bạn truy cập vào ứng dụng sau khi xây dựng lần đầu tiên (khởi động lại ứng dụng)? –

+0

Cũng có thể do máy chậm. Bạn có bao nhiêu kỷ niệm? Có bao nhiêu lõi CPU? Nó là một máy tính xách tay, hoặc một máy trạm? – danludwig

Trả lời

14

Tôi muốn bắt đầu bằng cách kiểm tra thời gian chờ được đặt trong IIS để quá trình tự tái chế.

Tôi cũng là người hâm mộ rất lớn của MVC Mini-Profiler có thể cho bạn biết chính xác khoảng thời gian tải các phần khác nhau của trang, chắc chắn hãy xem xét nó.

Edit:

Điều đáng chú ý là các Glimpse project cũng là rất tốt cho nhiệm vụ này những ngày này.

+0

Tôi cũng cài đặt MVC Mini profiler và nó đã cho tôi một đầu mối. Tôi đã thực hiện một yêu cầu ajax bỏ phiếu dài đến một phương pháp điều khiển không đồng bộ. Một cái gì đó đã xảy ra mặc dù, như không nhận được làm sạch hoặc dừng lại khi tôi rời trang. Sau khi nhận xét mã này, các trang bắt đầu tải, ngoại trừ các trang được tạo ban đầu được mong đợi. –

+2

+1 cho MiniProfiler. – avenmore

6

Nghe có vẻ như có vấn đề với việc tái sử dụng IIS AppPool nếu bạn gặp phải vấn đề này sau khi xây dựng hoặc sau thời gian không hoạt động.

Để trợ giúp với thời gian chờ của AppPool, bạn có thể sử dụng batch file Tôi đã tạo để giúp giảm thiểu vấn đề.

Điều đó sẽ không giải quyết được vấn đề cho bạn sau khi xây dựng mới vì ứng dụng ASP.NET MVC của bạn cần phải được JIT biên dịch khi chạy lần đầu tiên. Nếu bạn thực sự mong muốn loại bỏ vấn đề đó, bạn có thể sử dụng ASP.NET precompliation.

+1

Tôi thích quan điểm của bạn về AppPool. +1 –

+0

Ồ, điều này tạo nên sự khác biệt lớn. Tôi không còn phải chờ 5s cho máy chủ thử nghiệm của tôi để làm ấm lên mỗi khi tôi ghé thăm nó đôi khi. IdleTimeout mặc định là gì? – avenmore

+0

@avenmore phụ thuộc vào máy chủ của bạn; nói chung tôi nghĩ thời gian chờ mặc định là 20 phút nhưng tôi không chắc chắn. Đó là cách hay nhất để đặt nó rõ ràng nếu bạn có cấp truy cập đó đến IIS IMHO. – Aaronontheweb

1

Hãy thử Glimpse hoặc sử dụng ASP.NET Tracing.

Bạn cũng có thể precompile your views nếu bạn đang sử dụng công cụ xem Dao cạo qua Razor Single File Generator for MVC.

+2

Các mục khác bạn có thể kiểm tra là ** phụ thuộc MVC bên ngoài ** - chẳng hạn như ** Trạng thái phiên **, ** Dịch vụ dữ liệu **, v.v. có thể gây ra sự chậm lại. Chúng tôi vừa gặp sự cố khi lưu lượng truy cập Trạng thái phiên SQL Server quá mức khiến trang web thu thập dữ liệu (* thêm 200 người dùng *). Điều này đã không được hiển thị trong truy tìm. – SliverNinja

0

Nó phụ thuộc vào những gì đã xảy ra trong lần chạy trước của bạn, đôi khi nếu bạn ném lỗi và không xóa lỗi đó thì bạn sẽ gặp sự cố khi chạy ứng dụng. Nó giúp khởi động lại trình duyệt mỗi khi bạn xây dựng nếu có lỗi.

Tuy nhiên, đây có thể là sự cố khi lưu vào bộ nhớ cache. Có thể cơ sở dữ liệu của bạn đang lưu vào bộ nhớ đệm do xử lý bối cảnh kém bền vững. Điều này sẽ làm cho các tra cứu chạy nhanh hơn và nhanh hơn khi chúng gặp phải trong các trang. Hãy chắc chắn rằng bạn luôn gọi .dispose() khi thực hiện với các giao dịch cơ sở dữ liệu của bạn.

0

vui - Tôi đã nhận thấy điều gì đó tương tự một lần với sự thống nhất và mvc nhưng vấn đề tôi tin là đã giải quyết được. Bạn cũng có thể thử kiến ​​profiler để xem nếu vấn đề là bên ngoài của MVC.

Nếu bạn để một yêu cầu duy nhất ở đó (không yêu cầu 5+ lần) điều gì sẽ xảy ra? Cho phép một yêu cầu duy nhất chạy - là BẤT K of mã của bạn có bị truy cập không? (thiết lập đăng nhập log4net, nlog, vv) để chạy application_start, v.v. để xem có mã nào được gọi sau khi biên dịch hay không.

Các vấn đề liên quan