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
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:
Tôi có sau được đặt trong IIS:
- Đặt Start Mode để AlwaysRunning:
- Đặt tái chế Timeout-0:
- S Tuy nhiên, người Nhàn rỗi Time-out-0:
- Đặt Preload Enabled true on the site:
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?
Bạn đã đặt 'preloadEnabled =" true "' trong tệp 'applicationHost.config' cho ứng dụng web chưa? – afrazier
@afrazier: Có, được đặt thành true bởi mã khởi động. – davenewza
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