7. 性能监视
- Microsoft没有提供容易的显示性能资讯方法。
- 开发者必须在它们的应用程序中承担显示性能资讯所需花费的时间。
- Microsoft没有强调或提升性能监视的重要性。
我先检查了几年前在自己的应用程序中加入的性能资讯,对这个工作的复杂性大吃一惊,并尽可能的延迟了该工作。最后我的解决方案是建立一个C++ 类别,将一个使作业系统能看见性能资讯之处理程序封装起来,并让我能容易地将性能资讯加入任何应用程序。本章最后将会列出此C++ 类别。
性能监视的观点
在我们开始学习在程序中显示性能资讯的相关内容前,先解释Windows提供之性能监视的基本能力。您可以从许多观点来检查性能监视,而我也愿意对它们做些讨论。
让我们先从一个使用者的观点开始对性能监视做些检查。我将会解释系统如何组织性能资讯以及管理者、使用者和开发者该如何使用System Monitor ActiveX控制来测量系统的健康情形。
然后讨论一些开发者将性能监视加入应用程序(或者可能加到一个Windows服务中)的一般原因。对于这个介绍性的教材,我将会提出更多技术性的内容,并从系统和程序设计的观点来讨论Windows性能监视的架构。
从使用者观点看性能监视
系统监视器(System Monitor)是被包含在Windows内的一个ActiveX控制,允许管理者察看性能资讯。因为我对不熟悉此控制的人数大为吃惊,所以决定从一个简短的介绍开始。
为了试验此ActiveX控制,您可以从系统管理工具功能表中选择性能,或者您可以使用以下的方法在Microsoft管理主控台中(Microsoft Management Console,MMC)增加一个ActiveX控制:
- 执行Microsoft管理主控台应用程序(MMC.exe)。
- 从主控台功能表选择新增/移除嵌入式管理单元,然后按下新增按钮。
- 在新增独立嵌入式管理单元对话方块中选择ActiveX控制,然后按下新增按钮。
- 在插入ActiveX控制项精灵的画面按下一?按钮。
- 选择System Monitor Control并按下一?按钮,接下来再按下完成按钮。
- 在新增独立嵌入式管理单元对话方块中按下关闭按钮。
- 在新增/移除嵌入式管理单元对话方块中按下确定按钮。
- 在左窗格中选择系统监控程序节点。
在您正确地完成了每一步骤后,MMC视窗应该显示如图7-1的内容。
一开始,系统监控程序对于您想要监控的性能资讯没有任何概念,所以它的图表是空的。要将资讯加入图表时,您必须在工具列上按下新增(+)钮,以显示新增计数器对话方块(如图7-2所示)。如您所见,在对话方块中有很多选项可供使用者选择。在本章节中讨论性能计数器时,为了要让您知道如何组合这些资讯,所以现在我将要解释这些选项的内容。
| 图7-1 在MMC中的系统监控程序项 |
| 图7-2 系统监控程序的新增计数器对话方块 |
您的第一个要决定的是该从哪些电脑收集性能资讯。系统监控程序最佳的特性之一是它具有收集本地机器与远端机器之性能资讯的能力。事实上,它能够同时收集两个机器的资讯,并显示在单一图表中。这可以使管理者可以很容易的比较二台或更多电脑的性能资讯。
一旦您选择了一台电脑后,接着便会选择一个性能物件。性能物件即是一个在系统中提供性能资讯的元件。离开这个对话方块后,Windows便会显示许多物件,大部份是那些与系统相关的物件。这里有一些关于系统物件的范例:处理器(CPU本身)、处理程序(正在执行的应用程序)、实体磁盘机(硬盘机)、系统(作业系统本身)、线程(正在处理程序中执行的线程)以及内存(RAM)。
记住性能监视并没有局限在作业系统元件;设备驱动程序也能显示它们的性能物件。Telephony和TCP即是设备驱动程序物件的范例。当在电脑上设定Windows时,所有这些物件都具有特定的用处。
在性能监视的设计上,Microsoft没有缺乏远见:系统也允许服务及应用程序去显示它们自己的性能物件。一些服务的范例包含Indexing Service以及Distributed Transaction Coordinator(DTC)皆是。如何从一个服务或应用程序显示性能物件是构成本章大部份的内容。
性能物件的设计者也定义了物件支援的计数器。例如,在新增计数器对话方块中,处理程序物件提供了多个计数器的选择(显示在从清单选择计数器方块中)。清单方块中的每一个项目都表示您可以监控之关于处理程序的项目。例如,% Processor Time计数器将为您展示实际在处理器上执行的一个处理程序内之线程的百分比时间。Handle Count计数器会显示有多少核心物件已经被处理程序开启。ID Process计数器则显示全系统当处理程序被建立时,其被指定的唯一识别码。这些计数器仅仅表示可用于一个处理程序物件之计数器的的采取样品。
选择一个性能物件后,现在您可以将注意力转移到对话方块中的从清单选取例项部份。一个 实例 即是被给定至一个物件类型的实例名称。例如,在系统中执行的Process物件有许多的实例;每一个Process物件实例被它的 .exe文件名称而确认。大部份的物件皆支援实例,然而有一些却没有。例如,因为只有一个作业系统在电脑上执行,所以System物件从清单选取例项方块中并没有显示任何的项目。
图7-3显示了物件、实例以及计数器之间的关系。在左边,您会看到一个支援实例的物件;它也许会拥有零或多个现在与它关联的实例。每一个这些实例皆相同的计数器号码,但是计数器的值则会因不同的实例而有所不同。记住若一个支援实例的物件没有现在与它关联的实例,那么就不能取得计数器资讯。
位于右边之不支援实例的物件永远只有一组与它关联的计数器。
| 图7-3 物件、实例以及计数器之间的关系 |
如同您在操件新增计数器的对话方块,您将会看见许多可用的物件,每一个计数器皆拥有一组自己的隐秘名称。若您按下对话方块中的解说按钮,会出现一个分离的视窗(如图7-4所示),它提供了现在被选择之计数器的说明。
| 图7-4 解说文字视窗,提供一个关于性能计数器的附加资讯 |
Windows实际上允许解释性的文字与一个除了它本身的计数器外的性能物件。然而,目前系统监控程序并没有提供任何显示物件说明文字的方法。我希望Microsoft将来可以加强这方面的控制。
在选择了一个电脑、物件、计数器以及实例(如果可用的话)后,按下新增按钮以使系统监控程序开始绘制被指定的资讯。当您按下新增按钮时,新增计数器对话方块并不会被关闭,所以您可以容易地新增多个计数器至图表中。记住当您在新增计数器资讯至图表中时,您可以使用Shift和Ctrl键来选择多个实例和计数器。将被绘制在图表中的线段号码即是产生计数器号码时的实例号码。一旦您完成了新增计数器的动作后,请按下关闭按钮。
顺便一提,您将会注意到有一些多实例物件支援一个称为 _Total的虚拟实例。此虚拟实例实际上并不是一个物件的实例,然而它允许您方便地察看物件的所有实例计数器的总数。例如,选择Process物件之Page Faults/sec计数器的 _Total实例使图表显示所有处理程序的Page Faults/sec内容。
为一些计数器显示总数并没有任何意义。例如,如果您要为所有的处理程序实例绘制处理程序识别码的内容,您可以看到这个计数器仅展示一个为0的值,这是从不改变的。