上次修改时间: 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,但这些主题可加深您对基础系统的理解。
Windows 性能计数器(该链接可能指向英文页面)以及此节点下的主题。
监视性能阈值简介(该链接可能指向英文页面)以及此节点下的主题。
PerformanceCounter
我们还建议您搜索知识库、博客和论坛内容,了解您的代码要读取其数据的每个计数器。
备注
.NET Framework 具有用于读取 Windows Server 2008 性能计数器的值的 API,但本主题假定您希望确定正在使用已向 Microsoft SharePoint Foundation 性能监视和请求限制系统注册以用于监视的计数器。
读取性能计数器
在 Microsoft Visual Studio 中创建一个控制台应用程序项目,然后设置目标 .NET Framework 和 CPU 平台。
向控制台应用程序项目中添加对位于 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\ISAPI 中的 Microsoft.SharePoint.dll 的引用。
打开 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 } }
在 Main 方法中,获取对要读取其性能监视器的 Web 应用程序的引用。下面的代码说明了实现方式。
static void Main(string[] args) { Uri webApplicationUri = new Uri("Http://localhost/"); SPWebApplication webApplication = SPWebApplication.Lookup(webApplicationUri); }
将本主题中的其余所有代码都添加到 Main 方法中。
获取对 Web 应用程序的限制设置和已注册的监视器集合的引用。
SPHttpThrottleSettings throttleSettings = SPHttpThrottleSettings.GetHttpThrottleSettings(webApplication); SPSystemPerformanceMonitorCollection monitors = throttleSettings.GenerateMonitors();
获取对要读取其值的监视器的引用。在某些情况下,您在设计时知道监视器在集合中的位置,可以使用一个索引器来引用它。例如,如果它是最后一个计数器,则可以使用 SPSystemPerformanceCounterMonitor counterMonitor = (SPSystemPerformanceCounterMonitor)monitors[monitors.Count - 1]; 命令行。(请注意,您必须将监视器对象转换为其所属的特定的非抽象监视器类型。)而在其他情况下,您的代码可能需要循环访问集合,以查找具有一组特定的 Category、Counter 和 Instance 属性值的监视器。在下面的示例中,代码将循环访问所有已注册的监视器,读取 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();
请注意,对于很多类型的性能计数器,第一次读取计数器时总是报告默认值,原因是计数器的值是两个原始数据点的函数计算结果。您必须第二次读取计数器才能获得有效值(两次读取之间要有等待时间)。例如,如果所监视的计数器是 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 将导致另一次提取基础计数器的值,这通常将得到一个不同的值。