性能瓶颈就是制约系统性能的最主要因素,性能瓶颈定位指的是为了找出制约(系统、路径等)性能的最主要的因素而展开的分析、设计、测试、比较、调优等工作。
本文所述的性能瓶颈定位方法适用于使用三层架构开发的B/S架构系统的性能测试。根据影响范围的不同和触发时间的不同,我们可以将性能瓶颈分为三类:系统类、事件类和路径类。系统类的瓶颈一般表现在由于硬件、系统配置参数引起的一系列性能问题;事件类瓶颈为通过某些性能指标的表象分析出的系统存在的性能问题;而路径类则是由于程序本身的问题引起的性能问题,比如程序模块调用错误引起的 “http500”的错误,它需要程序员遍历程序路径定位性能问题所在。
本文介绍的性能瓶颈定位方法采用循序渐进的方式逐步深入剖析以发现性能问题所在,具体来说它可以分为三个阶段:性能前期准备分析阶段、性能执行快速定位阶段、性能深入分析常规定位阶段。下面就结合图1对我们的流程的各个阶段需要做的情况和顺序方式进行一个简要的说明。
1.性能前期准备分析阶段
如图1所示,前两个模块描述的即为性能前期准备分析阶段,该阶段的重点在于“性能测试关键参数配置指导手册”。总结该指导手册的目的在于整理出一套对系统性能有影响的参数设置情况,使测试人员在性能测试正式执行之前,通过比对参数参考值和实际值,提早发现由于系统参数引起的性能问题,及早规避由于系统参数带来的性能影响,为后面的性能测试工作的开展奠定基础。
例如:某系统在进行并发性能测试过程中,发现系统运行一段时间后就会产生大量失败事物。
问题原因分析:经分析该系统采用的中间件为WebSphere,该中间件有一个控制内存中保留的最大会话数的参数,其默认值为1000,在实际配置时需要根据系统的硬件配置进行适当的调整,一般建议设置为3000,该系统出现大量失败事物就是此参数的原因引起的,在修改了该参数后,出现的性能问题得到解决。可以看到在测试开始前就知晓这个参数并进行了设置就能提前规避一些类似的性能问题出现。
图 1:性能瓶颈定位方法流程图
2.性能执行快速定位阶段
快速瓶颈定位方法,实质也是通过常规的定位方法总结出来的,由于这些性能问题较常见,且具有一定的规律性,因此可以通过一些指标进行简单的判定,就能迅速定位性能问题所在。
快速瓶颈定位可按照如下的过程来执行:
通过性能测试工具(LoadRunner、Jmeter等)、各种监控工具获取系统的主要性能指标。
收集获取的各项性能指标,参照快速定位方法,查看是否有符合的现象产生,定位系统性能瓶颈。
系统性能指标体系没有符合的内容可供参考,查看归纳总结的快速瓶颈定位方法。
其整个过程方法参见图2所示。
图 2:快速瓶颈定位方法
快速瓶颈定位主要还是依赖于平时对常规性能问题的积累,它可以将平时遇见的各种系统性能问题,通过一些系统性能指标表示出来,为性能测试人员提供一种快捷查找问题所在的方式。
例如:某个系统经过多轮的测试,发现系统响应时间和TPS出现波浪分布的现象,特别是在系统应用重新部署以后。
问题原因分析:当系统响应时间和TPS出现时好时坏的情形时,一般都可能是应用自身引起的,本性能问题经定位发现是由于在每次部署程序后,开发人员修改了系统日志的记录级别所致,在修改了系统的日志记录级别为error级别后,系统性能保持稳定。
通过该例子可以看到,一些平时经常遇见的性能问题,我们可以总结出来形成一个知识库,这样下一个测试人员在遇见同样表现的性能问题时就能够快速的定位问题所在,从而快速的解决相关性能问题。
3.性能深入分析常规定位阶段
系统性能瓶颈普遍表象为响应时间长或者占用系统资源大,因此,单纯从某些性能指标往往难以判定系统到底在哪个层面出现了问题。通过对性能测试工作的不断积累、提炼,本文总结了一个非常有用的规律:在常规软件性能测试中,可遵从“二八原则”,即70-80%的性能问题与应用程序相关,70-80%的应用程序问题与SQL语句相关,70-80%的SQL语句问题与索引、存储过程、关联查询、临时表等有关。因此,在常规瓶颈定位方法中,性能测试人员可以从SQL语句的优化进行着手,然后辅助其他方法逐步定位其它的性能瓶颈。
在进行常规瓶颈定位方法时,我们应该按照如下的步骤来进行问题的定位。
1)首先还是基于性能测试工具和监控工具,获取到系统的相关性能测试结果和各种性能指标。
2)通过Proactive DBA等数据库分析工具抓取长事务SQL语句(一般认为1秒以上的SQL语句都需要关注),进行SQL语句分析法,在下面我们将具体介绍。
3)SQL语句分析法不能解决问题,结合获取的性能结果和性能指标,查看系统性能指标体系,分析性能问题所在。
4)结合系统性能指标体系,采用数据库SQl语句分析法、内存分析法、CPU分析法、磁盘I/O分析法、应用程序分析法等进行深入分析性能问题。
5)通过分析方法给出优化建议,完成瓶颈定位。
图 3:常规瓶颈定位方法
图3所示说明了进行瓶颈定位需要实现的步骤和流程,通过经验总结我们知道一般性能问题80%都是由于SQL引起,因此在进行性能问题定位时,可以先从SQL语句的分析着手,一般能够解决80%的性能问题,如若无法解决再使用内存分析法、CPU分析法、磁盘I/O分析法、应用程序分析法等方法对系统进行深入分析,通过这些方法定能对系统的性能问题进行分析定位。
例如,内存泄露(比如:在长时间运行下,内存没有正常释放,引起宕机等)。
定位性能问题方式:利用性能监控工具。比如:JAVA开发B/S结构的项目,可以通过JDK自带的Jconsole,或者JProfiler,来监控服务器性能,Jconsole可以远程监控服务器的CPU,内存,线程等状态,并绘制变化曲线图。利用Spotlight可以监控数据库使用情况。性能测试人员需要关注的性能点有:CPU负载,内存使用率,网络I/O等。
对于上面出现的性能问题,其本身是比较复杂的,不能通过前面的经验一蹴而就的发现其根源所在,必须一步一步的通过我们的工具去剖析程序,去分析,才能够准确的去发现问题的所在。
作者:张鸿