【问题标题】:Is there any uniform method to calculate any counters within any category for PerformanceCounter?是否有任何统一的方法来计算 PerformanceCounter 的任何类别中的任何计数器?
【发布时间】:2017-04-27 20:12:38
【问题描述】:

我正在使用 C# 的“PerformanceCounter”类来计算“内存”类别下的以下 2 个计数器“可用字节”和“% Committed Bytes In Use”。

            PerformanceCounter pc = new PerformanceCounter("Memory", "Available Bytes", true);
        PerformanceCounter pc1 = new PerformanceCounter("Memory", "% Committed Bytes In Use", true);

        var a = pc.RawValue;
        var b = pc1.NextValue();

我在这里看到的问题是“RawValue”用于“Available Bytes”计数器,而“NextValue()”用于“% Committed Bytes In Use”计数器。

有没有统一的方法来计算两个或所有的计数器?

【问题讨论】:

    标签: c# performancecounter


    【解决方案1】:

    它仅因类别而异,因为不同的类别包含不同的计数器类型。 PerformanceCounter.CounterType 属性定义了计数器保存的数据类型,以及数据的计算方式。对于随着时间的推移测量差异的计数器具有原始值的差异是没有意义的,因为对于想要进行测量的不同客户来说,差异可能在不同的时间段内。有关不同类型的更多信息,请参阅Performance Counter Type Enumeration。如果您真的想深入了解每种类型的工作原理,您必须求助于所有这些都基于的 Win32 文档。曾经有一个页面包含所有这些,但我现在很难找到它。我能找到的最接近的是:https://technet.microsoft.com/en-us/library/cc960029.aspx。一些性能计数器类型使用一个主计数器和一个“基本”计数器,然后使用基于每个这些(可能还有系统时间)的当前和先前原始值的公式来计算NextValue()RawValue 对于某些计数器类型可能似乎无效,因为以与计算值相同的方式解释它是没有意义的。例如,IIRC 表示进程使用的 CPU 百分比,原始值是自程序启动以来使用的 CPU 滴答数,如果将其解释为百分比是无意义的。只有与之前的值和经过的时间(您也可以从中推断出最大可能的变化)相比,它才有意义。

    使用RawValue 对某些计数器有意义,但对其他计数器无效。但是,NextValue() 在您第一次调用它时通常无法返回有意义的值,因为当它被计算为样本之间的差异时,您没有以前的样本可以比较它。您可以忽略它,或者您可以将代码设置为在启动期间调用它一次,以便后续调用获得真实值。请记住,NextValue() 预计将在计时器上被调用。例如,如果您在 Network Bytes Sent 计数器上调用它,它将返回上一次调用和本次调用之间发送的字节数。因此,例如,如果您在第一次调用后 2 秒在 Network Bytes Sent 计数器上调用 NextValue(),然后在 2 分钟后再次调用,您将获得非常不同的值,即使网络传输是稳定的,因为 2 之后的调用seconds 是返回 2 秒内传输的字节数,2 分钟后调用将返回 2 分钟内传输的字节数。

    因此,简而言之,您可以对所有计数器类型使用 NextValue(),但您必须丢弃或忽略返回的第一个值,并且您必须在固定的时间间隔内调用 NextValue() 以使结果有意义(只需就像交互式 Windows 性能监视器程序一样)。

    【讨论】:

      【解决方案2】:

      根据我的经验和主要是 MSDN 文档,它会因性能计数器类别而异,然后又因特定属性属性而异,例如 Available Bytes% Committed 在您的情况下。

      您正在寻找的可能是 NextSample()。

      Perf Counter

      属性:RawValue

      获取或设置此计数器的原始值或未计算值。

      ^ 表示它不一定取决于创建它的开发人员。

      方法:NextValue()

      获取一个计数器样本并返回它的计算值。

      ^ 表示这取决于创建它的开发者。

      方法:NextSample()

      获取一个计数器样本,并为其返回原始值或未计算值。

      也是很久以前向我解释过的东西,所以请持保留态度,RawValue 的概念并不总是有效的。

      RawValues 用于创建样本。 NextSample() 或样本是 RawValues 随时间推移的平均值 - 更加现实。 NextValue() 将清理样本转换为 %,或从字节转换为千字节(基于值的上下文和开发人员的实现)。

      因此,以我的拙见,即使信息超过 10 年,也是放弃使用 RawValue 并使用 NextSample() 代替 - 如果您需要一个现实/准确的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多