2010-06-07 20 views
10

Hầu hết các bộ đếm hiệu suất của nhiều thể hiện trong Windows có vẻ tự động (?) Có một dấu #n ở cuối nếu có nhiều cá thể có cùng tên.Đặt tên các bộ đếm hiệu năng đa dụ trong .NET

Ví dụ: nếu, trong Perfmon, bạn nhìn theo thể loại Process, bạn sẽ thấy:

... 
dwm 
explorer 
explorer#1 
... 

Tôi có hai explorer.exe quá trình, vì vậy quầy thứ hai có # 1 gắn vào tên của nó.

Khi tôi cố gắng để làm điều này trong một ứng dụng .NET:

  • tôi có thể tạo ra các thể loại, và đăng ký các trường hợp (sử dụng PerformanceCounterCategory.Create mà phải mất một CounterCreationDataCollection).
  • Tôi có thể mở bộ đếm để viết và ghi vào đó.

Khi tôi mở bộ đếm lần thứ hai (trong một quy trình khác), nó sẽ mở cùng một bộ đếm. Điều này có nghĩa rằng tôi có hai quá trình chiến đấu trên các quầy.

documentation for PerformanceCounter.InstanceName tuyên bố rằng # không được phép trong tên.

Vì vậy: làm cách nào để có nhiều bộ đếm hiệu suất thể hiện thực sự là nhiều phiên bản? Và nơi các trường hợp thứ hai (và tiếp theo) nhận được #n được thêm vào tên?

Tức là: Tôi biết rằng tôi có thể đặt ID quá trình (ví dụ) vào tên cá thể. Điều này làm việc, nhưng có tác dụng phụ không may mà khởi động lại quá trình kết quả trong một PID mới, và Perfmon tiếp tục theo dõi các truy cập cũ.

Cập nhật:

tôi là tạo ra các loại (và đếm) như sau:

const string categoryName = "Test App"; 
const string counterName = "Number of kittens"; 
string instanceName = 
    Path.GetFileNameWithoutExtension(
     Process.GetCurrentProcess().MainModule.FileName); 

if (!PerformanceCounterCategory.Exists(categoryName)) 
{ 
    var counterCreationDataCollection = new CounterCreationDataCollection 
     { 
      new CounterCreationData(counterName, "", 
       PerformanceCounterType.NumberOfItems32) 
     }; 

    PerformanceCounterCategory.Create(categoryName, "", 
     PerformanceCounterCategoryType.MultiInstance, 
     counterCreationDataCollection); 
} 

Tôi đang mở quầy như sau:

PerformanceCounter counter = new PerformanceCounter(
     categoryName, counterName, instanceName, readOnly: false); 
+0

Khi bạn mở bộ đếm hiệu suất lần thứ hai, bạn có đang thực hiện nó trong một quy trình khác hoặc từ một thành phần khác trong cùng một quy trình không? – JMarsch

+0

Quy trình khác nhau. –

+0

Tôi nghĩ rằng bạn phải mở chúng với các tên cá thể khác nhau. Nếu không, bạn sẽ kết thúc bằng văn bản để truy cập sai. Ngoài ra, hãy xem http://msdn.microsoft.com/en-us/library/dd537616.aspx dường như gợi ý rằng "# 1" đang được thêm vào bởi perfmon. – feroze

Trả lời

2

Tôi nghĩ vấn đề của bạn là với thực tế .NET là lỏng lẻo hơn liên quan đến hiệu suất quầy, và thực sự bỏ qua các PerfLib Win API.

Khi sử dụng API PerfLib gốc, bạn đăng ký các danh mục trong khi thiết lập - và tạo các cá thể từ quá trình sử dụng các chốt điều khiển. Vì vậy, với API gốc không có cách nào đơn giản để chia sẻ một cá thể truy cập. Vì vậy, khi hai cá thể truy cập được truy cập với cùng tên, chúng thực sự có các tay cầm khác nhau và được đánh dấu bằng # một cách thích hợp.

Trong .NET khi bạn chỉ cần xử lý một bộ đếm và cá thể theo tên, bạn có nguy cơ cập nhật chéo. Như .NET lấy tên và liệt kê (sử dụng WMI) các cá thể ngay cả khi chúng đang được sử dụng bởi một ứng dụng khác.

Tôi nghĩ rằng việc thêm PID * thực sự là giải pháp thông minh nhất - vì cả hai đều có khả năng theo dõi tốt hơn và không có va chạm. Về vấn đề với khởi động lại tạo ra một truy cập mới, tôi không thấy vấn đề; nếu bạn cho phép nhiều hơn một thể hiện của quá trình chạy tại một thời điểm nhất định, làm thế nào bạn biết nếu cá thể này được tạo ra do khởi động lại hoặc đơn giản là chạy một tệp thực thi khác?

Nếu bạn có một sự phụ thuộc của một số loại giữa các quy trình, bạn có thể làm sạch bộ đếm cũ hoặc sử dụng một số logic khác. Trong khi ở PerfMon bạn có thể xem "*" tất cả các trường hợp.

* Hoặc nếu bạn có một số logic đằng sau quá trình, được duy trì mà không quan tâm đến việc khởi động lại - chẳng hạn như một id tác vụ thuộc một số loại nào đó.

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