性能分析摘要

软件不但要能用而且要好用,性能在能用和好用之间都有不同的表现,当某个功能在某些特定的场景下由于性能极其低下导致软件不可用,或者由于某个性能问题导致用户的感受非常差,以至于用户开始厌恶这个软件,最终导致软件产品的失败。

性能在整个软件产品中貌似一直不被人设计人员所重视(不是全部),在软件设计之初就应该有良好的性能设计,目标系统的某个功能应该在何种场景下达到何种的性能要求,这个是标准。设计人员应该从业务设计的角度来考虑如何优化业务效率,人机工程人员应该从界面上设计如何让用户点击最少的按钮完成一件事情,当然快捷键的设计尤为重要,即使是Web产品也应该考虑这一点。开发人员则应该从算法上考虑如何优化算法,如果提高效率。

本文旨在讨论如何分析可能存在的性能问题,开发人员应该如何提高程序的效率,这是个庞大的话题,正如文章的标题,这只是一个摘要,省略了很多细节,如果您有这方面的经验希望和我交流请留言,谢谢。

首先假设我们现在已经有了一个软件产品,该产品工作的还算不错,但是偶尔会有点慢,当然这个对于我们自己来说可能是可以接受的,但是想象一下对于一个要天天面对这个软件的用户来说,这将是一件非常讨厌的事情。那么我们该如何找到问题并修复它呢?

工欲善其事,必先利其器。其次我们应该知道我们有哪些工具可以使用,这些工具可以运用在开发环境中当然也可以运用在产品环境中。开发人员面临两个场景,第一个是开发环境,第二个是产品环境。开发环境顾名思义是指装有开发系统的,用来开发的环境,该环境一般是指开发人员的机器或者机器组。产品环境为产品最终要运行的环境,这个环境上只有你的产品和需要运行产品的必要软件,这个环境上一般没有开发环境。

1、  Windows 日志

2、  任务管理器

3、  Windows性能监视器

4、  Windbg以及其中的诸多工具集

上面的4个工具是你唾手可得的,只有第三个需要安装,但是安装过程非常简单,而且程序集也非常的小,你可以从微软的网站上很快的下载并且安装,这个工具是免费的。

 

         Windows日志中记录了Windows运行时出现的问题,出现问题的时候你首先应该检查这里是否有你需要的信息。如果你在运行Web程序,那么logfiles()也是必须要了解的日志之一,这个日志记录了所有和IIS往来的记录,这个日志可以通过IIS配置,一般默认的配置即可满足要求。

任务管理器是windows自带的最直接也是最容易的性能监视工具之一,使用任务管理器,你能获得很多关于进程是否健康的信息,其中包括内存使用情况,CPU使用情况,线程数量等等,你应该非常熟练的了解每个列描述的数据含义,哪些数据是正常的哪些是不正常的。

Window性能监视器,这个工具作为一个新手来说可能是难于理解的,但是当你能够熟练的使用这个工具的时候,并且通过它找到问题时,你会发现这个工具相当的牛X,这个工具可以扩展,添加自己的性能监视项。一般情况下我们比较关注的是:进程信息、线程信息、内存信息、CPU信息、IO信息以及IIS的相关信息。如果你不知道这个性能计数器具体是做什么的,那么打开说明看看吧,你会发现其实并不像你想象的那么复杂。

Windbg,哈哈,这个工具可谓非常强大,强大到它几乎可以调试任何windows的程序,托管的、非托管的、有源代码的、没有源代码的。值得说明的是此工具集里面有一个脚本工具叫:Adplus,这个工具可以dump指定线程的内存(当然DUMP内存的方法不止这一种),该工具非常适合分析产品环境下的软件,你可以要求安装一个windbg(几十兆),使用adplusdump不同时刻的内存快照,该快照可以在出现问题前后几分钟,同时你可能需要打开性能监视器,结合快照和性能监视器的值分析问题将非常快捷。

Windbg有一款扩展命令,用于分析托管程序集,叫:SOS,你可以在命令行中装载sos.dll,并通过!Help获得帮助信息,如果你希望知道某个命令的具体用法,则可以使用!help的参数来实现,例如:!help dumpheap,此命令将打印出来dumpheap命令的详细使用说明以及简单的例子。

 

上面这些优秀的工具为我们提供了便利的方法完成问题的诊断,那么在实际的应用中该如何做呢?下面我简单的介绍一下我在实际应用中如何分析问题的一个基本流程,你可以作为参考,我相信有更好的流程,欢迎指出。

假如我们现在观察一个ASP.NET的应用程序,那么首先我会打开任务管理器,看看w3wp.exe(或者是aspnet_wp.exe)是否很忙,也就是CPU是否满负荷(正常应该是波峰波谷交替出现),如果很忙(一直是波峰)那么肯定是有一项工作很忙,那么现在就需要找到是哪个线程很忙,打开性能监视器,选择IIS计数器,看看并发的请求数是多少?多少在队列里,多少在处理,每个请求执行时间大概多长等等,这些数据有助于你分析程序现在是否健康。在可疑点设置快照点(用adplus),此时你应该建立了一个性能日志(在性能监视器中新建Data Collect Data), 快照的时候需要记录大概的时间,好在对应的性能日志中查找对应的性能日志。如果程序很忙,此时的DUMP文件有助于你检查是哪个线程一直在占用CPU,这个可以通过!runaway命令查看。之后可以使用k来检查当前线程的调用栈信息,如果有托管代码,则装载上sos.dll,使用!thread查看托管栈的信息。如果CPU不忙,而是内存的使用量太大,则你首先应该使用!address –summary看看内存主要消耗在哪个区域(类型),asp.net程序一般都在托管堆上,那么你应该非常熟悉托管堆的特性,以及托管堆如何分配,如何释放资源等等,同样你可以使用sos扩展命令来查看托管堆的分配情况,这里有个非常有用的命令:!dumpheap,详细信息看看!help dumpheap,非常详细,再此不废话了,另一个有用的命令是!gcroot,这个命令用来查看某个对象的根,我们知道具有根的对象是不会被垃圾回收的,你要查看的是这些大对象为什么不会被回收,他们为什么和根关联着?还有一些命令如:!do/!objsize/!eeheap等等。

如果你熟悉windbg的元命令,那么这些命令能很好的提高你的诊断效率,他们非常值得你去学习,再此强烈建议读者去学习这些内容,他们是你继续走下去的基石。

 

上文主要分析了Window性能优化中可能使用的一些工具以及笔者的一些小小的经验,这里并不涉及数据库的优化。文中并没有详细的介绍每款工具的使用,这些方法你可以通过这些工具的帮助文件获得。关于这些工具的使用技巧欢迎大家讨论,在学习过程中也欢迎和我保持交流,本人愿意和大家一起进步。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值