2011-11-21 7 views
12

Tôi đang sử dụng hiệu suất dotTrace 4.5 để cấu hình ứng dụng web .NET 3.5 C#. Khi tôi ghi lại một "yêu cầu người dùng" (tải trang), tôi thấy 11 chủ đề với khoảng thời gian tương tự, 7644 ms.Điều chỉnh ứng dụng web C#: PerformWaitCallback

  • Hầu hết các mô tả chủ đề duy nhất bao gồm: 100% [Native hoặc mã tối ưu] - 7644 ms
  • Một nói: 100% Microsoft.VisualStudio.WebServer.WebServerApp.Main(String[])
  • một cuối đọc:
    • 86% System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(Object)
    • 14% PerformWaitCallback (1094 ms) >> 12% = ProcessRequest

Bạn có thể cho tôi biết:

  • Tại sao có quá nhiều chủ đề? (tài nguyên hình ảnh, AJAX, JavaScript)
  • PerformWaitCallback là gì?
  • Tại sao 7644 mili giây chỉ cho 1094 giờ làm việc?
+1

Bạn chỉ đo * một * yêu cầu? Bạn nên khởi động ứng dụng và chạy * nhiều * yêu cầu; có chi phí vốn có liên quan đến việc khởi động ứng dụng web. – casperOne

+0

Tôi "làm nóng" ứng dụng trước khi lập hồ sơ một yêu cầu. Tôi nhận được kết quả tương tự nếu tôi chạy nhiều yêu cầu (N x 8 giây). –

+1

Có lẽ nó phụ thuộc vào việc bạn đang sử dụng IIS, IIS Express hoặc Web Development Server. –

Trả lời

1

Về PerformWaitCallback, đây là những gì các nguồn tài liệu tham khảo đã nói:

Gọi lại helper. Hàm này gửi yêu cầu đến các cuộc gọi lại của người dùng . Các mục công việc được lấy từ hàng đợi của mỗi appdomain trong một vòng lặp cho đến khi không có thêm công việc hoặc lượng tử đã bị hết hạn . Lượng tử được thực thi để duy trì sự công bằng trong số appdomains.

Bạn có thể xem mã đầy đủ here.

BTW, tôi không chắc chắn nếu bạn sẽ thấy điều này trong .NET 4.5 - một lần nữa từ nguồn tài liệu tham khảo (không thể tìm thấy một phiên bản trực tuyến, bạn sẽ phải tải nó từ http://referencesource.microsoft.com/):

//This type is necessary because VS 2010's debugger looks for a method named 
///_ThreadPoolWaitCallbacck.PerformWaitCallback 
//on the stack to determine if a thread is a ThreadPool thread or not. 
//We have a better way to do this for .NET 4.5, but 
//still need to maintain compatibility with VS 2010. 
//When compat with VS 2010 is no longer an issue, this type may be removed. 
internal static class _ThreadPoolWaitCallback 
{ 
    [System.Security.SecurityCritical] 
    static internal bool PerformWaitCallback() 
    { 
     return ThreadPoolWorkQueue.Dispatch(); 
    } 
} 
3

Tại sao có quá nhiều chủ đề? (tài nguyên hình ảnh, AJAX, JavaScript)

Máy chủ web tạo nhóm chủ đề để quản lý yêu cầu gửi đến và có một số chủ đề trong nhóm.

PerformWaitCallback là gì?

Không biết chắc chắn, nhưng có vẻ như mã chờ chuỗi chủ đề để hoàn thành nhiệm vụ.

Tại sao 7644 ms chỉ cho 1094 giờ làm việc?

Dường như hồ sơ đang tính thời gian mà một số chủ đề đang chờ đợi công việc mới. Tôi đã không sử dụng dotTrace, nhưng hầu hết profilers có một cách để cấu hình chúng để họ có thể xác định khi các chủ đề đang chờ đợi và làm việc - dựa trên thông tin bạn đăng, tôi nghi ngờ profiler không được cấu hình khá đúng.

+0

Xin lỗi vì câu trả lời trễ của tôi nhưng tôi đã làm việc ra các vấn đề hiệu suất. Nếu tôi theo dõi IIS với DotTrace, không còn 'PerformWaitCallback', nhưng' System.Web.Hosting.ISAPIRuntime.ProcessRequest (IntPtr, Int32) 'với cùng một sự khác biệt về thời gian ... –