2009-07-30 28 views
17

Tôi đang tạo một số bộ đếm hiệu suất tùy chỉnh cho một ứng dụng. Tôi đã viết một công cụ C# đơn giản để tạo ra các loại và quầy. Ví dụ, đoạn mã dưới đây về cơ bản là những gì tôi đang chạy. Sau đó, tôi chạy một ứng dụng riêng biệt làm gián đoạn làm mới giá trị thô của bộ đếm. Trong khi đó chạy, các truy cập và giả dụ được nhìn thấy tại địa phương trong perfmon.Tại sao perfmon không thể xem các phiên bản của bộ đếm hiệu suất tùy chỉnh của tôi?

Sự cố tôi gặp phải là hệ thống giám sát mà chúng tôi sử dụng không thể thấy các phiên bản trong bộ đếm nhiều trường hợp mà tôi đã tạo khi xem từ xa từ máy chủ khác. Khi sử dụng perfmon để duyệt qua các quầy, tôi có thể thấy các loại và quầy, nhưng hộp thể hiện màu xám và tôi thậm chí không thể chọn "Tất cả các trường hợp", cũng không phải tôi có thể nhấp "Thêm". Sử dụng các phương pháp truy cập khác, chẳng hạn như [typeperf][1] hiển thị các sự cố tương tự.

Tôi không chắc đây có phải là sự cố máy chủ hoặc mã hay không. Điều này chỉ có thể tái sản xuất trong môi trường sản xuất mà tôi cần nó. Trên máy tính để bàn và máy chủ phát triển của tôi, nó hoạt động tuyệt vời. Tôi là quản trị viên cục bộ trên tất cả các máy chủ.

CounterCreationDataCollection collection = new CounterCreationDataCollection(); 

var category_name = "My Application"; 
var counter_name = "My counter name"; 
CounterCreationData ccd = new CounterCreationData(); 
ccd.CounterType = PerformanceCounterType.RateOfCountsPerSecond64; 
ccd.CounterName = counter_name; 
ccd.CounterHelp = counter_name; 
collection.Add(ccd); 

PerformanceCounterCategory.Create(category_name, category_name, PerformanceCounterCategoryType.MultiInstance, collection); 

Sau đó, trong một ứng dụng riêng biệt, tôi chạy này để tạo hình nộm dữ liệu Ví dụ:

var pc = new PerformanceCounter(category_name, counter_name, instance_name, false); 
while (true) { 
    pc.RawValue = 0; 
    Thread.Sleep(1000); 
} 
+0

Phiên bản .Net này là gì? –

+0

Đã lâu rồi, nhưng chắc chắn tôi đã sử dụng .NET 2.0 hoặc 3.5 vào thời điểm đó. – spoulson

+0

Bạn đã bao giờ nhận được câu trả lời này chưa? Tôi tự hỏi nếu bạn tạo ra một lớp hiệu suất truy cập tùy chỉnh và nó đã không được serializable? –

Trả lời

1

(scribbles văn bản trước đó ra) Tôi nghĩ rằng truy cập từ xa là vấn đề (thử trên máy tính thực tế). Nếu không, hãy tìm một số cách để kết nối một thứ gì đó khác với nó trên máy tính thử nghiệm (bộ đếm hiệu năng đơn giản cơ bản trên cửa sổ có màn hình). Đồng thời chỉnh sửa giá trị thô trên ứng dụng giả để kiểm tra.

+0

có thể có quyền hoặc điều gì đó? – rogerdpack

0

Hãy thử đăng ký các quầy trên hệ thống từ xa, tức là .:

lodctr /M:manifest.man

Nếu điều đó không làm việc, nó có thể là một vấn đề cho phép.

5

Chương trình của bạn có phải là chương trình 32 bit chạy trên Windows 2008 R2 hoặc hệ điều hành Windows 64 bit khác không? Nếu vậy bạn có thể muốn kiểm tra xem dịch vụ "Performance Counter DLL Host" đang chạy hay chưa. Dịch vụ này cho phép các quá trình 64 bit và từ xa tới các bộ đếm truy vấn được cung cấp bởi các quy trình 32 bit.

1

