如何:以编程方式读取监控值

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

适用范围: SharePoint Foundation 2010

本主题说明代码可以如何读取 Microsoft SharePoint Foundation 性能监视和请求限制系统正在监视的 Windows Server 2008 性能计数器的值。

重要注释重要信息

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

以编程方式读取性能计数器

下面的过程说明如何使用 SharePoint Foundation 性能监视 API 来读取性能计数器。操作系统 (OS) 的基础性能计数器系统存在很多微妙之处。例如,有些计数器只有在使用代码第二次读取时才会给出准确值。建议您熟悉以下主题以及您的代码要读取的特定计数器。其中很多主题介绍的是非直接相关的托管或非托管的 API,但这些主题可加深您对基础系统的理解。

我们还建议您搜索知识库、博客和论坛内容,了解您的代码要读取其数据的每个计数器。

备注

.NET Framework 具有用于读取 Windows Server 2008 性能计数器的值的 API,但本主题假定您希望确定正在使用已向 Microsoft SharePoint Foundation 性能监视和请求限制系统注册以用于监视的计数器。

读取性能计数器

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

  2. 向控制台应用程序项目中添加对位于 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\ISAPI 中的 Microsoft.SharePoint.dll 的引用。

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

    using System;
    using System.Threading;
    using Microsoft.SharePoint; 
    using Microsoft.SharePoint.Administration;
    using Microsoft.SharePoint.Utilities;
    
    namespace Contoso.SharePoint.Utilities
    {
        class PerformanceCounterReader
        {
            static void Main(string[] args)
            {
    
            }
    // end Main
        }
    }
    
  4. 在 Main 方法中,获取对要读取其性能监视器的 Web 应用程序的引用。下面的代码说明了实现方式。

    static void Main(string[] args)
    {
        Uri webApplicationUri = new Uri("Http://localhost/");
        SPWebApplication webApplication = SPWebApplication.Lookup(webApplicationUri);
    
    }
    

    将本主题中的其余所有代码都添加到 Main 方法中。

  5. 获取对 Web 应用程序的限制设置和已注册的监视器集合的引用。

    SPHttpThrottleSettings throttleSettings = SPHttpThrottleSettings.GetHttpThrottleSettings(webApplication);
    SPSystemPerformanceMonitorCollection monitors = throttleSettings.GenerateMonitors();
    
  6. 获取对要读取其值的监视器的引用。在某些情况下,您在设计时知道监视器在集合中的位置,可以使用一个索引器来引用它。例如,如果它是最后一个计数器,则可以使用 SPSystemPerformanceCounterMonitor counterMonitor = (SPSystemPerformanceCounterMonitor)monitors[monitors.Count - 1]; 命令行。(请注意,您必须将监视器对象转换为其所属的特定的非抽象监视器类型。)而在其他情况下,您的代码可能需要循环访问集合,以查找具有一组特定的 CategoryCounterInstance 属性值的监视器。在下面的示例中,代码将循环访问所有已注册的监视器,读取 Value 属性,并报告其名称和值。

    foreach (SPSystemPerformanceMonitor monitor in monitors)
    {
        SPSystemPerformanceCounterMonitor counterMonitor = (SPSystemPerformanceCounterMonitor)monitor;
        Console.WriteLine(counterMonitor.Name);
    
        // Read and display the counter value. 
        double currentValue = Convert.ToDouble(counterMonitor.Value); 
        Console.WriteLine(currentValue.ToString());                  
    }
    
    Console.WriteLine("Press return to end application.");
    Console.Readline();
    
  7. 请注意,对于很多类型的性能计数器,第一次读取计数器时总是报告默认值,原因是计数器的值是两个原始数据点的函数计算结果。您必须第二次读取计数器才能获得有效值(两次读取之间要有等待时间)。例如,如果所监视的计数器是 Processor\% Processor Time\_Total,那么 Value 的 get 访问器需要在第一次通过调用代码读取它之后,至少等待整整一秒钟才能生成有效值。若要确保您的代码获得有效值,请调用 Sleep(Int32) 来等待至少一秒钟,然后再次读取 Value。下面的代码对此进行了说明。

    foreach (SPSystemPerformanceMonitor monitor in monitors)
    {
        SPSystemPerformanceCounterMonitor counterMonitor = (SPSystemPerformanceCounterMonitor)monitor;
        Console.WriteLine(counterMonitor.Name);
    
        // Read the counter value, wait 1.5 seconds, and read again for a valid value.
        double currentValue = Convert.ToDouble(counterMonitor.Value); 
        Thread.Sleep(1500);
        currentValue = Convert.ToDouble(counterMonitor.Value);
    
        // Write the valid value to the screen.
        Console.WriteLine(currentValue.ToString());                  
    }
    
    Console.WriteLine("Press return to end application.");
    Console.Readline();
    
    提示提示

    在获得有效值之后,如果您再次需要同一个值,请使用 LastValue 属性。再次读取 Value 将导致另一次提取基础计数器的值,这通常将得到一个不同的值。

请参阅

概念

请求限制