自定义时间段内的性能计数器

Posted

技术标签:

【中文标题】自定义时间段内的性能计数器【英文标题】:Performance counters over custom period of time 【发布时间】:2015-08-18 10:46:48 【问题描述】:

我需要能够在特定的自定义时间段内收集一些性能计数器。我对来自 ServiceModelService 的几个性能计数器特别感兴趣:“Calls”和“Failed Calls”,尽管这个问题适用于我相信的任何人。

开箱即用,WCF 提供“Calls”以及自服务启动以来的总数和“Calls per second”; “失败的呼叫”,“每秒失败的呼叫”相同。我需要的是能够在自定义时间段内创建它,例如“每分钟通话次数”或“每小时通话次数”。

我还没有看到任何开箱即用的方法。我想我可以创建自己的性能计数器收集器,它将每隔 X 时间进行一次计算;我的应用程序在 Azure 云服务中运行,因此我相信这可以在启动任务中安装的单独 exe 中完成,或者在 Web 角色启动时产生的单独线程中完成。

我在自己的具体问题中提出了这个问题,但我相信这个问题适用于任何场景:如何在特定的自定义时间段内捕获性能计数器。

任何帮助将不胜感激!谢谢!

【问题讨论】:

【参考方案1】:

所以事实证明,“每秒调用次数”和“每秒失败调用次数”性能计数器的名称有点误导......它们的默认采样率为 1 秒,但它们能够适用于您的任何采样间隔率需要。例如,如果您想知道五秒钟内发生的调用次数,您可以编写如下代码:

// load performance counter
var numOfCalls = new PerformanceCounter(...);

// read initial value for the period
numOfCalls.NextValue();

// wait desired period
Thread.Sleep(5000);

// read final value, the counter will internally calculate it based on the two samples
numOfCalls.NextValue();

如果您使用 perfmon,您可以更改采样率;如果您使用的是代码,那么您可以通过间隔 NextValue 调用来自己设置采样率。

【讨论】:

以上是关于自定义时间段内的性能计数器的主要内容,如果未能解决你的问题,请参考以下文章

自定义性能计数器触发安全异常。为啥?

通过 WMI 访问应用程序的自定义性能计数器

跨应用域回收使用自定义性能计数器

请求的性能计数器不是自定义计数器,它必须初始化为 ReadOnly

自定义 SQL Server 性能计数器

从非托管代码更新性能计数器