性能测试
性能测试概念、适用场景和相关的最佳实践。
性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。需要在对系统性能有一定程度了解的前提下,在确定的环境下进行压测。从测试目的上性能压测又可以划分为负载测试、压力测试、并发测试、配置测试以及可靠性测试。
负载测试是测试当负载逐渐增加时,系统各项性能指标的变化情况。
压力测试是通过确定一个系统的瓶颈或者不能接受的性能点,来获得系统能提供的最大服务级别的测试。
并发测试通过模拟用户并发访问,测试多用户并发访问同一个软件、同一个模块或者数据记录时是否存在死锁等性能问题。
配置测试是通过对被测系统的软/硬件环境的调整,了解各种不同方法对软件系统的性能影响的程度,从而找到系统各项资源的最优分配原则。
可靠性测试是在给系统加载一定业务压力的情况下,使系统运行一段时间,以此检测系统是否稳定。
适用场景
性能压测可以用于以下场景:
新系统上线支持:在新系统上线前,通过执行性能压测能够对系统的负载能力有较为清晰的认知,从而结合预估的潜在用户数量保障系统上线后的用户体验。
技术升级验证:在系统重构过程中,通过性能压测验证对比,可以有效验证新技术的高效性,指导系统重构。
业务峰值稳定性保障:在业务峰值到来前,通过充分的性能压测,确保大促活动等峰值业务稳定性,保障峰值业务不受损。
站点容量规划:通过性能压测实现对站点精细化的容量规划,指导分布式系统机器资源分配。
性能瓶颈探测:通过性能压测探测系统中的性能瓶颈点,进行针对性优化,从而提升系统性能。
性能压测伴随着系统开发、重构、上线到优化的生命周期,有效的性能压测对系统的稳定性具有重要的指导意义,是系统生命周期中不可或缺的一部分。
最佳实践
确定性能测试目标和基线
性能测试目标可能源于项目计划、业务方需求等。这一阶段需要确定性能测试的业务指标和系统的资源指标和应用指标。
业务指标中,最需要关注的是以下“黄金三指标”:
业务响应时间:具体指标为RT(Response Time),业务部门一般更关注此指标的具体值。一般情况下,不同系统的业务响应时间期望值是不同的,建议1秒以内。像大型电商系统业务RT基本在几十毫秒以内。
业务吞吐量:具体指标为TPS(Transaction Per Second,即系统每秒处理事务数),这个指标是衡量系统的处理能力的一个非常重要的指标。TPS可以参照同行业系统和结合具体业务,中小企业TPS值为50~1000笔/秒,银行TPS值为1000~50000笔/秒,大型电商系统TPS值为30000~300000笔/秒。
成功率:这个指标是衡量系统处于压力下,业务的成功率,一般业界成功率要大于99.6%。
确定以上业务指标后,即可定义出性能基线,在手动或自动化执行完性能测试后,将测试结果和性能基线比对,判断性能测试是否通过。
确定性能压测环境
全新生产环境
如果是刚迁移到云上或者是新的机房,全链路的进行业务压力测试之后可以进行正式投产的,这种验证效果较好,因为最终就是真实的性能环境,一般可以将真实的生产环境数据进行脱敏导入,确保业务数据量(交易数据、流水、各种业务核心业务记录等)维持在半年以上,同时确保数据的关联完整性(包括跨系统的业务完整性数据),压测基于这些基础数据进行相应的核心业务的流量(登录、购物车行为、交易行为等)构建,最后在投产前做相应的数据清理再初始化一次存量基础数据。
等比性能环境
一般是指在生产环境单独划分区域,准备等比的容量,共享接入层的性能测试环境。这种方案缺点是成本较高,优点是方案简单、风险可控,容量规划较为精准。
在等比性能环境中,必须保证有共享的接入层(CDN动态加速、BGP、WAF、SLB、4层7层负载均衡等等,确保最重要的网络接入层相同,能发现问题)。后端的服务容量配比上至少保证是生产环境的1/4,配比越大精准度也会大幅下降,数据库建议能相同配置。在基础数据的准备上和上面全新生产环境的方法一致,确保业务数据量维持在半年以上,同时保证数据的关联完整性。
生产环境
生产环境上基础数据基本分为两种方式,一种是数据库层面不需要做改造,直接基于基础表里的测试账户(相关的数据完整性也要具备)进行,压测之后将相关的测试产生的流水数据清除(清除的方式可以固化SQL脚本或者落在系统上);另一种就是压测流量单独打标(如单独定义的Header),然后业务处理过程中识别这个标并传递下去,包括异步消息和中间件,最终落到数据库的影子表或者影子库中。此外,生产环境的压测尽量在业务低峰期进行从而避免影响生产的业务,无论上述哪种方式都可以通过部署单独的压测专用集群来进一步避免对生产业务的影响。
在云计算时代,推荐使用等比性能环境的方案。在压测时,快速弹性扩容出足够的计算资源,压测结束后,即可缩容,节省成本。
构建性能测试场景
执行性能测试前,需要构造测试脚本,并为脚本准备输入参数文件,来尽可能模拟全业务链路的真实请求链路与负载。为了保证测试脚本能够拟合真实用户的行为,并且脚本中不遗漏接口,一般会采用录制的方式,从浏览器或客户端将用户行为完整记录下来,并自动转为压测脚本。开源JMeter压测工具和阿里云PTS都提供了脚本录制工具,帮助用户高效构建测试脚本。
执行性能测试,分析测试结果
测试脚本和输入参数文件构造完成后,就可以借助性能压测工具,按照设计来执行测试了。执行过程中,需要观察请求成功率、响应时间、业务吞吐量,如果发现指标有明显的拐点,比如成功率或吞吐量大幅下降、响应时间大幅上升,就代表系统已经遇到性能瓶颈,可以根据系统资源监控和应用监控,定位具体的瓶颈点,做对应的弹性扩容。调优后,重新执行测试,验证扩容效果。
持续压测,防止性能退化
性能测试通过后,需要定期执行回归测试,并比对性能基线,防止在持续迭代过程中系统性能退化,一般定期的频率与敏捷开发的周期一致,推荐每一周或两周,自动化定时执行性能测试,如果发现性能大幅退化,可以及时回滚系统版本,并配合性能监控,排查瓶颈点。