当我们讨论性能测试时,我们在说什么?
说起性能测试,大家会想到哪些词?录制脚本、模拟高并发?性能需求分析、业务流程梳理?监控资源耗用、性能瓶颈定位?优化代码处理逻辑、提升服务器配置?
但这真的是性能测试的本质和最终目的么?这篇博客,聊聊我对软件性能的一些看法和思考。。。
首先明确一点:技术的存在是为了解决实际的业务发展中遇到的问题和痛点!
随着互联网时代不断深入生活工作的各方面,绝大多数的软件系统都会面临如下三个挑战:
1、日益增长的用户数量;
2、日渐复杂的业务场景;
3、急剧膨胀的数据冲击;
这对于软件系统而言,就意味着及时高效的处理能力、更好的服务可用性以及长期运行的稳定性等要求。
从以上几点要求出发,站在性能测试的角度,来谈谈我们需要注意哪些事项。。。
更及时高效的处理能力
在互联网最初的年代,有二五八原则一说。意思就是对用户而言,在页面做一个功能操作,如果能在2秒能出现用户期待的内容,那么用户体验就是比较好的。
如果5秒之内可以返回结果,那么对用户来说就是可以接受的范围,如果超过8秒,绝大多数用户就会选择离开或退出该页面。
虽然这只是一个笼统的概念,但也能看出用户对软件系统处理能力的容忍性。
近几年随着网络通讯技术的不断发展,以及硬件设施的不断提升,导致用户对软件处理能力越来越低的容忍力。
从性能优化角度出发,就需要我们尽力保持和降低系统的99%RT(即一段时间内请求响应时间从低到高排序,低于99%响应时间的上限边界值)的同时,提高单位时间内的处理能力。
请求响应时间=请求发送耗时+请求解析耗时+请求处理耗时+处理结果返回耗时
提高处理能力和降低响应时间,有很多技术方案可以实现,比如:
提高网络传输速率、优化请求传输方式(串行→并行→连接复用→管道化)、增加缓存、优化代码处理方式、增加处理请求的机器数量、提升机器配置等方式。
更好的服务可用性
什么是可用性(Usability)?可用性实际上并不是一个具体的东西,也没有明确的定义。
个人觉得Jakob Nielsen大师提出的可用性五大属性,就很客观全面的介绍了可用性的特点,它们分别是:
可学习性(Learnability):初次接触这个设计时,用户完成基本任务的难易程度;
效率 (Efficiency):用户能多快完成任务;
可记忆性(Memorability):当用户一段时间没有使用产品后,是否能马上回到以前的熟练程度;
出错(Errors):用户能否从错误中恢复(从系统角度出发,可以理解为容错性);
满意度(Satisfaction):用户对产品的主观满意度。
如果真要给出一个定义,那么我们可以这样理解:可用性是指在特定的使用场景下,产品为特定用户用于特定目的时所具有的有效性、效率和主观满意度。
从可用性五大属性出发,站在性能优化角度,就要求我们做如下的一些事情,来不断提升软件服务可用性:
可学习性:尽可能减少用户操作的步骤,优化业务逻辑;
效率:提升响应时间和系统的处理能力(回到上面提到的及时高效的处理能力);
可记忆性:人性化的提示,导航能力,是否符合特定用户的操作习惯;
出错:提升系统的容错能力和恢复能力;
满意度:提高用户体验,做好用户需求调研和场景建模分析;
如果只讨论技术保障方案,我们需要做好服务治理、服务解耦,通过主从模式、系统集群负载均衡、双机双工、分布式等方式,来保证系统在高可用的同时,降低故障恢复时间。
长期运行的稳定性
一般来说,系统的稳定性指标要求7*24小时或者5*8小时,系统的存活时间越长,意味着系统越稳定,这个要根据系统具体的业务定位来确定。
现在而言,系统的稳定性要求已经不仅仅是存活时间,还要求运行过程中的保持服务的高可用、及时处理能力、容错能力以及出现故障的及时恢复能力。
那么如何保证系统的稳定性呢?
容错能力:即系统对于自身出现的错误具有一定的屏蔽或处理能力。常见的容错手段包括如下几点:
①、失败重试机制;
②、多机备份自动切换;
③、设置合理的TimeOut;
④、服务解耦,微服务模式;
⑤、权重选举,服务降级;
更多阅读:亿级web系统的高容错性实践
故障恢复能力:即系统能否从出错或故障中及时恢复正常服务水平的能力。
一般来说会根据故障的严重等级和优先级,确定不同等级的故障需要在多久时间内恢复正常提供服务的能力。常见的故障有如下几种:
①、硬件及有关设备故障;
②、软件系统故障;
③、数据故障;
④、网络故障;
为了应对如上的几种故障,常见的一些容灾恢复方案有如下几种:
①、系统需要具有自我诊断、故障报告及指示处理方法的能力,以及具备冗余及自动切换能力;
②、监控到故障发生时,系统需要具备及时隔离、服务降级、服务快速切换的能力;
③、主从热备,多机冷备,异地多活等措施;
更多阅读:不容忽视的软件可恢复测试
总结
回到开头提到的内容:技术的存在是为了解决实际的业务发展中遇到的问题和痛点!
随着业务的不断发展,软件系统面临着日益增长的用户数量、日渐复杂的业务场景以及急剧膨胀的数据冲击这几种挑战。
这就要求我们的系统具有及时高效的处理能力、更好的服务可用性以及长期运行的稳定性等要求。
为了解决这几点挑战,使系统具有所要求的能力,我们需要通过性能测试来验证系统是否具有我们所期望的能力。
我们通过完善性能测试流程,优化性能测试工具,采用不同性能测试方法,在各种环境和条件下进行测试,全方位监控,定位分析性能瓶颈,针对性的进行优化,
最终的目的是希望系统具有及时高效的处理能力,更好的服务可用性和长期运行的稳定性,来满足系统面临的种种挑战,为业务的发展提供更好的服务保障!