65.9K
CodeProject 正在变化。 阅读更多。
Home

Windows 内置的看门狗基础结构如何监控性能计数器并触发警报

starIconstarIconstarIconstarIconstarIcon

5.00/5 (7投票s)

2010年3月9日

CPOL

6分钟阅读

viewsIcon

82142

downloadIcon

1175

使用新的 PLA 接口监控性能计数器并触发警报。

引言

系统管理员可以使用两种内置工具进行详细的诊断分析

  • 性能监视器
  • 资源监视器

这些工具是名为“性能监视器”的 Microsoft 管理控制台 (MMC) 管理单元的一部分。此管理单元的名称不幸更改了。它以前被称为“可靠性和性能监视器”(RPM),这更好地描述了其用途。从 Windows 7 开始,此工具已更名为“性能监视器”(PM)。在本文中,我将沿用 RPM 的名称!

停止创建您自己的在后台运行的程序,以监控并触发其他实用程序执行诊断、性能和入侵分析。开始使用已经提供了这些看门狗机制的扩展 RPM 基础设施。

使用 RPM,您可以定义复杂的条件,这些条件可以触发您定义的任何类型的操作。

RPM 的编程接口

性能日志和警报 (PLA) 是一个用于以编程方式访问 RPM 的新接口。PLA 是一组 DCOM 对象。作为 RPM 的编程接口,PLA 自 Windows Vista 以来就已存在。PLA 在 Windows 7 和 2008 中得到了扩展。使用 PLA,您可以做一些甚至 RPM 无法做到的事情。

PLA_Layers.png

基本上,可以使用 RPM(手动)或 PLA(以编程方式)完成两种任务

  1. 配置协议文件的数据收集
  2. 基于性能计数器定义触发器

Create_a_new_Data_Collector_Set.png

RPM 和 PLA 是同一技术的两个接口,该技术允许生成日志文件以及根据性能计数器生成警报。

目标

本文的目标是介绍 PLA 及其潜力。此外,我们将展示一个使用 PLA 众多方面之一的小项目,该项目配置一个警报,当 CPU 消耗超过选定的百分比时启动一个应用程序(如 notepad.exe)。

潜力

PLA 的潜力可以分为五类

PLA_-_Potential.png

这些类别在 RPM 术语中实现为数据收集器

一些数据收集器可以使用 RPM 手动设置和配置,也可以使用 PLA 以编程方式设置和配置。有一个数据收集器只能使用 PLA 访问,因此仅供软件开发人员使用。

有关每个收集器类型的详细描述,请参阅 PLA 规范,该规范可在 http://msdn.microsoft.com/en-us/library/cc238489(PROT.10).aspx 获取。

配置数据收集器

在本节中,我们重点关注配置数据收集器。

以下类型的配置数据可以使用 RPM 或 PLA 进行管理

  • 注册表:给定注册表项的内容被复制到给定的协议文件。
  • Registry.png

  • WMI:给定 WMI 查询的结果被复制到给定的协议文件。
  • WMI_Groups.png

  • 文件捕获:给定目录或文件被复制(备份)到选定的位置。此功能可用于在新程序安装之前捕获选定的一组文件和/或目录。使用此功能,您甚至可以基于触发器创建自己的 Windows 备份系统。
  • 网络适配器:现有网络接口的配置被收集并复制到给定的协议文件。
  • Network_adapter.png

一个配置数据收集器不必管理所有这些类型的收集器。一个配置数据收集器可能只用于收集注册表项。一旦收集到的数据在一个给定的协议文件中,您就可以根据您的需要来决定如何处理这些数据。您可以使用 XPATH 转换这些数据,并生成一份漂亮的报告,或者填充一个存储库来记录子网中 Windows 机器的配置。从您的数据中获取信息!

警报数据收集器

如上所述,本文的目标是展示如何使用 PLA 配置警报。使用 RPM,您可以监控一个或多个 Windows 或应用程序性能计数器,并通过任务计划程序触发任何应用程序。这个框架非常强大,可以用于级联数据收集和其他活动。当达到给定性能计数器阈值时,可以创建复杂的连锁反应。根据所选的性能计数器,警报可以是正面或负面消息。

PLA_-_Alert.png

警报还可以配置为在事件日志中记录触发原因。

Event_Log.png

示例

App_ui.png

如前所述,PLA 是一组 DCOM 对象,不直接在 .NET Framework 类库 (FCL) 中提供。因此,您必须使用众所周知的 .NET 包装器来使用它们。

要在 Visual Studio 2008 中利用 PLA 对象,请执行以下操作:

  1. 引用“性能数据服务”COM 库。引用此库会在后台自动调用 TLIMP.EXE 并创建预期的 .NET 包装器。
  2. Add_Reference_-_PLA.png

  3. 导入 PLA 命名空间。
  4. // Use the referenced Performance Logs and Alerts Library 
    using PlaLibrary; 
  5. 与其他管理工具(例如:事件日志、磁盘管理器等)一样,PLA 必须以管理员凭据启动。请注意这一点,并以这些凭据启动 Visual Studio;否则,您将不得不与“访问被拒绝”问题作斗争。
  6. 由于我们使用 PLA 来触发警报,我们必须将任务计划程序 API 集成到我们的项目中,这也是一个 COM 库!
  7. Add_Reference_-_Task_Scheduler.png

  8. 与前面一样,我们应该使用 using 语句引用它。
  9. // Use the Windows Task Scheduler COM Library 
    using TaskScheduler;

