9

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ù!

+1

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. –

+0

@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. –

+1

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. –

Trả lời

3

Bạn sẽ chạy thử nghiệm tải trong bao lâu? Nếu bạn đang chạy nó dưới cửa sổ 7 bạn có thể nhận được kết quả khác nhau hơn dưới một máy chủ cửa sổ là tốt. Bạn có thể gặp sự cố khi nhận các luồng được phân bổ cho nhóm luồng theo tải bùng nổ. Net sẽ ngay lập tức phân bổ các chủ đề lên đến hồ bơi chủ đề min và sau đó từ từ phân bổ tối đa cho các hồ bơi thread. Tôi tin rằng các thiết lập mặc định cho hệ điều hành của khách hàng khác với hệ điều hành của máy chủ.Nó có thể được trên một hệ điều hành khách hàng mặc định thiết lập chủ đề min là bằng số lõi trên máy tính của bạn, có nghĩa là. Net sau đó sẽ từ từ phân bổ nhiều chủ đề để đáp ứng tải burst của bạn.

Kiểm tra đơn giản là để kiểm tra tải của bạn chạy lâu hơn và xem khoảng cách giữa 2 phép đo của bạn có thu hẹp hay không.

+0

Các thử nghiệm được thực hiện trên một máy tính Windows 7 với IIS 7.5. Kiểm tra tải được chạy dưới tải liên tục của 20 người dùng. Tôi sẽ thử chạy nó trên cùng một máy trong một thời gian dài hơn và sẽ đăng lại kết quả. –

+0

Dưới đây là thông tin về cách thay đổi cài đặt chủ đề tối thiểu/tối đa của nhân viên/io. http://msdn.microsoft.com/en-us/library/7w2sway1.aspx. Một bán gotcha để nhận thức được là bạn cần phải vô hiệu hóa các autoconfig nếu không các giá trị mới của bạn sẽ bị bỏ qua. –

+1

Một xem xét khác trong thử nghiệm của bạn là nếu bạn đang bắt đầu một trang web lạnh, yêu cầu đầu tiên sẽ phải chịu tất cả các loại hình phạt thời gian liên quan đến jitting, vv Nếu bạn bắt đầu lạnh với loạt các yêu cầu, tất cả họ sẽ xếp hàng cho đến trang web đã sẵn sàng. Vì vậy, đặc biệt nếu bạn không làm ấm trang web của mình và có thời gian thử nghiệm ngắn, kết quả của bạn sẽ bị sai lệch. –

1

nếu bạn gặp sự cố với thời gian tải dài có thể liên quan đến nhiều thứ nếu bạn có số lượng hoạt động IO cao, nó có thể ảnh hưởng đến nếu bạn đang thực hiện các truy vấn cơ sở dữ liệu. vs với một profiler sql hoặc trong các máy chủ sql được xây dựng trong profiler nếu bạn đang nhận được rất nhiều truy vấn riêng lẻ, bạn có thể muốn xem xét sử dụng một số bao gồm trong các truy vấn LINQ để kết hợp một số dữ liệu của bạn vào các truy vấn đơn lẻ

bạn cũng có thể muốn để xem xét muốn xem xét sử dụng bộ điều khiển không đồng bộ để cải thiện thời gian phản hồi nếu bạn có rất nhiều hoạt động IO để ứng dụng của bạn không liên tục chờ mỗi thao tác io hoàn thành xem wintellect.com/CS/blogs/jprosise/archive/2010/03/29/…

cũng có các giải pháp tốt hơn để ghi nhật ký so với ghi nhật ký iis vì nó là thành phần khá cũ, bạn có thể xem log4net để ghi nhật ký tổng quát hơn hoặc elmah để ghi nhật ký lỗi và ngoại lệ. một loạt các mục nhập nhật ký và viết vài mục trong một thao tác đơn lẻ cũng cải thiện hiệu suất IO

+0

Đang chờ IO trong mã phải được tính trong thời gian Đồng hồ bấm giờ - vì vậy không nên có khoảng cách giữa những gì được báo cáo trong IIS và những gì được báo cáo bởi đồng hồ bấm giờ. –

2

Tôi khuyên bạn nên xem xét MvcMiniProfiler. Đó là một gói NuGet mà bạn có thể thêm và dây vào (gần như dễ dàng) mà thực sự phá vỡ thời gian thực hiện của các điểm khác nhau trong ứng dụng MVC của bạn. Bạn có thể thấy chế độ xem trực tiếp của từng yêu cầu và nơi có bất kỳ tắc nghẽn nào. Thông tin

thêm:

2

của nó có thể là một sự kết hợp của Managed Pipeline overhead và bạn mạng (thậm chí là localhost hoặc 127.0.0.1) có thể là nơi mà thời gian "mất" có thể được tính.

  1. Bạn đề cập đến các bản ghi IIS kiểm tra với Visual Studio tải số liệu thử nghiệm - cả hai đều liên quan đến ngăn xếp mạng và pipleline được quản lý.
  2. Mã đồng hồ bấm giờ của bạn chỉ thực thi bên trong ngữ cảnh ASP.NET (chỉ trước khi thực thi ASP.NET bắt đầu và ngay trước khi kết thúc), và không tính đến số tiền phí xử lý yêu cầu mạng TCP, phân tích cú pháp HTTP -headers cho cả yêu cầu và đáp ứng và thời gian truyền thông qua đường ống được quản lý và ngăn xếp TCP.
  3. [EDIT] Tỷ lệ được phóng đại nhiều hơn nếu thời gian thực thi trang ASP.NET của bạn thực sự nhanh, ví dụ: nó không tiêu tốn rất nhiều CPU tương đối so với phần còn lại của ngăn xếp TCP và đường ống được quản lý để so sánh yêu cầu HTTP cho bạn