Tôi có một ứng dụng web .NET Framework 4.0, ASP.NET, ASP.NET MVC 3 được lưu trữ trên Windows 7/IIS 7.5. Tính năng ghi nhật ký IIS được bật trên máy này và được đặt để đăng nhập ở chế độ W3C.Điều gì tiêu thụ hơn 65% thời gian trong một ứng dụng ASP.NET?
Ứng dụng được biên dịch bằng cách sử dụng cấu hình Phát hành và đã được triển khai cho IIS với thuộc tính <compilation debug='false'
được đặt rõ ràng. Web.config chỉ định việc sử dụng trạng thái phiên chạy dựa trên SQL Server.
Tôi đã thêm các câu sau trong Global.asax trong các sự kiện BeginRequest và EndRequest tương ứng. Kết quả tức là "sw.Elapsed.TotalMilliseconds" đang được lưu trữ trong danh sách các giá trị cấp Ứng dụng. Tôi đổ các giá trị này ra thông qua một trang gỡ lỗi và có được mức trung bình giống nhau.
// in BeginRequest
HttpContext.Current.Items.Add("RequestStartEnd", System.Diagnostics.Stopwatch.StartNew());
// in EndRequest
var sw = (System.Diagnostics.Stopwatch)HttpContext.Current.Items["RequestStartEnd"];
sw.Stop();
Tôi đã tạo thử nghiệm tải chạy một yêu cầu duy nhất đối với ứng dụng này với tải người dùng đồng thời là 20 người dùng. Thử nghiệm được chạy trong phiên bản Visual Studio 2010 Ultimate.
Sau khi chạy thử tải, tôi nhận được thời gian trung bình được ghi bởi đồng hồ bấm giờ là 681 mili giây. Thời gian trung bình được thực hiện theo IIS cho các yêu cầu này (Tôi đã xóa sạch tất cả nhật ký trước khi chạy thử tải) là 2121 mili giây. Thời gian trung bình được thực hiện theo IIS kiểm đếm với giá trị được hiển thị trong báo cáo thử nghiệm tải Visual Studio.
Thời gian đồng hồ bấm giờ chỉ chiếm 32% thời gian thực hiện theo báo cáo của nhật ký IIS/Visual Studio. 68% thời gian còn lại đi đâu?
Cập nhật 1: Tôi đặt trạng thái phiên thành InProc và chạy lại kiểm tra tải. Trong kịch bản này, sự khác biệt giữa thời gian trung bình được báo cáo bởi đồng hồ bấm giờ và thời gian trung bình được báo cáo bởi các bản ghi IIS đã tăng lên hơn 70% !!! Trường hợp là tất cả thời gian đi đâu?
Cập nhật 2: @ Peter - Tôi cố gắng ra đề nghị không truy tìm bằng cách đặt một quy tắc dấu vết để đăng nhập vào mã trạng thái của 200. Tiếp theo, tôi chạy thử tải với 20 người dùng đồng thời cho khoảng 1,5 phút. Đã đi qua 50 tệp theo dõi cuối cùng và thấy rằng trường "Thời gian được thực hiện" trong báo cáo đó có phạm vi từ 750 m đến 1300 mili giây. Báo cáo Visual Studio cho thấy avg. thời gian thực hiện là 2300ms. Trong báo cáo, sử dụng chế độ xem nhỏ gọn, tôi thấy rằng thời gian đã thực hiện thay đổi giữa các chuyển đổi sau (1) AspNetStart -> AspNetAppDomainEnter (2) ManagedPipelineHandler-start ManagedPipelineHandler-end. (2) mục có lẽ là mã của ứng dụng của tôi. Vẫn có sự khác biệt lớn giữa thời gian tối đa được lấy theo nhật ký yêu cầu không thành công tức là 1300ms và trung bình. thời gian thực hiện như được hiển thị bởi Visual Studio 2300ms. Làm thế nào để tìm kế toán cho điều đó? Cảm ơn cho mẹo tuyệt vời này mặc dù!
Bạn nên xem xét định dạng mã của mình.Nó sẽ cung cấp cho bạn dữ liệu chi tiết hơn và trực tiếp có thể sử dụng hơn các đồng hồ hiệu suất dựa trên đồng hồ bấm giờ đơn giản. –
@Merlyn - Tôi đang sử dụng Visual Studio 2010 Ultimate profiler cho cùng một. Sẽ cố gắng xem các báo cáo có "Hiển thị tất cả mã" được bật. Tuy nhiên, tôi nghi ngờ rằng vấn đề có thể nằm trong IIS hơn là ASP.NET và do đó có thể không được bao gồm trong hồ sơ. Lý do đằng sau sự nghi ngờ là thời gian đồng hồ bấm giờ được thực hiện trong các sự kiện yêu cầu bắt đầu và yêu cầu của ASP.NET. –
Bạn đã xem xét các yếu tố mức hệ thống bên ngoài ASP.NET chưa? ví dụ. IIS trên không, mạng? Đã thêm câu trả lời chi tiết hơn. –