上一篇文章里说过,目前互联网公司的测试开发岗位分两类。 多数的一类是既要负责业务测试、自动化测试,同时也要去开发测试框架、效率工具来辅助业务测试。 这类测试开发的岗位(主要指后端的岗位)一般多少都要接触压力测试。 压力测试、性能测试、负载测试、稳定性测试在网络上有很多文章介绍概念和区别,通常在项目过程中不会区分那么多,实际项目中都是以目标为导向,通常实际项目中都会说,压测一下看下性能,所以这里就不管详细的概念和区别了。 为了好理解,我们这里统一叫压测,并以得到性能数据为性能测试,以观察稳定性为稳定性测试。 性能测试和稳定性测试的相同之处在于都是使用压测工具来进行。 但目标不同,性能测试是通过压力测试得到系统的极限性能或者和上一版本的性能对比数据。 而稳定性测试则是通过压力测试提供稳定或者变化的持续流量,来观察系统持续运行的情况下是否存在异常。 正常情况下,一般系统先做性能测试,拿到极限性能或者性能对比数据(对于非1.0项目,性能数据一般需要和上一个版本对比)之后,再通过安全的流量持续压测更长时间,来完成稳定性的验证。 下面我们就具体介绍一下怎么做性能测试和稳定性测试。 性能测试的第一步要确定目标,就是为什么要做性能测试,要达到什么样的目标或者效果。 比如某个首次上线的系统,性能测试主要是为了得到系统的极限性能数据;再比如,系统优化,更换了RPC协议或者消息队列,性能测试就是为了量化此次系统优化在性能上优化的效果。 另外,也不是所有的项目都需要性能测试,比如一个内部系统,用户数和流量本身就很少,而且在未来一段时间也不会有增量,这就基本不需要性能测试。 如果是从无到有的1.0项目,因为项目还没有上线,所以只能评经验来预估线上的流量数据;但如果是非1.0项目,就可以收集当前的线上数据。 具体收集的数据如下(仅供参考,要按照实际情况来调整):1)被测系统或模块各类请求流量比例;2)系统或模块目前平均、峰值、最小 qps;3)线上部署方式和规模;4)被测系统或模块依赖能承受的QPS或者容量。 确定目标和收集完线上现有数据之后,需要根据目标和现有数据确定压测方案,比如,每个阶段通过多大并发或者流量来压测、分几个阶段、每个阶段多长时间、以及压测过程中需要观察和记录哪些数据等。 同时,也要准备压测环境,压测的环境要尽可能的和线上一致,如果达不到,就做等比缩放。 比如,一个系统有A、B两个模块组成,线上A部署了20台机器,B部署了5台机器,那么压测就可以A部署4台,B部署1台。 机器和实例的数量只是一个方面,同时也要考虑机器的性能(CPU盒数、内存、磁盘、网卡等),还要考虑依赖方(如DB、缓存、消息队列等)的部署。 部署压测环境的核心思路就是要用这套环境反应出线上环境的真实情况。 要进行压力测试就一定要有压测工具,一般来说压测http或者其他开源协议可以在网上找到现成的工具,比如jmater之类的。 但如果场景比较特殊,或者使用的是公司或项目的私有协议,就只能使用公司内部的工具或者自己动手开发了。 选择好压测工具就要构造压测数据了。 构造压测数据主要分两点: 第一点是要构造压测环境系统中的数据。 因为线上系统内部一定是有一定数据的,我们要尽量模拟线上就要在系统中添加相应的数据。 另一点就是要准备压测的请求数据。 这点跟选择的压测工具有关,一般来说分2种: 1)数据词典, 压测的请求提前准备好,存入文件、DB或缓存里,数据量较大的时候一般需要写程序生成。 2)实时生成,这种是压测工具在压测的时候根据配置规则来实时随机生成请求。 准备工作一切就绪,下一步就开始做压测的执行。 这时候主要就是根据压测方案的从低到高去调整压测工具的并发数或请求数,来对目标系统或模块进行压测。 压测时,要观察CPU、内存、网络IO、磁盘空间、被压目标日志、依赖系统或者模块的状态等数,也要记录不同并发下目标系统或者模块处理请求的QPS和响应时间。 同时也要注意有没有内存泄漏、句柄泄漏、系统崩溃等问题。 实际上部分数据在记录的过程中就可以初步整理出来。 这里要针对上一步记录的数据,进行汇总,主要要产出在不同并发下,上面提到的数据都是什么情况。 需要根据数据判断出极限性能,找到这种部署情况下瓶颈在哪,以及是什么原因造成的,为后续扩容提供依据。 有些情况还需要跟以前的数据做对比,看性能提升或者下降的程度是不是符合预期。 最后,把这些信息综合汇总、分析之后,产出性能测试的报告。 通常性能测试之后拿到了性能数据之后,都会在安全的并发或者流量下持续压测更长的时间来确保服务的稳定性。 比如,笔者通常测试性能的时候,每轮可能压测半小时到一小时(在刚开始并发或者流量较小的时候可能会更短),在得到期限性能之后,会控制极限性能时80%-%90的流量或者并发去压测更长的时间,这个时间一般会比较长,而且多数情况下会在晚上下班前启动,然后第二天到公司来看结果。 除了长时间通过安全流量来验证外,有些时候在特殊场景下,也需要验证在安全流量范围内,流量急曾或者急降的情况下,稳定性是否有影响。 或者,验证在一定流量下,模拟某个依赖或者系统内部的模块出现问题,执行相应预案时,对系统整体的影响是否符合预期。 当然,稳定性很多情况是异常,但更多的异常会在异常测试里去做,这里的稳定性测试是指在一定流量压力下的稳定性测试,其他的就不做讨论了。 上面介绍了压力测试里,性能测试和稳定性测试要做什么,那具体怎么做呢?下面我们就通过一个实例来简单介绍一下。 一个消息推送的系统,推送的消息就是我们日常手机APP的通知消息。 这个消息通知的系统有三个接口,分别是单播(指定推送给某个人)、组播(推送给一个组,组里可能有多个人)、广播(推送给APP所有用户)。 现在这个系统做了一个重构,更新了内部交互的RPC协议,所以要压一下,跟之前的性能数据做个对比。 另外,系统重构前,线上集群极限性能为 QPS。 下面,我们就按照前面的步骤,来简单介绍一下具体怎么做。 目标就是要得到重构后的系统性能数据,并和原有的做对比,原有的极限性能已知,大概在 QPS左右。 收集线上数据,比如说我们收集到单播、组播、广播的请求比例为5:78:1;组内人数大概在300-1000;发送的消息字符数在30-100这个区间。 压测方案要先确定部署方案,比如这个系统向上是20台机器(或者实例),压测采用2台机器(等比缩放)。 压测机器是线上的1/10,所以我们的目标性能就是3000qps。 那么我们压测的方案就可以如下设置: 第一轮,2个并发,5-10分钟,主要目的是为了先验证环境和压测工具没有问题; 第二轮,根据上一轮并发数和机器资源(CPU、内存、IO)的情况,调整并发到极限的一半多一些(比如,之前是2个并发,CPU占用10%左右,内存、IO占用都很小,那么就以CPU的占用作为参考来计算,1个并发大概占用5%,那我们就可以吧并发调到10-12,目标CPU占用是50-60%)。 这其实才真正开始压测,如果没问题,就开始逐步加压;第三轮,开始逐步增加,按照实际情况一次增加2-5个并发,直到性能达到瓶颈。 这里是假设压测工具通过调整并发数来操作压力,主要需要看下并发对系统CPU、内存、IO的影响,根据压测时机器的资源占用信息来判断增加多少并发。 确定好方案,就需要部署压测环境了,这里要注意,尽量使用跟线上一致配置的机器。 压测工具要根据实际业务做选择,必要的时候需要自己开发,工具开发后面如果有机会在其他的文章里介绍,这里就不多介绍了。 我们这个例子因为是系统更换内部协议,对外接口不变,所以可以使用原有压测工具。 下面就是要构造数据: 首先,要构造系统内部的数据,比如用户信息、设备信息、组信息,这里既要根据线上的收集到的信息来构造,比如用户数、组的数量、组内用户数等。 这类如果方便的话可以直接在DB里插入,或者掉相应的系统API来准备。 然后就是压测的请求数据,比如说压测工具是用数据词典来压测,那么这里我们就通过脚本,来生成压测请求数据。 这里要注意线上收集到的各个接口的占比,即5:78:1。 压测的时候按照这个比例来提供流量。 准备工作完成,开始做压测。 这时候要先吧各类数据观察准备好,一般现在的互联网大厂都有图形化的工具来看,如果没有也可以通过linux的一些命令来看。 常用的命令有top\ps\vmstat, 这里推荐使用top来查看实时的资源情况,使用vmstat的来定时输出当资源情况(vmstat -t 1 就是每秒输出一次)。 准备好了观测,那就启动压测工具,按照方案压测。 压测方案上面已经介绍,这里就不重复了。 假如我们并发加到20个的时候,CPU占用达到85%左右,处理请求达到3600qps,其他资源占用都不足机器的一半;并发加到22个的时候,CPU占用达到95-100,处理请求是3700qps;并发加到24,CPU打满,处理请求3800QPS,并且出现错误日志。 这时候就可以停止压测了。 数据整理,我们首先要整理一个表格或者图标,我们这里用表格:这个表格就是压测产出的最核心的数据,由于CPU是明显的性能瓶颈,表格里就不体现其他资源了,如果其他资源使用率也比较高,也要放到这个表格里,又或者瓶颈在外部依赖,也要体现出来。 通过这个数据可以看出,3700QPS就是系统处理的极限,安全的流量在3600QPS。 这时候就可以用17-20的并发数,长时间压测压测一下,看看系统整体的稳定性。 那么性能报告怎么写呢?下面就给出一个比较简单的性能报告样例。 标题:消息推送RPC协议升级性能测试报告 一、项目背景 这里写项目背景和目标 二、压测环境 线上20台物理机,压测环境使用2台物理机,配置与线上一致,具体如下: XX核,XXG内存,万兆网卡,硬盘 400G * 6 SSD DB:XX主XX从XX备 三、压测方案和数据 1. 请求比例 单播:组播:广播 = 5:78:1 2. 压测过程数据 3. 资源占用图 可以把QPS和CPU占用使用工具(比如excel)生成一个折线图,另外,可以把其他资源数占用的数据图片贴一下。 四、结论 压测过程中,压力达到3700qp时,内存与IO正常,CPU占用达到98%,无错误日志。 压力达到3800qps时CPU打满,且5分钟后开始出现错误日志。 因此系统在2台物理机部署极限性能为3700qps,性能瓶颈在CPU,预计线上20台机器极限性能为qps. 系统RPC协议升级前20台机器qps,升级后预计能达到qps,性能整体提升23%,符合预期。 上面就是一个比较简单的报告,真实项目中瓶颈不一定是CPU,可能是其他资源,也可能是依赖的系统或者模块,这些都需要观察和分析压测中的数据来得出。 压力测试是后端测试和测试开发人员的必备技能,这篇文章只是根据笔者的经验针对压力测试进行的总结,不能覆盖所有压测场景,仅给大家做个参考。 更多的是需要我们根据系统的实际情况去探索和实践。
压力测试,英文名为Stress Testing,与负载测试极为相似。 它在软件测试中扮演着核心的角色,是确保软件质量的基本手段。 压力测试的初衷非常直接:不按照日常操作条件去执行手动或自动化测试,而是将测试置于资源紧张或计算机资源有限的情况下。 测试的重点资源包括内部内存、CPU可用性、磁盘空间以及网络带宽等。 通常,通过并发操作来实施压力测试。 在压力测试中,测试人员会故意使系统资源达到饱和状态,甚至超过系统极限,以观察系统在高负载下的表现和稳定性。 这样的测试不仅能够发现系统在常规运行条件之外的潜在问题,还能够验证系统对于突发的、大量的请求或数据处理的应对能力。 通过压力测试,开发团队能够确保在实际环境中,系统能够承受预期的业务压力,包括但不限于大量的用户访问、高强度的数据处理、以及突发的流量高峰。 这种测试对于提升软件的可靠性、稳定性和性能有着不可或缺的作用。 实施压力测试时,测试人员通常会采用不同的工具和策略,模拟各种极端情况,如同时处理大量并发请求、模拟大规模用户流量等,来全面评估系统的性能和稳定性。 通过这样的方式,团队可以对系统在高负载下可能遇到的问题进行预判和预防,从而在产品发布前尽可能地消除潜在的故障点。 总的来说,压力测试是软件开发和测试流程中不可或缺的一部分。 通过模拟系统在极端情况下的运行状态,可以帮助团队发现并解决在常规测试中难以察觉的问题,确保软件在各种实际应用场景下的稳定性和性能。
进行压力测试的方法,大致可归纳为两大类: (1)敏感度分析(sensitiveanalysis)此方法是利用某一特定风险因子或一组风险因子,将因子在执行者所认定的极端变动的范围内变动,分析其对于资产组合的影响效果。 这一分析方法的优点在于容易了解风险因子在可能的极端变动中,每一变动对于资产组合的总影响效果及边际效果,缺点则是执行者对于每一逐渐变动所取的幅度及范围必须十分恰当,否则将会影响分析的结果与判断,特别是对于非线性报酬率的资产组合,这种情况将更为显著。 (2)情景分析(scenarioanalysis)即一组风险因子定义为某种情景,分析在个别情景下的压力损失,因此此类方法称为情景分析。 情景分析的事件设计方法有两种:历史情景分析和假设性情景分析。 ① 历史情景分析(Historicalscenario):利用某一种过去市场曾经发生的剧烈变动,评估其对现在的资产组合会产生什么影响。 例如考虑1987年美国股市崩盘,计算当时的历史变动幅度,并依此基础分析评估对资产组合的影响。 BCGFS(2001)的研究显示,1998年俄罗斯政府违约事件,是金融机构用来在信用风险压力测试上使用的压力事件,其他如中南美洲比索风暴、东南亚金融风暴亦是很重要的压力事件。 这种方法的优点是具有客观性,利用历史事件及其实际风险因子波动情形,在建立结构化的风险值计算上较有说服力,且风险因子间的相关变化情形也可以依历史数据作为依据,使模型假设性的情形降低许多。 此外,这种模型较直觉,重大历史事件的深刻印象将使风险值与历史事件紧密结合,管理者在设定风险限额时,便可依历史事件的意义来进行评估,使决策更具说服力。 但这种方法的缺点在于现今金融市场变动非常迅速,许多金融商品不断创新,因此历史事件无法涵盖此类商品,且某些商品的历史价格未出现极端情况,亦无法利用此方法进行衡量。 虽然过去发生过的情景未来不一定会再发生,但使用历史情景分析方法来对资产进行风险管理,至少可保证过去的压力事件,在事前预防下,未来不会重演。 ② 假设性情景分析:仅以历史情景分析进行压力测试有其限制,参考历史事件并另建立对于每个风险因子可能产生的极端事件,将使得压力测试更具完整性,这就是假设性情景分析。 这种分析方法银行可自行设计可能的各种价格、波动及相关系数等的情景,这些汁算的设定主要来自经验及主观。
本文地址:http://www.hyyidc.com/article/36515.html