如何:注册或取消注册性能计数器

上次修改时间: 2011年3月3日

适用范围: SharePoint Foundation 2010

本主题介绍如何注册 Windows Server 2008 性能计数器,以便通过 Microsoft SharePoint Foundation 性能监视和 HTTP 请求限制系统进行监视,以及如何从该系统中删除计数器。

重要注释重要信息

本主题中的示例使用一个控制台应用程序,可以实际运行。无论项目的类型如何,关键的一点是,您要设置正确的目标 .NET Framework 和 CPU。项目必须针对 Microsoft .NET Framework 3.5 而不是针对 .NET Framework 4。目标 CPU 必须为"任何 CPU"或"x64"。有关此选择的信息,请参阅如何:设置正确的目标框架和 CPU。默认情况下,目标 CPU 通常为"x86"。若要对此进行更改,请在"解决方案资源管理器"中右键单击项目名称,然后选择"属性"。您可以使用"生成"选项卡上的"平台目标"下拉列表来更改目标 CPU。

监视器和运行状况分数计算器的持久性

HTTP 请求限制系统中的性能监视器在运行时由系统基础结构作为 SPSystemPerformanceCounterMonitor 对象创建。对于 SPHttpThrottleSettings 对象(本身保存在 Web 应用程序的 HttpThrottleSettings 属性中)的持久 PerformanceMonitors 属性中的每个 SPPerformanceMonitorCreationData 对象,系统基础结构都会创建一个此类对象。不过,您的代码不调用 SPPerformanceMonitorCreationData 类的构造函数,而是调用 SPHttpThrottleSettings.AddPerformanceMonitor() 方法。此方法构造 SPPerformanceMonitorCreationData 对象并将其添加到 PerformanceMonitors 集合中。SPPerformanceMonitorCreationData 类的一个重要属性是 AssociatedHealthScoreCalculatorSPHttpThrottleSettings.AddPerformanceMonitor() 方法还会为您创建运行状况分数计算器对象。仅在您创建新计算器以便将其与已注册的性能监视器的现有计算器交换时,您的代码才调用 SPBucketHealthScoreCalculator 的构造函数。

创建 Visual Studio 解决方案

  1. 在 Microsoft Visual Studio 中创建一个控制台应用程序项目,然后设置目标 .NET Framework 和 CPU 平台。

  2. 将对 Microsoft.SharePoint.dll 的引用添加到该项目中。该文件位于 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\ISAPI 中。

  3. 打开 program.cs,设置适当的命名空间和类名称,并为 Microsoft.SharePoint、Microsoft.SharePoint.Administration 和 Microsoft.SharePoint.Utilities 命名空间添加 using 语句。现在,您的代码应该类似于下面这样:

    using System;
    using Microsoft.SharePoint; 
    using Microsoft.SharePoint.Administration;
    using Microsoft.SharePoint.Utilities;
    
    namespace Contoso.SharePoint.Utilities
    {
        class PerformanceCounterRegistrar
        {
            static void Main(string[] args)
            {
    
            }
    // end Main
        }
    }
    

