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