2013-02-27 38 views
6

Khi sử dụng System.Diagnostics tracing, là có một ý nghĩa (đo lường được) tác động hiệu suất trên không loại bỏ các "Default" dấu vết người nghe trên sản xuất ASP.NET ứng dụng trong phát hành chế độ, với TRACE liên tục định nghĩa tại thời gian biên dịch nhưng không có trình gỡ rối đính kèm vào thời gian chạy?Hiệu suất tác động của DefaultTraceListener

Để làm rõ, câu hỏi là về tác động bổ sung của trình theo dõi theo dõi "Mặc định" trên ứng dụng đang sử dụng trình theo dõi khác, không phải về các lựa chọn thay thế cho theo dõi System.Diagnostics.

Có bất kỳ biện pháp nào về tác động của trình nghe theo dõi Mặc định khi không có trình gỡ lỗi được đính kèm không? Có bất kỳ tiêu chuẩn đã được thực hiện về tác động trong sản xuất bỏ đi yếu tố "loại bỏ" từ một mã như thế này:

<configuration> 
<system.diagnostics> 
    <trace autoflush="false" indentsize="4"> 
    <listeners> 
     <remove name="Default" /> 
     <add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="c:\myListener.log" /> 
    </listeners> 
    </trace> 
</system.diagnostics> 
</configuration> 

Câu hỏi này là khác nhau từ .NET Tracing: What is the “Default” listener? theo nghĩa rằng câu hỏi khác được tập trung vào các tác động của Trình nghe mặc định khi chạy trong Visual Studio và cập nhật giao diện người dùng gỡ lỗi và câu hỏi này tập trung vào mã phát hành trong môi trường sản xuất.

+0

Vì vậy, bạn đã đo lường điều này trên máy và hệ điều hành cụ thể của bạn? Bạn đã tìm được gì? Bạn không bận tâm để thử nó? –

+0

Vì thực hành phổ biến là khuyên bạn nên loại bỏ dòng đó, tôi đang tìm người để giúp tôi tìm các phép đo được công bố mà đề xuất dựa trên. Tôi giả định rằng đã có một chuẩn mực được công bố và pha chế của riêng tôi sẽ thêm ít để thảo luận. –

+0

Có rất nhiều điều sai trái với câu hỏi này. Bạn không chỉ hỏi nó quá tệ đến mức bạn có được câu trả lời hoàn toàn sai, bạn cũng không đưa ra lý do tại sao bạn không xem xét việc thực hành theo khuyến cáo. Và bạn đã chờ đợi 4 giờ cho một cái gì đó bạn có thể tự kiểm tra trong 10 phút, nhận được kết quả * đáng tin cậy *. Không ai sẽ cho bạn biết OutputDebugString mất bao lâu trên máy của bạn. –

Trả lời

13

Có thể có tác động đáng kể trong hiệu suất nếu truy tìm được để lại khi sử dụng trình theo dõi mặc định.

Nếu bạn muốn theo dõi hiệu suất sẵn sàng sản xuất, tôi khuyên bạn nên sử dụng lớp EventSource từ .NET 4.5 thay vì phương pháp theo dõi. Điều này làm việc với PerfView bằng cách tạo nguồn sự kiện ETW và hầu như không ảnh hưởng đến thời gian chạy, ngay cả khi bạn xuất thông tin theo dõi trong sản xuất.


Rời người nghe mặc định tại chỗ khiến khuôn khổ ghi nhật ký cuộc gọi qua OutputDebugString. Điều này có thể have a significant impact về hiệu suất, ngay cả trong bản phát hành mà không có trình gỡ lỗi.

+1

Cảm ơn bạn đã trả lời, nhưng câu hỏi của tôi có phần mơ hồ và đánh lừa bạn. Tôi không hỏi về cách hiệu quả nhất để thực hiện các bộ đếm hiệu năng. Tôi quan tâm đến tác động tiềm năng của việc không xóa trình theo dõi "Mặc định" trong một ứng dụng sử dụng các trình nghe khác với System.Diagnostic và không có trình gỡ rối được đính kèm khi chạy. Tôi có thể tạo ra các câu hỏi khác về sự phù hợp của ETW đối với trường hợp sử dụng mà tôi có trong đầu. –

+0

@FernandoCorreia Tôi đã chỉnh sửa để cho thấy rằng - Bài đăng gốc của tôi vẫn chính xác: có tác động đáng kể, nhưng bây giờ tôi đã thêm một số nội dung giải thích thêm một chút về lý do. –

+1

@FernandoCorreia Tôi đã đề cập ETW vì điều này có gần 0 tác động, ngay cả khi bạn bật ghi nhật ký, đó là lý do khung chính nó sử dụng nó trong suốt và để lại chẩn đoán tại chỗ trong sản xuất. –

0

Bản thân DefaultTraceListener là "khá nhanh" - như thường lệ, nó thường không đáng chú ý với tất cả trừ việc sử dụng nhiều nhất. Tuy nhiên, kết hợp với Trace.UseGlobalLock nó có thể có tác động đáng kể đến một hệ thống được tải nặng.

Hôm nay hệ thống của chúng tôi đã trải qua quá tải CPU và bối cảnh chuyển đổi (đó là một vấn đề khác) .. và một cái gì đó bất ngờ xảy ra mà phức tạp vấn đề tới điểm mà việc dừng lại một cách hiệu quả:

đang nặng nề ren bắt đầu chặn cho lên trên 12 giây (!!) trên Trace.WriteLine vì nó phải lấy khóa trên tác phẩm "tầm thường" trong DefaultTraceListener.

Khi UseGlobalLock được áp dụng ngay cả khi không có trình theo dõi, nó là khóa không có gì bên trong - so với khóa có chút xíu bên trong có thể trượt tuyết trên một hệ thống đã tải với nhiều luồng.

Sửa lỗi ngay lập tức là tắt UseGlobalLock (điều này có other side-effects [tuyên bố từ chối trách nhiệm: một bài đăng khác của tôi]) và để xóa DefaultTraceListener.

Tất nhiên, nếu một Trình theo dõi dấu vết khác được kết nối, nó có thể sẽ làm mờ tất cả thời gian trong DefaultTraceListener.

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