添加性能监视器

  1. 在 Main 方法中,声明定义区域边界的 Double 值的数组,运行状况分数计算器使用这些区域向值分配运行状况分数。区域是可能的计数器值的子范围。该数组必须满足下列条件:

    • 元素的值必须按照从小到大或者从大到小的顺序有序排列。

    • 这些值还必须根据运行状况按照从最佳到最差的顺序有序排列。因此,如果 buckets 是数组对象的名称,则 buckets[0] 值所表示的运行状况优于 buckets[1] 值所表示的运行状况,而 buckets[1] 所表示的运行状况优于 buckets[2] 值所表示的运行状况,依此类推。因此,buckets[buckets.Length-1] 值在 buckets 中必须始终表示最差运行状况。

    包含 10 个元素的数组(定义性能区域的数组的标准大小)可创建 11 个区域:所表示的运行状况优于 buckets[0] 的值位于第一个区域中,而所表示的运行状况低于 buckets[10] 的值位于第 11 个区域中。运行状况分数计算器将根据值所属的区域为该值(或多个值的函数结果)分配运行状况分数。分数为从 0 到 10 的 Int32。运行状况最佳的区域中的值得到 0,运行状况最差的区域中的值得到 10。数组可以包含 10 个以下元素。例如,假定一个假设的性能计数器的可能值范围为 0 到 50.0(使用低值表示运行状况),并且假定将数字 10.0、20.0、30.0 和 40.0 用作区域边界。在此情形下,标准运行状况分数计算器类的对象 SPBucketHealthScoreCalculator 将根据下列规则生成运行状况分数:

    • 0 用于低于 10 的性能值

    • 3 用于介于 10.0 和 20.0 之间的值

    • 5 用于介于 20.0 和 30.0 之间的值

    • 8 用于介于 30.0 和 40.0 之间的值

    • 10 用于高于 40.0 的值

    构造区域数组时,必须牢记仅在至少监视的计数器分数为 10(根据多个计数器样例的加权平均值)时,请求限制系统才进入限制模式。因此,对于包含 10 个或更少元素的数组,为数组中的最后一个元素选择值至关重要。该值应该指示运行状况不佳,已经严重到了必须阻止某些 HTTP 请求的程度。同样,对于包含 20 个元素的数组,运行状况低于倒数第二个元素的值所得的分数将为 10。

    备注

    数组可以只包含一个元素,在这种情况下,运行状况低于该单个元素值的值所得的运行状况分数将为 10,所有其他值所得的运行状况分数将为 0。既然低于 10 的值无法触发限制,为什么还要在数组中包含多个元素呢?换句话说,为什么不确立一个二元运行状况分数系统:"运行状况正常"和"运行状况欠佳"?这是因为,运行状况最差计数器的运行状况分数被添加到 HTTP 响应对象的标头中,即使此分数低于 10 也是如此,因此无法产生限制。如果此值可以在大于两个值的范围内变化,则客户端可以使用该报告的值记录服务器场的运行状况趋势。客户端应用程序还可以使用运行状况分数改善与服务器的同步。例如,客户端应用程序可以为较高(表示运行状况较差)的运行状况分数设置较长的同步间隔。(一些 Microsoft Office 应用程序执行此操作。)另一方面,在数组中包含 10 个以上的元素基本上没有什么意义,因为只有 11 个可能的运行状况分数,所以多于 11 个区域只可能导致两个或多个连续区域中的值得到相同的运行状况分数。不过,如上所述,包含的元素可以少于 10 个,这可能适合某些类型的性能计数器。

    以下代码显示了将用于为名为"Processor\% Processor Time\_Total"的 Windows Server 2008 计数器创建区域的数组的声明。此计数器报告服务器处理器在除了系统空闲进程之外的进程上所花费时间的百分比。有关此计数器的详细信息,请参阅处理器对象(该链接可能指向英文页面)

    double[] busyProcessorBuckets = new double[10] {20.0, 28.8, 37.6, 46.4, 55.2, 64.0, 72.8, 81.6, 90.4, 99.2}; 
    

    在本示例中,任意两个值之间的差值是相同的。实际上,不一定要这样。对于某些类型的计数器来说,可能适合让值呈指数变化。另请注意,在本示例中值采用升序。但是,对于某些类型的性能计数器来说,较大的值所表示的运行状况可能优于较小的值。因为区域数组必须根据运行状况从最佳到最差的顺序排列,所以对于此类计数器,值在区域数组中必须采用降序。

  2. 仍然在 Main 方法中,获取对 Web 应用程序的引用,然后通过调用 GetHttpThrottleSettings(SPPersistedObject) 方法获取对限制设置的引用。下面的示例显示了此过程。

    Uri webApplicationUri = new Uri("Http://localhost/");
    SPWebApplication webApplication = SPWebApplication.Lookup(webApplicationUri);
    SPHttpThrottleSettings throttleSettings = SPHttpThrottleSettings.GetHttpThrottleSettings(webApplication);
    
  3. 仍然在 Main 方法中,调用 SPHttpThrottleSettings.AddPerformanceMonitor() 方法,向其传递计数器名称、类别、实例和区域数组作为参数。根据数组采用升序还是降序,为最后一个参数分别传递 true 或 false。以下代码继续显示运行示例。

    throttleSettings.AddPerformanceMonitor("Processor",
                                           "% Processor Time",
                                           "_Total",
                                           busyProcessorBuckets,
                                           true);
    
    提示提示

    SPHttpThrottleSettings.AddPerformanceMonitor() 方法不检查是否已经有性能监视器正在监视同一计数器的同一实例。使用相同的参数对该方法进行后续调用将注册多余的性能计数器对象。

确认已经注册性能计数器

  • 使用 SharePoint Management Shell cmdlet Get-SPWebApplicationHttpThrottlingMonitor 获取 Web 应用程序的已注册性能计数器列表。以下代码显示该 cmdlet 的调用语法:

    Get-SPWebApplicationHttpThrottlingMonitor –identity http://<Web application URL>
    

    新注册的性能计数器的输出类似于以下内容:

    Category                        : Processor
    Counter                         : % Processor Time
    Instance                        : _Total
    AssociatedHealthScoreCalculator : [20.0,28.8,37.6,46.4,55.2,64.0,72.8,81.6,90.4,99.2]
    

取消对性能计数器的注册

  • 取消对性能计数器的注册与注册性能计数器相似,不同的是代码调用 RemovePerformanceMonitor()。此方法的一个重载可以取消对具有特定类别、计数器和实例名称的所有性能计数器的注册。另一个重载可以取消对具有指定类别和计数器名称的所有计数器的注册,因此,如果不同的监视器正在监视特定计数器的不同实例,则可以在单个调用中将其全部删除。下面的示例显示用于删除运行示例中的监视器的 RemovePerformanceMonitor() 方法:

    Uri webApplicationUri = new Uri("Http://localhost/");
    SPWebApplication webApplication = SPWebApplication.Lookup(webApplicationUri);
    SPHttpThrottleSettings throttleSettings = SPHttpThrottleSettings.GetHttpThrottleSettings(webApplication);
    
    // Remove the monitor. 
    throttleSettings.RemovePerformanceMonitor("Processor",
                                              "% Processor Time",
                                              "_Total");
    

请参阅

概念

请求限制