27

Cuộc gọi đầu tiên tới API của chúng tôi luôn cực kỳ chậm. Ví dụ, dưới đây giải thích việc sử dụng CPU và thời gian cần thiết cho cuộc gọi đầu tiên để hoàn thành:ASP.NET Web Api 2/EF6 hiệu suất khởi tạo cuộc gọi đầu tiên

CPU usage

Cuộc gọi đầu tiên có thể mất đến 30 giây và ăn gần như 100% CPU. Gọi 2 và 3 mất 200ms (như họ nên). Sau khi tái chế các hồ bơi ứng dụng, nó sẽ làm điều tương tự với các cuộc gọi đầu tiên.

Tôi đã đọc một chút về IIS "khởi động" và thực hiện những điều sau đây, nhưng không có gì đã thay đổi:

IIS 8 Application Initialization được cài đặt:

IIS 8 Application Initialization

Tôi có sau được đặt trong IIS:

  • Đặt Start Mode để AlwaysRunning:

AlwaysRunning

  • Đặt tái chế Timeout-0:

Recycling Timeout

  • S Tuy nhiên, người Nhàn rỗi Time-out-0:

Idle Time-out

  • Đặt Preload Enabled true on the site:

Preload Enabled

Tôi thực sự thiết lập các mã này trong mã số RoleEntryPoint.OnStart().

using (var serverManager = new ServerManager()) 
{ 
    serverManager.ApplicationPoolDefaults.ProcessModel.IdleTimeout = TimeSpan.Zero; 

    foreach (var application in serverManager.Sites.SelectMany(x => x.Applications)) 
    { 
     application["preloadEnabled"] = true; 

    } 

    foreach (var applicationPool in serverManager.ApplicationPools) 
    { 
     applicationPool.AutoStart = true; 
     applicationPool["startMode"] = "AlwaysRunning"; 
     applicationPool.ProcessModel.IdleTimeout = TimeSpan.Zero; 
     applicationPool.Recycling.PeriodicRestart.Time = TimeSpan.Zero; 

    } 

    serverManager.CommitChanges(); 
} 

Tôi gần như chắc chắn rằng Entity Framework có thể là thủ phạm:

  • Chúng tôi đang tạo ra các mô hình từ khoảng 100 bảng trong một "nhà thiết kế" mô hình EDMX.

  • Chúng tôi đang tạo chế độ xem được biên dịch trước do EF Power Tools tạo.

  • Sau đây khởi đang chạy trong Application_Start():

    using (var context = new MyContext()) 
    { 
        context.Database.Initialize(false); 
    } 
    

tôi không có những "khởi tạo" vấn đề khi gỡ lỗi.

Các công nghệ sau đây đang được sử dụng:

  • NET 4.5.1
  • ASP.NET Web Api 2
  • Entity Framework 6.1.1
  • IIS 8 (Azure Web Role)
  • Unity 3.5

Bất kỳ ai cũng có thể cung cấp cho tôi y ý tưởng hoặc đề xuất khác?

+0

Bạn đã đặt 'preloadEnabled =" true "' trong tệp 'applicationHost.config' cho ứng dụng web chưa? – afrazier

+0

@afrazier: Có, được đặt thành true bởi mã khởi động. – davenewza

+0

Bạn có nhận xét về mã khởi tạo EF để xem liệu sự tăng đột biến có xảy ra không? – Avner

Trả lời

5

Không chắc chắn liệu có ai đã giải quyết vấn đề này chưa nhưng tôi đã tìm hiểu về một số vấn đề về hiệu suất phát sinh khi khởi động khung Entity ban đầu. Julie Lerman thảo luận này trong khóa học Pluralsight cô trên Entity Framework, và cũng được nhắc đến trong đoạn trích bài viết sau đây từ Microsoft:

Một trong những lớn ảnh hưởng xấu đến hiệu suất là thời gian khởi động có liên quan đến việc sử dụng đầu tiên của một ngữ cảnh trong quy trình đăng ký. Bạn có thể làm rất nhiều để cải thiện thời gian khởi động đó. Hy vọng rằng bạn đã học được các thủ thuật này từ bài viết của riêng tôi hoặc các tài nguyên khác, chẳng hạn như tài liệu MSDN về các cân nhắc về hiệu suất tại bit.ly/3D6AiC.

Bước khởi động thường cản trở hiệu suất là tạo khung nhìn bản đồ, trong đó EF tạo SQL liên quan để truy vấn đối với từng bộ thực thể trong mô hình. Những lượt xem này được tận dụng khi ứng dụng của bạn chạy sao cho đối với một số truy vấn nhất định, EF không phải thực hiện SQL ngay lập tức. Xem thế hệ xảy ra cho dù bạn đã tạo mô hình của mình với EF Designer hay với Code First. Bạn có thể tạo trước các khung nhìn này và biên dịch chúng thành ứng dụng để tiết kiệm thời gian. http://msdn.microsoft.com/en-us/magazine/dn532202.aspx

Đây có vẻ như cô ấy không chỉ nói về 'tải ban đầu' nhưng việc sử dụng đầu tiên thực tế của một ngữ cảnh. Tôi muốn tìm kiếm nhanh các vấn đề về hiệu suất của Julie Lerman và Entity Framework. Tôi nhận thấy sự chậm chạp tương tự khi thực hiện các cuộc gọi ban đầu đến API Web của tôi. Mọi cuộc gọi sau cuộc gọi đầu tiên đều nhanh hơn đáng kể. Cá nhân tôi đã không tìm thấy nó quá khủng khiếp, vì vậy tôi bỏ qua nó (bây giờ). Tuy nhiên tôi thấy nó thú vị rằng nó không xảy ra trong chế độ gỡ lỗi. Xin lỗi nếu bạn đã khám phá các tùy chọn này, nhưng tôi hy vọng điều này sẽ giúp ích một chút.

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