一、 简述
可以用于监视CPU使用率、内存使用率、硬盘读写速度、网络速度等。
Perfmon提供了图表化的系统性能实时监视器、性能日志和警报管理,系统的性能日志可定义为二进制文件、文本文件、SQLSERVER表记录等方式,可以很方便地使用第三方工具进行性能分析。
perfmon.exe 文件位于C:\Windows\System32目录下。 使用方法:
1)开始 - 运行,输入 perfmon 后回车,即可打开perfmon.exe。
2)在 perfmon.exe 的左窗格中,单击“系统监视器”(如果未选中)。
3)在右窗格中[单击右键,然后单击“添加计数器”。
4)在“性能对象”列]表中,选择要在 PerfMon.exe 中显示其图形的计数器类别,单击“添加”。
二、常用的性能指标
系统的整体性能由许多因素决定,例如CPU利用率、CPU队列长度、磁盘空间和I/O、内存使用情况、网络流量等等。对于实时性要求较高的系统而言,对系统关键性指标的有效监控和管理是保证系统高可用性的重要手段,因此,务必制定出明确的系统性能策略规划,并对这些性能指标进行有效的实时监控。当关键性能指标严重偏离或者系统发生故障时,应该采取有效手段来准确定位问题引发的原因,并通过调优系统配置或改进应用程序等手段来有效提高系统的可用性。
(一)Perfmon的监控对象
Perfmon提供了比较全面的系统性能指标,并且能够根据性能管理的要求订制日志内容、制定关键指标偏离时的警报措施。《表一》列出了Perfmon可以监控的性能对象,每一个性能对象项下包含多个性能指标计数器。
表一:性能对象描述 |
|
性能对象 |
提供的信息 |
Browser |
Browser performance object 由衡量通知、枚举和其他浏览器传输率的计数器组成 |
Cache |
Cache performance object 包括监督文件系统缓存(物理内存上尽可能长时间的存储最近使用过的数据以便访问该数据时不需再从磁盘上读取的那一部分内存。)的计数器。因为应用程序只使用缓存,因此该缓存可作为应用程序 I/O 操作的指示器。当有足够内存时,缓存可增大,但当内存不足时,缓存会变得太小而无法使用。 |
Distributed Transaction Coordinator |
Microsoft Distributed Transaction Coordinator 性能计数器 |
ICMP |
ICMP performance object 包括衡量用 ICMP 协议发送和接收消息的速度的计数器。它还包括监督 ICMP 协议错误的计数器。 |
IP |
IP performance object 包括衡量使用 IP 协议发送和接收的 IP 数据报速度的计数器。它还包含监督 IP 协议错误计数器。 |
Job object |
由每个活动命名的作业对象收集的帐户和处理器使用数据的报告。 |
Job object Detail |
Job object Detail 显示有关作业对象中的活动处理的详细的操作信息。 |
Logical Disk |
Logical Disk performance object 包含监视一个硬盘或固定磁盘驱动器的逻辑分区的计数器。Performance Monitor 用逻辑磁盘的驱动器号(如: C)来识别逻辑磁盘。 |
Memory |
Memory performance object 由描述计算机上的物理和虚拟内存行为的计数器组成。物理内存指计算机上的随机存取存储器的数量。虚拟内存由物理内存和磁盘上的空间组成。许多内存计数器监视页面调度(指磁盘与物理内存之的代码和数据页的移动)。过多的页面调度(内存不足的一种表现)可引起拖延,会影响整个系统处理效率。 |
NBT Connection |
NBT Connection performance object 包括衡量用 NBT 连接在一台本地计算机和一台远程计算机之间发送和接收字节的速率的计数器。该连接用远程计算机的名称来识别。 |
Network Interface |
Network Interface performance object 包括衡量通过一个 TCP/IP 网络连接发送和接收字节和数据包的速率的计数器。它包括监督连接错误的计数器。 |
Objects |
Object performance object 包含在系统中监督逻辑对象的计数器,如:处理、线程、多用户终端执行程序和信号量。这个信息可以用于检测计算机资源的不必要的消耗。每个对象需要内存以存储有关对象的基本信息。 |
Paging File |
Paging File performance object 包括监督在计算机上的分页文件的计数器。分页文件指为备份计算机上已用物理内存而保留的磁盘空间。 |
Physical Disk |
Physical Disk performance object 包含监视计算机上的硬盘或固定磁盘驱动器的计数器。磁盘用于存储文件、程序及分页数据并且通过读取检索这些项目并通过记录写入对其进行更改。物理磁盘计数器的值为逻辑磁盘(由磁盘分成)值的总和。 |
Print Queue |
显示一个打印列队的操作统计。 |
Process |
Process performance object 包含监视运行中应用程序和系统处理的计数器。所有在一个处理中的线程均共享同一个地址空间并可以访问同样的数据。 |
Processor |
Processor performance object 包含衡量处理器活动方面的计数器。处理器是计算机进行算数和逻辑计算、在附属件起始操作及运行处理线程的部分。一台计算机可以有多台处理器。处理器对象将每台处理器作为对象的范例。 |
Processor performance |
处理器信息 |
PSched Pipe |
数据包计划程序中的管道统计数 |
RAS Port |
RAS Port performance object 包括监督计算机上的 RAS 设备的每个远程访问服务端口的计数器。 |
RAS Total |
RAS Total performance object 包含将计算机上的远程访问服务(RAS)设备的所有端口的值相加的计数器。 |
Redirector |
Redirector performance object 包括在本地计算机上监督网络连接的计数器。 |
|
|
RSVP |
RSVP 服务性能计数器。 |
System |
System performance object 包含应用于计算机上不止一个组件处理器范例的计数器。 |
TCP |
TCP performance object 包含衡量使用 TCP 协议发送和接收 TCP Segment 速率的计数器变量。它包含监督在每个 TCP 连接状态下的 TCP 连接数目的计数器变量。 |
Telephony |
电话服务系统 |
Terminal Services |
终端服务信息。 |
Terminal Services Session |
每次终端服务会话资源监督。 |
Thread |
Thread performance object 包括衡量线程行为方面的计数器。一个线程是在一台处理器上执行指令的基本对象。所有运行的处理至少有一个线程。 |
UDP |
UDP performance object 包含衡量使用 UDP 协议发送和接收 UDP 数据报的速率的计数器。它包括监督 UDP 协议错误的计数器。 |
WMI Objects |
WMI 适配器返回的 WMI 高性能提供程序 |
(二)常用的Perfmon监控对象与指标
以上列出的性能对象总共有上百个性能指标,我们关注一个系统的性能时,不可能关注这么多指标,有些对象对实际的应用系统影响并不大。但对一个Windows操作系统来说,CPU、Memmory、Disk和Network等关键对象是性能监控中必不可少的项。《表二》列举了最常用的性能对象的重要指标。
表二:常用的性能对象与指标 |
||
性能对象 |
计数器 |
提供的信息 |
Processor |
% Idle Time |
% Idle Time 是处理器在采样期间空闲的时间的百分比 |
Processor |
% Processor Time |
% Processor Time 指处理器用来执行非闲置线程时间的百分比。计算方法是,测量范例间隔内非闲置线程活动的时间,用范例间隔减去该值。这个计数器是处理器活动的主要说明器,显示在范例间隔时所观察的繁忙时间平均百分比。 |
Processor |
% User Time |
% User Time 指处理器处于用户模式的时间百分比。用户模式是为应用程序、环境分系统和整数分系统设计的有限处理模式。 |
Memory |
Available Bytes |
Available Bytes显示出当前空闲的物理内存总量。当这个数值变小时,Windows开始频繁地调用磁盘页面文件。如果这个数值很小,例如小于5 MB,系统会将大部分时间消耗在操作页面文件上。 |
Memory |
% Committed Bytes in Use |
% Committed Bytes In Use 是 Memory: Committed Bytes 与Memory: Commit Limit之间的比值。(Committed memory指如果需要写入磁盘时已在分页文件中保留空间的处于使用中的物理内存。Commit Limit是由分页文件的大小而决定的。如果扩大了分页文件,该比例就会减小)。这个计数器只显示当前百分比;而不是一个平均值。 |
Memory |
Page Faults/sec |
Page Faults/sec是指处理器处理错误页的综合速率。用错误页数/秒来计算。当处理器请求一个不在其工作集(在物理内存中的空间)内的代码或数据时出现的页错误。这个计数器包括硬错误(那些需要磁盘访问的)和软错误(在物理内存的其它地方找到的错误页)。许多处理器可以在有大量软错误的情况下继续操作。但是,硬错误可以导致明显的拖延。这个计数器显示用上两个实例中观察到的值之间的差除以实例间隔的持续时间所得的值。 |
Network Interface |
Bytes Total/sec |
Bytes Total/sec是发送和接收字节的速率,包括帧字符在内。 |
Network Interface |
Packets/sec |
Packets/sec为发送和接收数据包的速率。 |
Physical Disk |
% Busy Time |
% Busy Time指磁盘驱动器忙于为读或写入请求提供服务所用的时间的百分比。 |
Physical Disk |
Avg. Disk Queue Length |
Avg. Disk Queue Length 指读取和写入请求(为所选磁盘在实例间隔中列队的)的平均数。 |
Physical Disk |
Current Disk Queue Length |
Current Disk Queue Length指在收集操作数据时在磁盘上未完成的请求的数目。它包括在快照内存时正在为其提供服务中的请求。这是一个即时长度而非一定间隔时间的平均值。多主轴磁盘设备可以一次有多个请求操作,但是其它同时发生的请求为等候服务。这个计数器可能会反映一个暂时的高或低的列队长度,但是如果在磁盘驱动器存在持续负载,可能值会总是很高。请求等待时间与这个列队的长度减去磁盘上的主轴成正比。这个差值应小于2才能保持良好的性能。 |
Logical Disk |
% Free Space |
% Free Space 是所选定的逻辑磁盘驱动器上总的可用空闲空间的百分比。 |
Logical Disk |
Free Megabytes |
可用的 MB 显示磁盘驱动器上尚未分配的空间。 |
(三)Perfmon对进程的监控指标
一般说来,服务器上都布署了一个或多个应用程序,这些应用程序在运行期间经常体现为若干个应用进程。为了便于监控应用程序的运行情况,在程序设计过程中一般都会同时布署应用系统的监控程序。Perfmon也设置了进程监控常用指标,这些指标比较直观地体现了进程的运行状况,是进行应用系统监控或应用系统跟踪调优的依据。《表三》列出了进程监控的主要指标。
表三:Process对象的主要指标 |
||
性能对象 |
计数器 |
提供的信息 |
Process |
% Privileged Time |
% Privileged Time 是在特权模式下处理线程执行代码所花时间的百分比。当调用 Windows 系统服务时,此服务经常在特权模式运行,以便获取对系统专有数据的访问。在用户模式执行的线程无法访问这些数据。对系统的调用可以是直接的(explicit)或间接的(implicit),例如页面错误或间隔。 |
Process |
% Processor Time |
% Processor Time 是所有进程线程使用处理器执行指令所花的时间百分比。指令是计算机执行的基础单位。线程是执行指令的对象,进程是程序运行时创建的对象。此计数包括处理某些硬件间隔和陷阱条件所执行的代码。 |
Process |
% User Time |
% User Time 指处理线程用于执行使用用户模式的代码的时间的百分比。应用程序、环境分系统和集合分系统是以用户模式执行的。Windows 的可执行程序、内核和设备驱动程序不会被以用户模式执行的代码损坏。 |
Process |
Creating Process ID value |
Creating Process ID value 指创建该进程的父进程号。 |
Process |
Elapsed Time |
该进程运行的总时间(用秒计算)。 |
Process |
Handle Count |
由这个处理现在打开的句柄总数。这个数字等于这个处理中每个线程当前打开的句柄的总数。 |
Process |
ID Process |
ID Process 指这个处理的特别的识别符。ID Process 号可重复使用,所以这些 ID Process 号只能在一个处理的寿命期内识别那个处理。 |
Process |
IO Data Bytes/sec |
处理从 I/O 操作读取/写入字节的速度。这个计数器为所有由本处理产生的包括文件、网络和设备 I/O 的活动计数。 |
Process |
IO Data Operations/sec |
本处理进行读取/写入 I/O 操作的速率。这个计数器为所有由本处理产生的包括文件、网络和设备 I/O 的活动计数。 |
Process |
IO Other Bytes/sec |
处理给不包括数据的 I/O 操作(如控制操作)字节的速率。这个计数器为所有由本处理产生的包括文件、网络和设备 I/O 的活动计数。 |
Process |
IO Other Operations/sec |
本处理进行非读取/写入 I/O 操作的速率。例如,控制性能。这个计数器为所有由本处理产生的包括文件、网络和设备 I/O 的活动计数。 |
Process |
IO Read Bytes/sec |
处理从 I/O 操作读取字节的速度。这个计数器为所有由本处理产生的包括文件、网络和设备 I/O 的活动计数。 |
Process |
IO Read Operations/sec |
本处理进行读取 I/O 操作的速率。这个计数器为所有由本处理产生的包括文件、网络和设备 I/O 的活动计数。 |
Process |
IO Write Bytes/sec |
处理从 I/O 操作写入字节的速度。这个计数器为所有由本处理产生的包括文件、网络和设备。 |
Process |
IO Write Operations/sec |
本处理进行写入 I/O 操作的速率。这个计数器为所有由本处理产生的包括文件、网络和设备 I/O 的活动计数。 |
Process |
Page Faults/sec |
Page Faults/sec 指在这个进程中执行线程造成的页面错误出现的速度。当线程引用了不在主内存工作集中的虚拟内存页即会出现 Page Fault。如果它在备用表中(即已经在主内存中)或另一个共享页的处理正在使用它,就会引起无法从磁盘中获取页。 |
Process |
Page File Bytes |
Page File Bytes 指这个处理在 Paging file 中使用的最大字节数。Paging File 用于存储不包含在其他文件中的由处理使用的内存页。Paging File 由所有处理共享,并且 Paging File 空间不足会防止其他处理分配内存。 |
Process |
Page File Bytes Peak |
Page File Bytes Peak 指这个处理在 Paging files 中使用的最大数量的字节。 |
Process |
Pool Nonpaged Bytes |
Pool Nonpaged Bytes 指在非分页池中的字节数,非分页池是指系统内存(操作系统使用的物理内存)中可供对象(指那些在不处于使用时不可以写入磁盘上而且只要分派过就必须保留在物理内存中的对象)使用的一个区域。这个计数器仅显示上一次观察的值;而不是一个平均值。 |
Process |
Pool Paged Bytes |
Pool Paged Bytes 指在分页池中的字节数,分页池是系统内存(操作系统使用的物理内存)中可供对象(在不处于使用时可以写入磁盘的)使用的一个区域。这个计数器仅显示上一次观察的值;而不是一个平均值。 |
Process |
Priority Base |
这次处理的当前基本优先权。在一个处理中的线程可以根据处理的基本优先权提高或降低自己的基本优先权。 |
Process |
Private Bytes |
Private Bytes 指这个处理不能与其他处理共享的、已分配的当前字节数。 |
Process |
Thread Count |
在这次处理中正在活动的线程数目。指令是在一台处理器中基本的执行单位,线程是指执行指令的对象。每个运行处理至少有一个线程。 |
Process |
Virtual Bytes |
Virtual Bytes 指处理使用的虚拟地址空间的以字节数显示的当前大小。使用虚拟地址空间不一定是指对磁盘或主内存页的相应的使用。虚拟空间是有限的,可能会限制处理加载数据库的能力。 |
Process |
Virtual Bytes Peak |
Virtual Bytes Peak 指在任何时间内该处理使用的虚拟地址空间字节的最大数。 |
Process |
Working Set |
Working Set 指这个处理的 Working Set 中的当前字节数。Working Set 是在处理中被线程最近触到的那个内存页集。如果计算机上的可用内存处于阈值以上,即使页不在使用中,也会留在一个处理的 Working Set中。当可用内存降到阈值以下,将从 Working Set 中删除页。如果需要页时,它会在离开主内存前软故障返回到 Working Set 中。 |
Process |
Working Set Peak |
Working Set Peak 指在任何时间这个在处理的 Working Set 的最大字节数。 |
二、Perfmon功能之一——性能监视器
在Windows中,性能监视器以一个管理控制台(MMC)单元的形式实现。在windows的开始->运行框中输入perfmon.msc启动Windows的性能监视器,可以看到类似图一的界面。 性能监视器主要用来对指定的系统性能指标进行实时监控,但这些性能的指标记录不能被保存。如果要保存这些性能日志,可以用后面介绍的“计数器日志”功能。性能监视器的另外一个功能是对计数器日志生成的日志记录进行非实时的图表化展现。在性能监视器中楞以通过“查看当前活动”或“当看日志数据”功能项来指定监控的性能指标项目。一般说来,由于性能监视器的显示窗口大小有限,不宜指定太多的实时监控项目,否则窗口中的显示很难突出需要重点监控的项目。我们可以根据不同的监控目标制订不同的实时监控方案,每一个方案均可以保存为一个MSManagement Console(msc)文件。
三、Perfmon功能之二——计数器日志
前面介绍了系统监视器的功能时提到,系统监视器主要用于重要性能指标的实时监控,它不能保存被监控的性能指标历史数据。如果需要持续对系统的性能指标采样,就必须用到Peofmon的计数器日志的功能。计数器日志在日志文件中记录指定的系统性能数据,这些日志数据可以用系统监视器查看或用其他工具处理,这对于分析系统某一段时间内的运行状况或者是交由第三方性能管理工具来进行性能管理十分有用。
为了说明如何使用计数器日志,我们要新建一个日志会话。扩展控制台中的“性能日志和警报”节点下可以看到“计数器日志”分节点,右击“计数器日志”分节点,选择“新建日志设置”,指定日志设置的名称,点击“确定”,出现图二的对话框,在这里设定要在日志中记录的计数器(即需要记录的性能指标)。点击“添加对象”按钮,将某个监视对象的所有计数器加入日志记录,或者点击“添加计数器”按钮加入单个计数器。日志文件的默认保存路径是C:\perflogs目录,在设置时可以根据需要在“日志文件”项下修改。日志文件保存的格式可以根据需要设定成文本文件、二进制文件、SQL数据库记录。在“计划”项下,可以设置性能日志的启动和关闭时间计划,也可以设置日志关闭后的指定动作。我们可以根据不同的监控需求制订不同的性能日志方案,每一个方案均可以保存为一个HTML文件。
三、Perfmon功能之三——跟踪日志
Perfmon的跟踪日志功能可以提供对某些重要系统事件的跟踪,也可以指定对特定应用程序的跟踪。跟踪日志以二进制文件保存(默认扩展名为.etl),可以用tracerpt对日志进行分析,并生成CSV格式的dump文件。该功能目前没有提供直观的配置手段来订制对特定应用程序的跟踪,必须通过编辑系统的注册表来实现。这一功能主要应用在程序调试、故障分析过程中。图三是订制跟踪日志的对话框,在其“日志文件”、“计划”项下可以设置日志文件的存放路径、文件大小限制、日志启停计划等项目。
四、Perfmon功能之四——警报
Perfmon的警报功能是指当某个计数器的性能数据达到指定的值时,执行一定的动作,例如发送Email、用NetSend命令发送消息或者运行指定的程序。也可以指定当警报发生时将警报当作系统的事件记录在系统事件记录里,这样可以很方便地用事件查看器来调阅警报的内容。警报的报警指标设置与性能计数器的指标相同,针对不同的应用,我们可以制订不同的警报策略。图四示例的是当CPU的IdleTime低于70%时触发一个警报的订制对话框。在“操作”和|“计划”项下,可以配置警报发生时的指定操作、警报设置的启停动作等。
五、Perfmon布署方法
对Windows系统的性能监控需要有较高的用户权限,Perfmon默认的可执行权限是管理员用户,从系统安全性考虑,不建议将管理员作为日常监控的用户。Windows2000 Server提供了性能管理用户组,在实施系统的性能监控时,可建立一个该组的普通用户。
Windows提供了Perfmon的两种布署方式:本地监控和远程监控。本地监控产生的日志文件默认保存路径是C:\perflogs目录,在设置时可以根据需要在“日志文件”项下修改。本地监控产生的日志文件除了可以在本机用性能监视器进行观测外,还可以外传到第三方监测分析平台上。远挰监控可以实现对局域网内多台监控目标进行集中采样监控,其前提是监控主机与目标主机之间必须建立信任关系,并且打开相应的远程访问控制。在访问控制比较严格的环境下,远程监控难以布署。布署Permon时还应该考虑志文件的存放问题,如果要长时间收集性能数据,最好调整一下采样间隔时间,如果采样间隔时间设置得太小,日志文件会快速增。
Perfmon的管理也有两种方法:控制台管理和命令行方式管理。可以通过运行Perfmon.msc调出性能管理的控制台,并根据监控策略制订、管理控制台。Perfmon的另一种管理方式是命令行方式,Windows提供了一个专门用于管理性能监控的命令――Logman,它不仅能够在命令行上启动和停止日志会话,而且能够从命令行创建新的日志会话。有关Logman命令的用法可参阅Logman命令指南。
还有另外一个命令能方便地采集到系统性能数据,但仅仅是获取数据,并不产生警报和日志记录的动作。这种方式在使用第三方软件来监控Windows系统的性能时经常用到。Windows提供了一个显示当前性能指标的命令----Typeperf。用Typeperf可以得到前面提到的Perfmon的所有指标值。Typeperf的标准输出是屏幕显示,我们可以通过输出重定义将结果输出到文本文件当中,并将结果文件传给第三方系统。这种应用方式下,Typeperf的动作由第三方软件根据需要来管理,也可以通过订制计划任务来定时启动。有关Typeperf命令的用法可参阅Typeperf命令指南。
The short answer to this question is that none of these values are a reliable indicator of how much memory an executable is actually using, and none of them are really appropriate for debugging a memory leak.
Private Bytes refer to the amount of memory that the process executable has asked for - not necessarily the amount it is actually using. They are "private" because they (usually) exclude memory-mapped files (i.e. shared DLLs). But - here's the catch - they don't necessarily exclude memory allocated by those files. There is no way to tell whether a change in private bytes was due to the executable itself, or due to a linked library. Private bytes are also not exclusively physical memory; they can be paged to disk or in the standby page list (i.e. no longer in use, but not paged yet either).
Working Set refers to the total physical memory (RAM) used by the process. However, unlike private bytes, this also includes memory-mapped files and various other resources, so it's an even less accurate measurement than the private bytes. This is the same value that gets reported in Task Manager's "Mem Usage" and has been the source of endless amounts of confusion in recent years. Memory in the Working Set is "physical" in the sense that it can be addressed without a page fault; however, the standby page list is also still physically in memory but not reported in the Working Set, and this is why you might see the "Mem Usage" suddenly drop when you minimize an application.
Virtual Bytes are the total virtual address space occupied by the entire process. This is like the working set, in the sense that it includes memory-mapped files (shared DLLs), but it also includes data in the standby list and data that has already been paged out and is sitting in a pagefile on disk somewhere. The total virtual bytes used by every process on a system under heavy load will add up to significantly more memory than the machine actually has.
So the relationships are:
There's another problem here; just as shared libraries can allocate memory inside your application module, leading to potential false positives reported in your app's Private Bytes, your application may also end up allocating memory inside the shared modules, leading to false negatives. That means it's actually possible for your application to have a memory leak that never manifests itself in the Private Bytes at all. Unlikely, but possible.
Private Bytes are a reasonable approximation of the amount of memory your executable is using and can be used to help narrow down a list of potential candidates for a memory leak; if you see the number growing and growing constantly and endlessly, you would want to check that process for a leak. This cannot, however, prove that there is or is not a leak.
One of the most effective tools for detecting/correcting memory leaks in Windows is actually Visual Studio(link goes to page on using VS for memory leaks, not the product page). Rational Purify is another possibility. Microsoft also has a more general best practices document on this subject. There are more tools listed in this previous question.
I hope this clears a few things up! Tracking down memory leaks is one of the most difficult things to do in debugging. Good luck.