影响软件性能的要素有很多,在需求阶段就应该对软件性能进行分析,在设计阶段要充分考虑软件架构设计对性能的影响,在测试阶段要充分验证软件的性能表现是否满足需求。
一、需求阶段的性能分析
从业务角度分析,如果一个系统上线后使用人数比较多,而且后期数据量比较大(如电信、金融证券等对外开放的系统),就有必要做好性能测试,因为这些系统对于实时性交互要求比较高,对系统的响应时间、并发用户数等要求都比较高,并且从数据角度分析,系统上线几年后存量数据一般都是千万级数据量,因此前期性能设计与验证对业务系统的后期正常运行维护至关重要。
在软件开发前期的需求分析阶段,需求分析师与客户业务人员沟通时,要明确提出各项性能指标,包括系统业务交易的使用频度、系统并发用户量、业务数据量评估等各项指标。然后对系统的响应时间、用户数和资源使用进行分析。
1、响应时间分析
响应时间的需求调研分析,例如查询类的交易需要在多少秒之内响应,对于URL连接或者刷新整个网页的时间,它是一个非常重要的度量值,因为它是直接体现用户体验的一个指数。
它同时也是最不容易测量的度量值,因为它比其他的度量值更容易发生变化。我们需要了解响应时间的区域分布。例如:一般月底是发工资的时候,查询当前账户额度是用户这段时间最常用的功能,这段时间的系统响应时间估计比平常响应时间慢些,而对于电信之类的报表查询,省内公司查询当月本省各个分公司、分点的销售额情况,总公司查询全国各省的总销售额情况,这时数量级别相差甚大,查询时响应时间也相对比较慢。这些情况对于指导服务器分布、负载均衡、数据库的设计都非常重要。
2、用户数分析
用户数分析,主要分析评估系统上线后的总用户数、平均每天在线用户数等情况,具体可分析:哪些交易每天都有用户在执行业务交易,这些用户一般占系统总人数的比例是多少;哪些交易会在月底、季末或者年底高频率并发使用;哪些交易用户使用得比较少,但却是相关重要人物(如上级领导)重点关注的交易。这些用户数分析结果,可为后续的性能测试设计中,针对混合场景的用户数配比设计提供有力的参考依据。
3、资源使用分析
资源使用分析用于衡量系统资源使用率的情况,反映系统的最底层性能情况,对于容量规划比较有指导作用,同时它也是比较容易理解的性能度量值。
二、设计开发阶段的性能分析与验证
大部分项目的性能问题是设计出来的,而不是开发和测试出来的。要获得性能良好的软件系统,需要根据需求分析及设计规划,进行系统的规模分析和完整的性能分析,预估性能瓶颈点,提出解决方案,最后通过架构师、程序设计人员等角色进行评审验证并确认,保障性能目标的达成。
在代码开发阶段,需要根据设计方案,在开发过程中关注性能瓶颈点,进行相应的白盒测试,通过代码分析和评审等手段,确认性能瓶颈并解决。需要不断地分析和总结性能问题和解决方案,形成性能方面的代码编写规范,从而在研发阶段的早期就能确保把软件系统在性能方面的风险降到最低。
系统设计与代码实现的很多细节都会对软件系统性能起到关键的作用。例如,在数据查询界面设计时,需要考虑查询方式是模糊查询还是精确查询、如何设计查询分页展现、对象的创建以及释放问题等。
在采用具体实现技术时,也需要注意性能细节,例如 Hibernate 中对大数据量查询时,需慎用 list() 或者 iterator() 遍历返回查询结果。
在采用Java等托管语言开发软件系统时,需要注意对象的生成和对象大小问题,否则容易导致产生大量对象实例,系统不仅要花时间生成对象,还可能要花时间对这些对象进行垃圾回收和处理,生成过多的对象将会对程序的性能带来很大的影响。
在数据库设计上也有很多细节会对后期系统性能表现有决定性的影响,例如:对历史查询是否分区、如何分区性能更好;如何设计批量数据抽取转换的方式,以保证减少或消除等待;如何设计索引,减少全表扫描、提高SQL查询效率;编写良好的SQL语句以便提高重用率、减少数据库解析。
三、统测试阶段的性能验证与优化
性能问题越早发现、修改,越能保证系统上线后的稳定性,因此应该在软件生命周期的不同阶段进行软件性能测试。
性能测试大致可以分为单元性能测试、集成性能测试、系统性能测试、多套系统互联接口性能测试等。其中,对一套系统进行的系统性能测试,也就是在特定的环境下、一定量的数据情况下,进行的系统级的性能测试,是最常用的,也是最为测试人员所熟悉的一种性能测试。
系统性能测试阶段的一般测试过程如下:在系统功能被确认后,模拟真实生产环境进行软件系统的部署(包括硬件设备、操作系统、网络搭建、负载均衡部署、中间件部署、数据库部署等),然后再根据前期的性能测试需求分析结果及测试策略定义的方法,模拟一定量的虚拟并发用户数,进行压力测试,同时监控分析系统是否满足预期的性能指标,识别性能可能出现的瓶颈点(应用代码、网络设备、硬件设备、操作系统、中间件配置、数据库等),并进行性能优化处理,调优后再进行复测,确保软件系统最终达到性能要求。
====================================分割线================================
最新内容请见作者的GitHub页:http://qaseven.github.io/