如何:创建、修改和更改区域样式运行状况分数计算器

上次修改时间: 2010年9月17日

适用范围: SharePoint Foundation 2010

本主题介绍如何创建、替换和修改与 Microsoft SharePoint Foundation 中的性能监视器相关联的区域样式运行状况分数计算器。

重要注释重要信息

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

开始创建 Visual Studio 解决方案

  1. 在 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 HealthCalculatorsUtility
        {
            static void Main(string[] args)
            {
    
            }// end Main
        }
    }
    
  4. 本主题后面将继续讨论其中的一个步骤。

替换运行状况分数计算器

如果您希望将与监视器相关联的运行状况分数计算器替换为具有不同区域边界的新运行状况分数计算器,并且可能还要将区域值排序从升序改为降序或从降序改为升序,请使用下列步骤。

替换与监视器相关联的运行状况分数计算器

  1. 在 Main 方法中,声明 Double 值的数组,这些值构成的数组定义了区域的边界,而替换的运行状况分数计算器使用这些区域将运行状况分数分配给上述那些值。区域是可能的计数器值的子范围。对于此数组必须以何种方式声明是有限制的。有关此类限制的详细信息,请参阅如何:注册或取消注册性能计数器中的步骤"添加性能监视器"。下面的代码显示了将用于为名为"Processor\% Processor Time"的 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. 调用 SPBucketHealthScoreCalculator 构造函数,并将区域数组对象作为参数传递。根据数组是升序还是降序,为第二个参数分别传递 true 或 false。下面的代码继续显示该示例。

    SPBucketHealthScoreCalculator nonIdleTimeHealthCalculator = new SPBucketHealthScoreCalculator(busyProcessorBuckets, true);
    
  3. 在 Main 方法中,获取对 Web 应用程序的引用,然后通过调用 GetHttpThrottleSettings(SPPersistedObject) 方法获取对限制设置的引用。下面的示例显示了此过程。

    Uri webApplicationUri = new Uri("Http://localhost/");
    SPWebApplication webApplication = SPWebApplication.Lookup(webApplicationUri);
    SPHttpThrottleSettings throttleSettings = SPHttpThrottleSettings.GetHttpThrottleSettings(webApplication);
    
  4. 在 Main 方法内,获取对保存的 SPPerformanceMonitorCreationData 对象集合的引用。(实际的性能监视器对象 [SPSystemPerformanceCounterMonitor] 是在运行时从这些存储的创建数据对象中创建的。)

    SPHttpThrottlingMonitors myMonitors = throttleSettings.PerformanceMonitors;
    
  5. 还是在 Main 方法中,获取对性能监视器特定实例的引用,您需要替换该性能监视器的运行状况分数计算器,并将新的计算器分配给它的 AssociatedHealthScoreCalculator 属性。在某些情况下,您是在设计时得知集合中监视器的索引。但更经常发生的情况是,您的代码用类别、计数器和实例名称来标识它,如下面的示例所示。请注意,将调用 Update() 来保存对配置数据库的更改。

    foreach (SPPerformanceMonitorCreationData creationData in myMonitors)
    {
        if (creationData.Category.Equals("Processor", StringComparison.OrdinalIgnoreCase)
            & creationData.Counter.Equals("% Processor Time", StringComparison.OrdinalIgnoreCase) 
            & creationData.Instance.Equals("0", StringComparison.OrdinalIgnoreCase))
        {
            creationData.AssociatedHealthScoreCalculator = nonIdleTimeHealthCalculator;
            throttleSettings.Update();
            break;
        }
    }
    

修改区域边界

如果您只需要更改区域边界,则不必替换与监视器相关联的整个运行状况分数计算器。如果新的边界与现有边界的升序或降序排序相匹配,则可以使用 SetScoreBuckets([]) 方法来更改边界。

修改区域边界

  1. 在 Main 方法中,声明定义区域新边界的 Double 值的数组。区域是可能的计数器值的子范围。对于此数组必须以何种方式声明是有限制的。有关此类限制的详细信息,请参阅如何:注册或取消注册性能计数器中的步骤"添加性能监视器"。下面的代码显示了将用于为名为"Processor\% Processor Time"的 Windows Server 2008 计数器创建区域的数组的声明。但与本主题上文替换运行状况分数计算器一节中定义的区域不同,此数组定义呈指数提高的一组值。

    double[] busyProcessorBuckets = new double[5] {5.0, 10.0, 20.0, 40.0, 80.0}; 
    
  2. 您不用创建新计算器对象,而是获取对您要修改的现有计算器的引用,并将其强制转换为表示区域样式计算器的类。该操作所用的步骤与本主题上文替换运行状况分数计算器一节中的步骤相同。下面的代码显示了这些步骤的结果:

    Uri webApplicationUri = new Uri("Http://localhost/");
    SPWebApplication webApplication = SPWebApplication.Lookup(webApplicationUri);
    SPHttpThrottleSettings throttleSettings = SPHttpThrottleSettings.GetHttpThrottleSettings(webApplication);
    
    SPHttpThrottlingMonitors myMonitors = throttleSettings.PerformanceMonitors;
    
    foreach (SPPerformanceMonitorCreationData creationData in myMonitors)
    {
        if (creationData.Category.Equals("Processor", StringComparison.OrdinalIgnoreCase)
            & creationData.Counter.Equals("% Processor Time", StringComparison.OrdinalIgnoreCase) 
            & creationData.Instance.Equals("0", StringComparison.OrdinalIgnoreCase))
        {
            SPBucketHealthScoreCalculator bucketScoreCalculator = 
              (SPBucketHealthScoreCalculator)creationData.AssociatedHealthScoreCalculator;
    
        }
    }
    
  3. 还是在 if 结构中,调用监视器创建数据对象的 SetScoreBuckets([]) 方法,并传递新的区域数组。请确保调用 Update() 来保存更改。

    bucketScoreCalculator.SetScoreBuckets(busyProcessorBuckets);
    throttleSettings.Update();
    break;
    

请参阅

概念

请求限制