一旦这些先决条件设置完毕,我们就可以使用 PLA 编程我们的警报服务。

  1. 通过设置适当的 IAlertDataCollector 对象来创建警报。在我们的示例中,我们使用(众所周知的)“处理器时间”Windows 性能计数器。如前所述,使用 PLA 基础设施,您可以基于任何性能计数器创建警报。一旦收集器创建,我们以编程方式启动它;否则,它将存在但永远不会根据我们的条件触发我们的警报。
  2. // Create and configure the Alert Data Collector 
    IDataCollectorSet dataCollectorSet = null; 
    dataCollectorSet = new DataCollectorSetClass(); 
    IAlertDataCollector alert = 
      (IAlertDataCollector)
      dataCollectorSet.DataCollectors.CreateDataCollector(DataCollectorType.plaAlert); 
    
    // Set its name 
    alert.name = plaAlertName; 
    // Write Event to the Event Log? 
    alert.EventLog = checkBoxWriteEventToEventLog.Checked; 
    // Task Scheduler task name selected 
    alert.Task = comboBoxSchedulerTasks.Text; 
    // Poll the Performance counter once per second 
    alert.SampleInterval = 1; 
    // Update the Data Collector Set 
    dataCollectorSet.DataCollectors.Add(alert); 
    string[] thresholds = new string[1]; 
    thresholds[0] = string.Format("\\Processor(_Total)\\% Processor Time>{0:0%}" , 
                                  comboBoxCpuThreshold.Text); 
    alert.AlertThresholds = thresholds; 
    // Validate it first 
    dataCollectorSet.Commit("service\\" + alert.name, null, 
                            CommitMode.plaValidateOnly); 
    // Save it... 
    dataCollectorSet.Commit("service\\" + alert.name, null, 
                            CommitMode.plaCreateOrModify); 
    // Start it.. 
    dataCollectorSet.start(true);
  3. 如前所述,PLA 警报机制基于性能计数器,并触发使用 Windows 任务计划程序预先注册的任务。我们使用 TaskSchedulerClass API 枚举注册的任务并填充 UI。
  4. // Enumerate the registered Task Scheduler tasks
    ITaskService taskService = new TaskSchedulerClass();
    taskService.Connect(null, null, null, null);
    // We are here connected with the task scheduler
    ITaskFolder folder = taskService.GetFolder("\\");
    IRegisteredTaskCollection collection = folder.GetTasks(0);
    foreach (IRegisteredTask item in collection)
    {
      comboBoxSchedulerTasks.Items.Add( item.Name);
    }
  5. 一旦枚举了 Windows 任务计划程序名称,我们就会询问 PLA 框架我们的 PLA 数据收集器集是否存在。如果未找到,我们将收到异常并可以进行适当的响应。
  6. // Check the existence of our PLA Alert Data collector Set. 
    dataCollectorSet = null; 
    dataCollectorSet = new DataCollectorSetClass(); 
    dataCollectorSet.Query("service\\" + plaAlertName, null); 
    // At this point our PLA Alert Data Collector has been found. 
    buttonCreateAlert.Text = PLA_BUTTON_TEXT_DELETE; 

测试

要测试此虚拟警报,请执行以下操作:

  • 使用 Windows 任务应用程序创建新任务。
  • 启动我们的示例并选择要用作阈值的 CPU 消耗。
  • 选择一旦达到阈值就应触发的任务。
  • 使用应用程序(为什么不是 mspaint.exe?)将 CPU 消耗增加到您设置的阈值之上。

一旦达到阈值,您将看到注册的任务计划程序任务被触发!

一旦注册(并运行),PLA 数据收集器将继续在 CPU 达到您设置的阈值时向您发出警报。不要忘记使用此示例应用程序或直接使用 PERFMON.EXE 停止和/或删除它。

结论

我希望这篇文章能激励您认真研究性能计数器和 PLA 的潜力。考虑使用 PLA 接口进行诊断。您投入的时间将是值得的!

在此示例中,我们使用 CPU 消耗百分比作为典型的性能计数器。您可以查看我在我的网页上提供的一份全面的性能计数器列表(www.winssential.net/pdf/Windows7UltimateEngPerformanceCounters.pdf)。您可以基于系统上可用的数千个性能计数器中的任何一个来使用警报。例如,.NET 执行的 JIT 次数,或线程运行的总耗时,或 PNRP Cloud 的接收失败次数,或磁盘的读操作读/秒,或 IPsec 成功处理的总入站数据包/接收数据包等。

链接

版本

  • 1.0 - 2010 年 3 月 10 日。
© . All rights reserved.