Đã lâu rồi kể từ khi tôi xem xét điều này, nhưng bạn có thể thử gọi NextValue trước khi đặt giá trị và xem liệu điều đó có hiệu quả hay không. Nó sẽ không giải thích lý do tại sao nó hoạt động trên một số máy nhưng không phải là những người khác mặc dù.

Một điều thú vị khác để xem là những gì thực sự xảy ra trong tên dụ của bạn. Hãy chắc chắn rằng không có ký tự dành riêng đang có trong đó nếu không tất cả các loại điều xấu xảy ra.

Bạn có thể có ý tưởng nếu đó là vấn đề đặt tên bằng cách quay lên một ứng dụng khác thực sự đọc bộ đếm. Nếu bạn thành công có thể đọc nó và perfmon không thể, nó có nghĩa là bạn có một tên được định dạng theo cách ngăn PerfMon giải thích nó một cách chính xác.

0

Điều này cũng có thể là sự cố tường lửa.

Trên máy tính từ xa (một trong những lưu trữ ứng dụng multi-instance hiệu suất truy cập), hãy chắc chắn rằng phần mềm Firewall cho phép các kết nối đến:

  • Trong Windows Firewall, trên máy tính lớp máy trạm, "Hiệu suất Logs và Cảnh báo "cần phải bật ngoại lệ.
  • Trong tường lửa Windows với bảo mật nâng cao, trên máy tính cấp máy chủ, "Nhật ký hiệu suất và cảnh báo (DCOM-In)" và "Nhật ký hiệu suất và cảnh báo (TCP-In)" quy tắc gửi đến cần phải được bật.

Dưới đây là một hoạt động C# console ví dụ để bạn có thể kiểm tra xem bạn đã có các bức tường lửa được cấu hình đúng ...

// Based on the MSDN-supplied C# example from: 
// Adding and Removing Performance Counter Instances 
// http://msdn.microsoft.com/en-us/library/8t39y5k1%28v=VS.71%29.aspx 
using System; 
using System.Diagnostics; 
using System.Threading; 

namespace CustomPerformanceCounters 
{ 
    class Program 
    { 
     private const string categoryName = "Instance Category"; 
     private const string categoryHelp = "Instanced counter demonstration for StackOverflow."; 
     private const string counterName = "Instance Counter"; 
     private const string counterHelp = "Instanced counter demonstration for StackOverflow."; 

     static void RegisterCounter() 
     { 
      if (!PerformanceCounterCategory.CounterExists(counterName, categoryName)) 
      { 
       PerformanceCounterCategory.Create(
        categoryName 
        , categoryHelp 
        , PerformanceCounterCategoryType.MultiInstance 
        , counterName 
        , counterHelp 
        ); 
      } 

     } 

     static void RunCounter() 
     { 
      const string instance1 = "instance1"; 
      const string instance2 = "instance2"; 
      const string instance3 = "instance3"; 

      // Assumes category and counter have been created. 
      PerformanceCounter myCounter = new PerformanceCounter(
       categoryName 
       ,counterName 
       , instance1 
       , false 
       ); 

      int currentValue = 0; 
      int currentIncrement = 1; 
      while (true) 
      { 
       currentValue += currentIncrement; 
       if (currentValue > 99) 
       { 
        currentIncrement = -1; 
       } 
       else if (currentValue < 1) 
       { 
        currentIncrement = 1; 
       } 
       int instance1Value = currentValue; 
       int instance2Value = 100 - currentValue; 
       int instance3Value = Math.Abs(instance1Value - instance2Value); 
       Console.WriteLine("Current values: {0}, {1}, {2}", instance1Value, instance2Value, instance3Value); 

       myCounter.InstanceName = instance1; 
       myCounter.RawValue = instance1Value; 
       myCounter.InstanceName = instance2; 
       myCounter.RawValue = instance2Value; 
       myCounter.InstanceName = instance3; 
       myCounter.RawValue = instance3Value; 

       Thread.Sleep(1000); 
      } 
     } 

     static void Main(string[] args) 
     { 
      RegisterCounter(); 
      RunCounter(); 
     } 
    } 
} 
Các vấn đề liên quan