RateOfCountsPerSecond64 类型的性能计数器的值始终为 0

Posted

技术标签:

【中文标题】RateOfCountsPerSecond64 类型的性能计数器的值始终为 0【英文标题】:Performance counter of type RateOfCountsPerSecond64 has always the value 0 【发布时间】:2012-08-08 13:45:15 【问题描述】:

我有一个更新两个性能计数器值的 WCF 服务。第一个定义为 NumberOfItems64,第二个定义为 RateOfCountsPerSecond64。当我更新它们的值时(我每秒执行几次),perfmon 按预期显示第一个计数器的正确值,但总是说第二个计数器的值是 0。当我调试代码时,我可以看到第二个计数器的 RawValue 属性按预期更新...

这是我创建计数器的 PowerShell 代码:

$categoryName = "My category"

$exists = [System.Diagnostics.PerformanceCounterCategory]::Exists($categoryName)
if ($exists)

    [System.Diagnostics.PerformanceCounterCategory]::Delete($categoryName)


$counters = new-object System.Diagnostics.CounterCreationDataCollection

$counter = new-object System.Diagnostics.CounterCreationData
$counter.CounterType = [System.Diagnostics.PerformanceCounterType]::NumberOfItems64
$counter.CounterName = "# ops"
$counters.Add($counter)

$counter = new-object System.Diagnostics.CounterCreationData
$counter.CounterType = [System.Diagnostics.PerformanceCounterType]::RateOfCountsPerSecond64
$counter.CounterName = "# ops/sec"
$counters.Add($counter)

[System.Diagnostics.PerformanceCounterCategory]::Create($categoryName, $categoryName, [System.Diagnostics.PerformanceCounterCategoryType]::MultiInstance, $counters)

这是我更新计数器值的代码:

long value = GetValue();
counter1.IncrementBy(value);
counter2.IncrementBy(value);

我在 *** 上发现了这个问题,看起来和我的很相似:Counter of type RateOfCountsPerSecond32 always shows 0 但它不能解决我的问题。

有什么想法吗?

【问题讨论】:

【参考方案1】:

重新启动计算机后,我的代码按预期工作......奇怪!!!!!!!

【讨论】:

【参考方案2】:

我在 C# 中遇到了同样的问题。我还发现重新启动修复了它。

另一件事似乎对我有用,在这样的块中初始化计数器:

counter.BeginInit();
counter.RawValue = 0;
counter.EndInit();

那是 C# 代码,但我猜 powershell 有一组相应的函数。

【讨论】:

以上是关于RateOfCountsPerSecond64 类型的性能计数器的值始终为 0的主要内容,如果未能解决你的问题,请参考以下文章

从源码分析面试中经常出现的集合类问题

OSAtomicIncrement64 x 类属性...有啥优势?

JavaBean和Map转换封装类

为啥当代码编译正常并设置类路径时找不到base64类

springboot 初始加载自动配置类

非spring类调用spring方法