性能篇:分析进程的线程

线程是瓶颈:

  分析在瓶颈时的单个线程或者多个线程,来了解更多关于处理器的消耗情况。无论是单进程还是多进程,监控以下的几个因素,来分析线程是如何导致整个问题的。这几个因素是:

  *每个进程在瓶颈时运行的线程总数

  *一个线程占用的处理器时间

  *正在运行的线程的调度优先级

  *在特权模式下线程使用处理的总时间

  你能用计数器来分析线程的活动情况,和调整线程的调度,来让处在瓶颈的进程获得更多的处理器时间

  除了调整线程调度的优先级外,你不能改变线程的行为,不能改变香港应用程序的程序代码。尽管如此,如果你有应用程序的源代码,你也可以写在一个较低的水平计数器来监视线程的活动。要了解更多信息的话, 可以查看 the Platform Software Development Kit (SDK) link ( http://windows.microsoft.com/windows2000/reskit/webresources).

 上下文切换:

  性能监视器里的每秒钟切换线程上下文次数的计数器(Thread\Context Switches/sec counter),对操作系统如何调度线程方面,提供了另一种视角。当内核在处理器上将运行的线程切成另一个线程时,上下文切换就发生了。上下文切换出现的情况,也可能是一个高优先级的线程出现,抢占了正在运行的线程;也可能是一个运行的线程因为某些原因需要等待(例如IO操作)。当线程从处理器里抢占到时间或者丧失运行时间时,每秒切换线程上下文次数的计数器的值就会增加。

  在上下文切换的过程中,至少有两个线程正在改变他们的线程状态。仔细查看上下文切换的数据,能发现处理器处理器使用线程的模式,而且还能显示一个线程是如何与该进程的其他线程来共用处理器的。

   每秒系统上下文切换次数的计数器(System\Context Switches/sec counter),是反映整个系统的上下文切换次数的,整个值应该接近于或者相同于所有的的每秒钟切换线程上下文次数的计数器(Thread\Context Switches/sec counter)的总和。长时间监测,应该可以帮助你判断这两种计数器的值得变化范围。

  谨慎的分析该数据。线程大量使用处理器时,会降低上下文切换的频率;因为他不允许其他的进程的线程来获取处理器时间。上下文切换频率高的话,意味着处理器是被反复的共享使用的,例如很多线程拥有同样的优先级。通过减少系统的活动的线程的个数,来尽量减少上下文切换的频率,是个好的做法。使用线程池、I/O完成端口、异步IO,能减少活动线程的个数。如果你想要确定你的应用程序是否提供包括限制线程个数的功能,请咨询你的内部开发人员或者应用程序供应商来决定。

  每秒每个处理器切换300次是一个比较正常的数值;每秒切换1000次就很高了。比这个值高的话,可能代表着有问题

图标显示每个线程CPU的利用率:

  观察一个进程的线程占用的处理器时间,会提供关于处理器活动情况的额外的信息。系统监视器提供Thread%Process Time counter来监控一个正在运行的程序里每个线程的处理器的使用情况。如果你的进程是单线程,你就不需要跟踪进程里的线程使用的处理器时间,因为他基本和你记录处理器的时间是相同的。

  下图显示在瓶颈时,所有线程的时间情况。每栏都显示了一个线程使用的处理器时间:

  

  图7.12显示有3个线程在主导处理器的使用,而其他的一些线程只能获得很少的处理器时间。

  如果你的线程活动情况和上图类似,那意味着你系统里的一些应用程序,没有达到你预期的那么有效地使用处理器。观察进程中的线程,以及他们怎么使用处理器;监视上下文切换,监视用户态和内核态CPU的利用率

瓶颈时的单线程和多线程:

  一个进程用多线程和多个进程都是单线程的,或者是多进程多线程,都可能会导致瓶颈。因为这些问题需要的解决方案不同,所以你需要区分它们各自的原因。

  先学习瓶颈时线程的情况,Log处理器、进程、线程对象的计数器。这些能帮助你观察线程的活动情况,帮你分析处理的使用状态看。

****

  当线程正在停止和正在启动时,线程的性能计数器的值是错误的。错误的值有时候会出现大的峰值。要了解更多信息,可以参考“http://technet.microsoft.com/en-us/library/cc938566.aspx”。

  在System Monitor或者计数器的log里;选择线程对象,并查看Instance box里的所有实例。如果有一些线程的ID被列举出来,那么表明它是多线程的。例如下图就是多线程的。

  

  系统监视器里会标识出线程所处的处理器名称和线程数。这些线程在图表中出现的顺序是取决于额你添加它们到图表里的顺序的。在实例框中现实的线程数代表着线程启动的顺序。线程ID是在这个线程消亡前一直有效的。当线程终止时,线程ID会被回收。线程数在运行过程中是可能会改变的,所以最好是监视线程ID。Tlist 会提供线程香港信息,详细的可以取下载对应的支持包

用户模式和特权模式(Privileged Mode)

  你能决定一个进程在用户模式和特权模式下运行时间的百分比。用户模式是应用程序运行的处理方式。特权模式,或者说是内核模式,是允许代码直接访问系统中硬件和内存的处理方式。开发这也许想知道一个进程每种模式下花了多少时间,以及处理器是用哪种方式来工作的。

  IO操作和其他系统服务,都是运行在内核模式下的;用户应用程序是运行在用户模式下的。除非他们是图形密集型或者IO密集型的程序(例如文件打印服务),大多数应用程序是不该在内核模式下有大量工作的。

  性能监视器里有个关于系统、处理器、进程、线程对象的% Privileged Time和 % User Time counters。System Calls/sec也是内核时间占用的一个有用的指标,因为应用程序要求系统进入内核模式下操作。性能监视器会展现用户模式和内核模式花费的时间,如图:

  

  

 参考:http://technet.microsoft.com/en-us/library/cc938616.aspx

posted @ 2013-03-01 17:38  宇月--测试开发梦想家  阅读(883)  评论(0编辑  收藏  举报