⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 7.1 效能监视.htm

📁 Windows2000后台服务程序开发手册
💻 HTM
📖 第 1 页 / 共 4 页
字号:
            <P><BR style="LINE-HEIGHT: 25px"> </P>
            <CENTER style="LINE-HEIGHT: 25px">
            <P><INPUT id=4 style="LINE-HEIGHT: 25px" type=image height=115 
            width=398 src="7.1 效能监视.files/7-4.gif" border=0 
            &#111nclick="imgclick"></P></CENTER>
            <CENTER style="LINE-HEIGHT: 25px">
            <TABLE style="LINE-HEIGHT: 25px" border=0>
              <TBODY style="LINE-HEIGHT: 25px">
              <TR style="LINE-HEIGHT: 25px">
                <TD style="LINE-HEIGHT: 25px" align=middle><FONT 
                  style="LINE-HEIGHT: 25px" face=arial color=#000000 
                  size=2><FONT style="LINE-HEIGHT: 25px" face=arial 
                  color=#3e80d7 size=2><B 
                  style="LINE-HEIGHT: 25px">&nbsp;图7-4&nbsp;</B></FONT>解说文字视窗,提供一个关于效能计数器的附加资讯</FONT></TD></TR></TBODY></TABLE></CENTER>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>Windows实际上允许解释性的文字与一个除了它本身的计数器外的效能物件。然而,目前系统监控程序并没有提供任何显示物件说明文字的方法。我希望Microsoft将来可以加强这方面的控制。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>在选择了一个电脑、物件、计数器以及实例(如果可用的话)后,按下新增按钮以使系统监控程序开始绘制被指定的资讯。当您按下新增按钮时,新增计数器对话方块并不会被关闭,所以您可以容易地新增多个计数器至图表中。记住当您在新增计数器资讯至图表中时,您可以使用Shift和Ctrl键来选择多个实例和计数器。将被绘制在图表中的线段号码即是产生计数器号码时的实例号码。一旦您完成了新增计数器的动作后,请按下关闭按钮。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>顺便一提,您将会注意到有一些多实例物件支援一个称为 
            _Total的虚拟实例。此虚拟实例实际上并不是一个物件的实例,然而它允许您方便地察看物件的所有实例计数器的总数。例如,选择Process物件之Page 
            Faults/sec计数器的 _Total实例使图表显示所有处理程序的Page Faults/sec内容。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>为一些计数器显示总数并没有任何意义。例如,如果您要为所有的处理程序实例绘制处理程序识别码的内容,您可以看到这个计数器仅展示一个为0的值,这是从不改变的。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e72d7 
            size=4><B style="LINE-HEIGHT: 25px">从设计者的观点看效能监视<BR 
            style="LINE-HEIGHT: 25px"> </B></FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>考虑将效能计数器资讯加到您的应用程序和服务器的原因有很多种。首要的是,就管理者而言,您想要容易的使用它并帮助办公室的人们检查电脑系统的健康情形。另外,许多应用程序的终端使用者不想陷入对他们毫无意义的统计资讯泥沼。权宜之计是使用效能计数器来显示资讯;一个让使用资讯做某些事的人可以容易的获得并存取它的方法。同样地,Windows跨越网路而使效能资讯为可用的。如前面章节中所提,一个使用系统监控程序的人可以选择要从哪台电脑收集资讯。使用Windows内建的效能监视显示您的应用程序效能资讯,并使您不需做任何附加的工作即可远端地存取它。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>一个非常重要的议题是让许多人取消对执行效能的效能监视功能,这有些讽刺。效能监视并非不受控制的,它存在您应用程序内部的某处,您需要配置一个内存区块以储存现行的计数器资料,而且您的程序代码必须周性的更新这些值。更新这些值表示您的程序代码必须够大而且将会缓慢地执行,有些事我们总是试着去避免。然而,假如效能监视大大地受系统影响,则不会有人使用它,而且当Microsoft在设计效能监视到系统时,必然有考虑它。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>当在为您的应用程序设计效能资讯时,必须小心地决定您想要监视的内容。例如,如果您有一个固定的计算回圈,当执行至回圈内时,您应该避免更新计数器的内容。从另一方面来说,您可能会编写一个服务器端的Client/Server应用程序。在这种情况下,您可能想要拥有一个追踪多少客户端已经连接的效能计数器、多少客户端目前已连接、每个客户端接收到的位元组数、每个客户端传送的位元组数、您的客户端建立了什么类型的要求等等。事实上,Microsoft 
            Internet Information Services(IIS)持续确切地追踪了此资讯类型。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>效能监视可以成为软件开发者的一个强大工具。我曾使用效能计数器来监控我的应用程序总共配置和释放了多少动态内存。如果忘记释放内存,系统监控程序会总是显示我的内存使用现为增加的情形。开发者和测试者一样可以使用效能计数器来监视任何一个正确运转的应用程序。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>为了说明效能监视,我想展示一个建立股票物件的范例程序。这个物件的每一个内建符号中皆有一个实例,而计数器的内容则为有关股票的资讯—例如,最后的价格、高的价格、低的价格以及价格/利润比率。使用系统监控程序,您可以选择其中您有兴趣的股票和计数器以及在Internet上取得此资讯的应用程序,并使用系统监控程序绘制它的图表。不幸的是,我找不到一个允许我从它的股票行情指示器资讯有效地产生衍生工作的Internet站台。所以,虽然本章展示了一个不同的范例应用程序,股票物件的概念应该可以给您一个继承Windows效能监视之可能性的好想法。</FONT></P></A><A 
            style="LINE-HEIGHT: 25px" name=207002>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e70d7 
            size=5><B style="LINE-HEIGHT: 25px">效能物件及计数器的架构<BR 
            style="LINE-HEIGHT: 25px"> </B></FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>为了显示您自己的效能资讯,您必须修改许多登录的内容。您可以把这些修正视为陷入二个群组的情形。第一组修正告诉系统您存在的计数器;第二组修正告诉系统如何为您的计数器取得效能资讯。如图7-5所示,初始的修正在以下的登录子机码下执行:</FONT></P>
            <DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT 
            style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib</PRE></FONT></DIV></A>
            <P><A style="LINE-HEIGHT: 25px" name=309-1><BR 
            style="LINE-HEIGHT: 25px"> </P>
            <CENTER style="LINE-HEIGHT: 25px">
            <P><INPUT id=5 style="LINE-HEIGHT: 25px" type=image height=238 
            width=680 src="7.1 效能监视.files/7-5.gif" border=0 
            &#111nclick="imgclick"></P></CENTER>
            <CENTER style="LINE-HEIGHT: 25px">
            <TABLE style="LINE-HEIGHT: 25px" border=0>
              <TBODY style="LINE-HEIGHT: 25px">
              <TR style="LINE-HEIGHT: 25px">
                <TD style="LINE-HEIGHT: 25px" align=middle><FONT 
                  style="LINE-HEIGHT: 25px" face=arial color=#000000 
                  size=2>图7-5 表示您已存在之计数器的登录设定</FONT></TD></TR></TBODY></TABLE></CENTER>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>在Perflib子机码下是另一个子机码009,它符合定义在WinNt.h中的LANG_ENGLISH符号。在009子机码下有二个值:Counter和Help。这二个值是REG_MULTI_SZ类型。您可以用Windows中的RegEdt32.exe登录编辑器工具程序来检查或编辑这二个登录值。可惜的是,您不能使用RegEdit.exe工具(也附在Windows中),因为此工具有一个防止显示或编辑超过32 
            KB的内部限制。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>计数器值包含一组定义物件及计数器的字串,以使系统意识到它。以下所列的内容显示了在这个值内的字串之一些范例:</FONT></P>
            <DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT 
            style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">2 <BR>System <BR>4 <BR>Memory <BR>6 <BR>%Processor Time <BR>10 <BR>File Read Operations/sec <BR>12 <BR>File Write Operations/sec <BR>14 <BR>File Control Operations/sec <BR>16 <BR>File Read Bytes/sec <BR>18 <BR>File Write Bytes/sec</PRE></FONT></DIV>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>Help值包含了一组说明效能物件或计数器意义的字串。以下是一个小型的Help值范例:</FONT></P>
            <DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT 
            style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">3 <BR>System效能物件由应用在电脑上超过一个元件处理器的实例所组成。1 <BR>5 <BR>Memory效能物件由在电脑上描述实体与虚拟内存行为的计数器组成。实体内存是电脑中的随机存取记忆 <BR>体总数。虚拟内存则是由实体内存和磁盘的空间组成。多数的内存计数器会监视分页的情形,即是磁盘与 <BR>实体内存间字码及资料页的移动情形。过度的执行分页会产生内存不足的状况,并导致所有的系统处理程序 <BR>产生延迟。 <BR>7 <BR>%Processor Time是指处理器执行非闲置线程的时间百分比。这个计数器被设计成处理器活动的主要指 <BR>示器。其计算方式是,先计算在某个取样区间中,处理器执行闲置处理程序所花费的时间,再用100% 减去 <BR>这个时间(每个处理器都有一个闲置线程,如果没有执行其他线程的话,闲置线程会不停地执行回圈来消 <BR>耗时间)。您可以检视取样区间中工作执行状况的百分比,这个计数器会显示取样区间中执行工作的平均百分 <BR>比。它的计算方式是,监视服务停用时间,然后用100% 减去这个时间值。 <BR>9%Total DPC Time是在取样区间中,处理器花在接收及服务Deferred Procedure Call(DPC)的时 <BR>间百分比(DPC是一种插断,它比一般插断的优先权要低)。它是在电脑中所有处理器的Processor:DPC&nbsp;&nbsp;<BR>Time加总,经由处理器的数字而分开。% DPC Time是 % Privileged Time的组成元件,因为DPC在 <BR>特殊权限模式中执行。它们被分开计算,而且不包含在插断计数器中。这个计数器显示取样区间中的平均忙碌时 <BR>间百分比。 <BR>11 <BR>File Read Operations/sec是指电脑上所有磁盘中文件系统读取要求的结合速率,包括对文件系统快取 <BR>的读取要求。计算方式是计算读取次数。这个计数器会显示最后两次取样观察值的差异,再除以取样区间的时 <BR>间。 <BR>13 <BR>File Write Operations/sec是指电脑上所有磁盘中文件系统写入要求的结合速率,包括对文件系统快 <BR>取的写入要求。计算方式是计算写入次数。这个计数器会显示最后两次取样观察值的差异,再除以取样区间的时 <BR>间。 <BR>15 <BR>File Control Operations/sec是指文件系统其他操作的结合速率(不是读取也不是写入),例如对档 <BR>案系统控制的要求及设备特性或状态资讯的要求。这是System:File Data Operations/sec的反转 <BR>值,而且是操作次数的计数值。这个计数器会显示最后两次取样观察值的差异,再除以取样区间的时间。 <BR>17 <BR>File Read Bytes/sec是指在电脑上所有设备的文件系统读取要求所读取位元组的整体速率,包括对文件 <BR>系统快取的读取。计算方式是计算每秒位元组数目。这个计数器会显示最后两次取样观察值的差异,再除以取样 <BR>区间的时间。 <BR>19 <BR>File Write Bytes/sec是指在电脑上所有设备的文件系统写入要求所写入位元组的整体速率,包括对文件 <BR>系统快取的写入。计算方式是计算每秒位元组数目。这个计数器会显示最后两次取样观察值的差异,再除以取 <BR>样区间的时间。</PRE></FONT></DIV>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>您会注意到这些Counter的字串值是成对的。每一对字串值是由一个偶数和一个短字串组成。Help字串值也是成对的,但是它的数字是奇数。系统使用Counter值来决定哪一个效能物件和计数器在系统上是可用的。Help值则确认每一个物件计数器的说明文字;Help文字的数字值永远是一个大于物件或计数器的数字值。如前所述,系统监控程序目前没有为效能物件显示解说文字的方法。这表示您将不会看见与例如号码3及号码5相关的解说文字。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>为了将您的效能物件及计数器加到系统,您必须将您的物件、计数器及说明字串到这些登录值中。请回头参阅&nbsp;</FONT></A><FONT 
            style="LINE-HEIGHT: 25px" face=arial color=#000000 size=2><A 
            style="LINE-HEIGHT: 25px" 
            href="http://www.acejoy.com/doc/serverside/7.htm#309-1" 
            target=_new>图7-5</A>&nbsp;,您会看见在Perflib子机码下的二个Last Counter和Last 
            Help值。这二个值分别告诉您在Counter和Help中使用的最大数字值。之前在我的登录中,Last 
            Counter的值为2276,任何被加入之新的物件或计数器会从2278开始。同样地,任何被新增的Help文字会从2279开始。Microsoft为系统本身保留了一些数字。Base 
            Index 
            value(1847)指出Microsoft为了系统拥有的物件和计数器所保留的最大值。您加入的物件和计数器必须高于此数字。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>现在我们将注意力转到登录的其他部份。为了显示您的效能物件、实例和计数器,必须建立一个负责回传效能资讯的DLL。一旦该DLL被建立,您必须将对登录建立的一些修改情形告诉系统。然而这些修改会被建立在登录的另外一个部份,如图7-6所示:</FONT></P>
            <DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT 
            style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HWInputMon\Performance</PRE></FONT></DIV>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>这个唯一的子机码的HWInputMon部份确认定我的效能资料。当然,您将会用一个唯一的识别名称来取代您效能资料的部分。</FONT></P>
            <P><BR style="LINE-HEIGHT: 25px"> </P>
            <CENTER style="LINE-HEIGHT: 25px">
            <P><INPUT id=6 style="LINE-HEIGHT: 25px" type=image height=273 
            width=697 src="7.1 效能监视.files/7-6.gif" border=0 
            &#111nclick="imgclick"></P></CENTER>
            <CENTER style="LINE-HEIGHT: 25px">
            <TABLE style="LINE-HEIGHT: 25px" border=0>
              <TBODY style="LINE-HEIGHT: 25px">
              <TR style="LINE-HEIGHT: 25px">
                <TD style="LINE-HEIGHT: 25px" align=middle><FONT 
                  style="LINE-HEIGHT: 25px" face=arial color=#000000 
                  size=2><FONT style="LINE-HEIGHT: 25px" face=arial 
                  color=#3e80d7 size=2><B 
                  style="LINE-HEIGHT: 25px">&nbsp;图7-6&nbsp;</B></FONT>在登录指示系统如何从DLL询问效能资讯的设定</FONT></TD></TR></TBODY></TABLE></CENTER>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>在这个子机码中有许多个资料值。最重要的值、程序库指定了知道如何回传您的效能资讯之DLL的路径名称。此DLL必须汇出叁个函数:一个开启函数、一个收集函数以及一个关闭函数。您可以为这些函数选择任何您想要的名称,但是在登录中这些名称必须被指定为使用Open、Collect和Close值。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>当被要求效能资讯时,系统将会载入您的DLL并立即它的呼叫Open函数。您的Open函数看起来应该像这样:</FONT></P>
            <DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT 
            style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">DWORD __declspec(dllexport)WINAPI Open(PWSTR){&nbsp;&nbsp;<BR> // 注:参数通常会被忽略 <BR> // 初始化DLL <BR> return(ERROR_SUCCESS); <BR>}</PRE></FONT></DIV>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>它给您的DLL一个初始化自己的机会。一旦初始化后,系统会周期性地呼叫您的Collect函数。此函数负责初始化一个包含所有您想回传之效能资讯的内存缓冲区。我将会在稍后的〈收集效能资料〉一节中讨论Collect函数的原型,并提供有关实作的详细内容。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>当系统决定载出您的DLL时,它会呼叫Close函数,并给您执行任何清除所需动作的机会。Close函数看起来应该像这样:</FONT></P>
            <DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT 
            style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">DWORD __declspec(dllexport)WINAPI Close(){ <BR> // 清除DLL <BR> return(ERROR_SUCCESS); <BR>}</PRE></FONT></DIV>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>目前为止所讨论的四个登录值只有一个是系统需要的。然而,对一些附加的登录值来说,它经常是有用的,如图7-6所示。就像之前曾提起的,当您增加新的效能物件和计数器至系统时,您必须附加您的效能物件和计数器字串至登录中。这些新的字串必须是唯一的数字。对您的效能DLL来说,记得哪些物件与计数器号码已经被指定是绝对必要的。最容易储存这个资讯的地方是在Performance登录子机码中。图7-6显示了我因为此原因而在登录中加入的First 
            Counter、Last Counter、First Help以及Last 
            Help值。当我的DLL被载入时,我开启了登录、取出这些值,并且根据我的Collect函数储存它们。因为当系统呼叫Collect函数时,它会传递这些数字以确认哪一些效能资讯应该被回传,所以需要知道您的物件和计数器的数字。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>现在您可能想要知道您的DLL被载入到哪个处理程序中。这里有二种情形,依据您的效能资讯是由本地还是远端要求而定。当被系统监控程序从本地端机器询问效能资讯时,系统会将您的DLL载入经由系统监视器而建立的处理程序之位址空间(请参阅图7-7)。因为DLL正在另一个处理程序的位址空间中执行,所以彻底地测试您的程序代码并确认它是否健全的动作非常重要。如果您的程序代码中包含了任何的无穷回圈、呼叫ExitProcess或等待一些线程同步物件的死结情形,对您的处理程序将有不利的影响。</FONT></P>
            <P><BR style="LINE-HEIGHT: 25px"> </P>
            <CENTER style="LINE-HEIGHT: 25px">
            <P><INPUT id=7 style="LINE-HEIGHT: 25px" type=image height=380 
            width=488 src="7.1 效能监视.files/7-7.gif" border=0 
            &#111nclick="imgclick"></P></CENTER>
            <CENTER style="LINE-HEIGHT: 25px">
            <TABLE style="LINE-HEIGHT: 25px" border=0>
              <TBODY style="LINE-HEIGHT: 25px">
              <TR style="LINE-HEIGHT: 25px">
                <TD style="LINE-HEIGHT: 25px" align=middle><FONT 
                  style="LINE-HEIGHT: 25px" face=arial color=#000000 
                  size=2><FONT style="LINE-HEIGHT: 25px" face=arial 
                  color=#3e80d7 size=2><B 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -