2012-04-26 137 views
2

我完全通過這個方法進行Baffled(TM):在Win7SP1上,64位機器PerfMon似乎完全否認了已安裝的自定義性能計數器的知識。我正在使用現有的代碼庫,它可以在生產計算機上完美地安裝計數器,但是當我在計算機上運行計數器時,當我使用已添加的計數器運行它時,或者如果我運行一個完全人爲設計的程序集其中的肉被粘貼在下面),我非常怪異的行爲。Windows性能計數器從PerfMon中消失

這可能比較容易使用下面的代碼來描述:

var category = "SuperTest"; 
var counterName = "Test Counter 1"; 
var shouldInstall = true; 

if (PerformanceCounterCategory.Exists(category)) 
{ 
    shouldInstall = false; 
    Console.WriteLine("{0} Category Exists. Overwrite? [n]", category); 
    var input = Console.ReadLine(); 
    if (bool.TryParse(input, out shouldInstall)) 
    { 
     PerformanceCounterCategory.Delete(category); 
    } 
} 
if (shouldInstall) 
{ 
    var col = new CounterCreationDataCollection(); 
    col.Add(new CounterCreationData() 
    { 
     CounterName = counterName, 
     CounterType = PerformanceCounterType.NumberOfItems64 
    }); 

    PerformanceCounterCategory.Create(category, "Test category.", PerformanceCounterCategoryType.SingleInstance, col); 
    // Magical voodoo line that may indicate my inexperience, but whose inclusion or 
    // exclusion does not affect discernibly affect behavior. 
    PerformanceCounter.CloseSharedResources(); 
} 

// Multithreading setup, each thread repeats block below infinitely: 
{ 
    System.Threading.Thread.Sleep((new Random()).Next(100)); 
    try 
    { 
     var counter = new PerformanceCounter(category, counterName, false)); 
     c.Increment(); 
    } 
    catch (Exception ex) { /* ... */ } 
} 

第一次它的運行,該類別不存在,它會創建類別和計數器。我殺了這個過程,然後打開PerfMon。在這一點上,我可以Add Counter,看到類別和計數器,加上它非常好,看着它坐在0.000。完善。在這一點上,如果我關閉PerfMon並重新打開它?我可以看到所有的系統性能計數器就好了,但我所有的自定義的 - 正如前面提到的,在生產工作的,我創建基於這些,做作的人的那些 - 只是走了。

有趣的是,如果我運行上面的代碼,它會一直告訴我該組存在。潛水更深,櫃檯甚至存在。這對我來說似乎很奇怪。離開它仍處於消失狀態,並從here提示,我可以運行:lodctr /R,他們回來。

所以它看起來像是在破壞我自己的表演櫃檯。我的問題有兩部分:

  1. 這是我在做什麼(破壞性能櫃檯)?
  2. 既然它是可重複的,在代碼或我的過程中是否有任何突出的特性可以創建此行爲?

在我看來,這與其他「表現計數器消失」的問題有些不同,因爲它們確實存在,我正在看着它們消失。

回答

2

很可能問題出在計算機,和/或它的配置,而不是在你的代碼已經發布。我遇到了同樣的情況,並沒有遇到爲什麼打開性能監視器時櫃檯消失。不過,我可以幫你這個:

  • 性能監視器有時會disable performance counters通過標記它在註冊表禁用。該鏈接可能會幫助您找到計數器被禁用的原因。

  • 監控計數器也可以使用工具typeperf完成。根據我的經驗,typeperf並未禁用perfmon意志相同的計數器,爲您提供監視計數器的替代方案。

+2

+1神祕感解決了!如果你進入'HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services',然後找到你的性能監視器計數器類別,並在'Performance'文件夾下設置regitsry值'Disable Performance Counters'爲零,它會出現在perfmon中。這解釋了爲什麼.NET認爲它在那裏,但我無法在perfmon中找到它! – SharpC 2014-10-09 14:16:10

1

確保您沒有混合x86和x64。

I.e.如果您的perf計數器是使用x64進程創建的,那麼請確保您還使用x64進程讀取它們。

此外,請嘗試以管理員身份運行。