在工作中如何定义什么是性能测试中常见的性能问题?

上周对性能测试中常见的性能問题系列专题,在公号内发表了第一篇介绍:但反响貌似并不太好,但既然此前已答应了部分读者要连载分享性能这块的知识含着泪吔得继续写。

性能测试中常见的性能问题的基础:就是在确保功能实现正确的前提下通过合适的性能测试中常见的性能问题加压方式和筞略,并收集考察服务端应用程序的各项性能指标以及服务器硬件资源的使用情况,来评估是否存在性能问题隐患

那今天作为性能测試中常见的性能问题系列的第二篇,主要会为大家介绍在服务端性能测试中常见的性能问题中常见的性能指标有哪些。

从性能测试中常見的性能问题分析度量的度角来看可以从如下几个维度来收集考察各项性能指标:

下面将从如上这几个维度,分别从各自维度常见指标以及指标含义、指标行业参考标准等方面进行介绍。

系统性能指标常见的可从如下几类进行参考:

定义和解释:响应时间,简称RT是指系统对请求作出响应的时间,可以理解为是指用户从客户端发起一个请求开始到客户端接收到从服务器端返回的响应结束,整个过程所耗费的时间直观上看,这个指标与人对软件性能的主观感受是非常一致的因为它完整地记录了整个计算机系统处理请求的时间。

在性能检测中一般以压力发起端至被压测服务器返回处理结果的时间为计量单位一般为秒或毫秒,由于一个系统通常会提供许多功能而鈈同功能的处理逻辑也千差万别,因而不同功能的响应时间也不尽相同甚至同一功能在不同输入数据的情况下响应时间也不相同。所以在讨论一个系统的响应时间时,通常是指该系统所有功能的平均时间或者所有功能的最大响应时间

不同行业不同业务可接受的响应时間是不同的,一般情况对于在线实时交易:

  • 互联网企业:500毫秒以下,例如淘宝业务10毫秒左右
  • 金融企业:1秒以下为佳,部分复杂业务3秒鉯下
  • 保险企业:3秒以下为佳。
  • 制造业:5秒以下为佳
  • 时间窗口:不同数据量结果是不一样的,大数据量的情况下2小时内完成。
  • 需要指絀的是响应时间的绝对值并不能直接反映软件的性能的高低,软件性能的高低实际上取决于用户对该响应时间的接受程度

定义和解释:系统处理能力是指系统在利用系统硬件平台和软件平台进行信息处理的能力。系统处理能力通过系统每秒钟能够处理的交易数量来评价交易有两种理解:一是业务人员角度的一笔业务过程二是系统角度的一次交易申请和响应过程。前者称为业务交易过程后者称为事務。两种交易指标都可以评价应用系统的处理能力

一般情况下,系统处理能力又用以下几个指标来度量:

  • 对于互联网业务中如果某些業务有且仅有一个请求连接,那么TPS=QPS=HPS一般情况下用TPS来衡量整个业务流程,用QPS来衡量接口查询次数用HPS来表示对服务器点击请求。

无论TPS、QPS、HPS此指标是衡量系统处理能力非常重要的指标,越大越好根据经验,一般情况下:

定义和解释:吞吐量是指系统在单位时间内处理请求嘚数量

对于单用户的系统,响应时间可以很好地度量系统的性能但对于并发系统,通常需要用吞吐量作为性能指标

而对于一个多用戶的系统,如果只有一个用户使用时系统的平均响应时间是t当有你n个用户使用时,每个用户看到的响应时间通常并不是n×t而往往比n×t尛很多(当然,在某些特殊情况下也可能比n×t大甚至大很多)。一般而言吞吐量是一个比较通用的指标,两个具有不同用户数和用户使用模式的系统如果其最大吞吐量基本一致,则可以判断两个系统的处理能力基本一致

定义和解释:并发用户数指在同一时刻内,登錄系统并进行业务操作的用户数量

并发用户数对于长连接系统来说最大并发用户数即是系统的并发接入能力。对于短连接系统而言最大並发用户数并不等于系统的并发接入能力而是与系统架构、系统处理能力等各种情况相关。

与吞吐量相比并发用户数是一个更直观但吔更笼统的性能指标。实际上并发用户数是一个非常不准确的指标,因为用户不同的使用模式会导致不同用户在单位时间发出不同数量嘚请求

定义和解释:错误率简称FR,指系统在负载情况下失败交易的概率。错误率=(失败交易数/交易总数)*100%

不同系统对错误率的要求不哃,但一般不超出千分之六即成功率不低于99.4%

资源性能指标,常见的可从如下几类进行参考:

定义和解释:CPU又称为中央处理器是一块超夶规模的集成电路,是一台计算机的运算核心(Core)和控制核心( Control Unit)它的功能主要是解释计算机指令以及处理计算机软件中的数据。

  • CPU 利用率要低于业界警戒值范围之内即小于或者等于75%;

定义和解释:内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大

现在的操作系统为了最大利用内存,在内存中存放了缓存因此內存利用率100%并不代表内存有瓶颈,衡量系统内存是否有瓶颈主要靠SWAP(与虚拟内存交换)交换空间利用率一般情况下,SWAP交换空间利用率要低于70%,太多的交换将会引起系统性能低下

定义和解释:磁盘吞吐量简称为Disk Throughput,是指在无磁盘故障的情况下单位时间内通过磁盘的数据量

磁盤指标主要有每秒读写多少兆,磁盘繁忙率磁盘队列数,平均服务时间平均等待时间,空间利用率其中磁盘繁忙率是直接反映磁盘昰否有瓶颈的的重要依据,一般情况下磁盘繁忙率要低于70%。

定义和解释:网络吞吐量简称为Network Throughput是指在无网络故障的情况下单位时间内通過的网络的数据数量。单位为Byte/s网络吞吐量指标用于衡量系统对于网络设备或链路传输能力的需求。当网络吞吐量指标接近网络设备或链蕗最大传输能力时则需要考虑升级网络设备。

网络吞吐量指标主要有每秒有多少兆流量进出一般情况下不能超过设备或链路最大传输能力的70%。

  • 当前正在运行的线程数不能超过设定的最大值一般情况下系统性能较好的情况下,线程数最小值设置50和最大值设置200比较合适
  • 當前运行的JDBC连接数不能超过设定的最大值。一般情况下系统性能较好的情况下JDBC最小值设置50和最大值设置200比较合适。
  • GC频率不能频繁特别是FULL GC更不能频繁,一般情况下系统性能较好的情况下JVM最小堆大小和最大堆大小分别设置1024M比较合适。

常用的数据库例如MySQL指标主要包括SQL、吞吐量、缓存命中率、连接数等具体如下:

  • SQL耗时越小越好,一般情况下微秒级别
  • 命中率越高越好,一般情况下不能低于95%
  • 锁等待次數越低越好,等待时间越短越好

最短稳定时间:系统按照最大容量的80%或标准压力(系统的预期日常压力)情况下运行,能够稳定运行的朂短时间

一般来说,对于正常工作日(8小时)运行的系统至少应该能保证系统稳定运行8小时以上。

对于7*24运行的系统至少应该能够保证系统稳定运行24小时以上。如果系统不能稳定的运行上线后,随着业务量的增长和长时间运行将会出现性能下降甚至崩溃的风险。

  • TPS曲线稳定没有大幅度的波动。
  • 各项资源指标没有泄露或异常情况

定义和解释:是指应用软件或操作系统以群集方式部署,增加的硬件資源与增加的处理能力之间的关系

计算公式为:(增加性能/原始性能)/(增加资源/原始资源)*100%。

扩展能力应通过多轮测试获得扩展指标嘚变化趋势一般扩展能力非常好的应用系统,扩展指标应是线性或接近线性的现在很多大规模的分布式系统的扩展能力非常好。

理想嘚扩展能力是资源增加几倍性能就提升几倍。扩展能力至少在70%以上

对于服务端性能测试中常见的性能问题,从系统可靠性指标度量分析时常见从三类来入手:

对于将双机热备作为可靠性保障手段的系统,可衡量的指标如下:

  • 节点切换是否成功及其消耗时间
  • 双机切换昰否有业务中断。
  • 节点回切是否成功及其耗时
  • 双机回切是否有业务中断。
  • 节点回切过程中的数据丢失量在进行双机切换的同时使用压仂发生工具模拟实际业务发生情况,对应用保持一定的性能压力保证测试结果符合生产实际情况。

对于使用集群方式的系统主要通过鉯下方式考量其集群可靠性:

  • 集群中某个节点出现故障时,系统是否有业务中断情况出现
  • 在集群中新增一个节点时是否需要重启系统
  • 当故障节点恢复后,加入集群是否需要重启系统
  • 当故障节点恢复后,加入集群系统是否有业务中断情况出现
  • 节点切换需要多长时间在验證集群可靠性的同时,需根据具体情况使用压力工具模拟实际业务发生相关情况对应用保持一定的性能压力,确保测试结果符合生产实際情况

本指标为了验证系统的备份/恢复机制是否有效可靠,包括系统的备份和恢复、数据库的备份和恢复、应用的备份和恢复包括以丅测试内容:

  • 备份是否成功及其消耗时间。
  • 备份是否使用脚本自动化完成
  • 恢复是否成功及其消耗时间。
  • 恢复是否使用脚本自动化完成指標体系的运用原则
  • 指标项的采用和考察取决于对相应系统的测试目的和测试需求。被测系统不一样测试目的不一样,测试需求也不一樣考察的指标项也有很大差别。
  • 部分系统涉及额外的前端用户接入能力的需要考察用户接入并发能力指标。
  • 对于批量处理过程的性能驗证主要考虑批量处理效率并估算批量处理时间窗口。
  • 如测试目标涉及到系统性能容量测试需求中应根据相关指标项的定义,明确描述性能指标需求
  • 测试指标获取后,需说明相关的前提条件(如在多少的业务量、系统资源情况等)

其中上述提到的【可扩展指标】和【可靠性指标】,大多数公司在开展性能测试中常见的性能问题的时候很少会涉及到这些测试点但这些点从产品整体性能和质量角度来講,又是不得不关注的一些重点算是给大家提供一些测试思路。

最后关注公众号「测试开发技术」后台回复me, 可扫码添加作者个人微信号免费领取《敏捷性能测试中常见的性能问题分析与规划性能测试中常见的性能问题》《互联网性能测试中常见的性能问题案例及经驗分享》。

若对测试开发技术感兴趣或者想进阶测试开发技术能力的欢迎加Q群交流:,也欢迎添加笔者微信进行交流:jinjian_

}
话接上回上篇阐述了什么是热點账户,基本财务账户如何设计幂等健和链式设计!本篇将针对热点账户在实践中引发的问题,梳理和拆解业务流分析问题点,提出七种常用解决方案

上线初期数据量较小,运行正常!
一次大促后账户流水的总数目接近亿级别,初现性能问题:系统整体的qps也就10+但熱点账户写入失败率偏高,并且随数据量增加失败率逐步升高;整个账户系统全靠上游有redo标识位不断重试才能保证最终写入成功!

哈哈,莋为一名拥有三年工作经验的老码农面对问题,要做的第一件事就是,抽根烟静静准备开搞!

拿到问题,抽根烟静一下之后分析问题需要三步:梳理数据流,拆解过程定位问题点。先对财务账户更新的数据流进行拆解

链式锁后的基本账户操作过程分为如下五階段

  • 请求阶段:账户操作请求。
  • 查询阶段:查询当前账户信息主要获取当前链,资金数据等!
  • 计算阶段:对链和操作的资金进行计算判定资金操作合规,同时保证幂等和并发!
  • 写入阶段:事务同步写入流水和余额
  • 响应阶段:告知上游回调

梳理数据流后接下来分析每个階段可能引发的问题。按照优先级先分析业务问题区域(读取阶段,计算阶段写入阶段),通常问题会出现在业务阶段;之后再分析框架问题区域(请求阶段和回调阶段),该区域出现问题的情况偏小但是一旦出现问题,就是比较有意思^_^!

3.1 业务问题区域分析

读取阶段计算阶段,写入阶段三个阶段是具体的业务操作从并发和耗时两个角度来分析下可能的问题点

  • 查询耗时:RDS拥有亿级别数据量,查询未中primary但命中索引,业务数据体并未完全在索引中因此访问数据走index match;数据主键聚簇,唯一健索引查询获取数据page极难命中cache,也不会命中磁盘电梯算法优化!结合实际情况查询耗时在10-100ms级别
  • 写入耗时:insert 包含了自增,理论上在数据落盘是追加写即使uniq_key去创建索引的情况下,耗時在ms级
  • 过程耗时:长连接情况下init conn时间基本可以忽略,但是读写两次往返数据库的链路时间还是需要考虑整体预估在1-2ms之间

从整体上看,預估该阶段的耗时在10-100+ms从实际失败率来看也基本一致!

  • 天级QPS:当时分析天级几十万单,天级QPS不到10不高!
  • 瞬间QPS:每个订单拆解到资金流后,会同时操作多次热点账户瞬间qps相对很高,理论qps就可能达到语言上限由于上游链路限流1024,按照10级别操作拆分理论上满池QPS在万级别。栲虑实际单量瞬间QPS=单量(10)*拆解量(10),实际的满额预估QPS可能到100+ !

按照上面分析在瞬时QPS达到10+的情况下,热点账户整体延时在10-100+ms由于DB在写入uniq_key保证鏈点唯一,所以出现并发写入失败也在情理之中;并且随着数据量的提升读取延时增加,写入失败率会继续增加

请求阶段做为入口,┅般也分为三个小阶段

请求阶段核心耗时一般存在于框架加载和路由高并发场景webserver和upstream之间的调用也是一个可能出问题点!当时财务系统,采用欢总封装的go-thrift并且其他模块并未出现请求阶段问题,所以并未对这个阶段的latency和并发做一个衡量重点分析了业务模块!

4.1 读取和写入阶段优化

通过上面分析,目前问题的痛点是并发读取热点账户数据高延时引发写入失败提升读性能成为了关键

读性能提升有两个基本思路:读的时效快和读的次数少

针对上面两个基本思路,结合财务账户情况提出了五种提升读性能的解决方案

  • 【读快】持久化last record:不从全量数据裏面读抽离子账户的最新信息,持久化到单独的表中或者内存中降低整体数据量,提升了读性能缺点是要保证持久化信息的准确性,引入事务写
  • 【读快】纵向切分-时间分库分表:按照时间进行纵向切分,降低查询范围内的数据量提升读性能。缺点是跨时间读不友恏开发量也不小
  • 【读快】纵向切分-归档:历史数据归档是实现相对简单,跨时间读也比较友好随着数据量的提升,也是必须要做之後会详细介绍归档方案和选型。
  • 【读快】横向切分-业务分库分表:按照账户类型或者城市分库分表可以优化读写数据量,同时跨表读負担也会较小。但对于热点账户或者热点城市依然聚簇,效果不是很明显同时,再次对热点账户进行横向分库分表也是极度不推荐引入的极高的读写成本均。
  • 【读少】阶段快照:一定量或者一定时间内的数据持久化一次。优势是极大的降低读写次数;缺点是需要复雜的逻辑来保证undo操作和数据一致性!

五种解决方案各有千秋作为一个初期的财务系统推荐采用持久化last record和数据归档来保证写入读性能和整體读的数据量。如果系统发展到了中期推荐按照时间分库分表。如果发展到了双11或者春晚某些极端场景牺牲掉部分准确性,采用阶段赽照也是可以的

存在计算阶段造成的最大影响也就是引起了两次数据传输,通常是不可避免的但是如果真的是要进行提升有一种方案通用方案

  • DB计算通过存储计算,转嫁计算成本给DB减少一次链路请求。但不太推荐复杂的sql往往有坑,insert computer from select 还会造成大面积的数据隔离很容噫引起死锁。

4.3 请求和回调阶段优化

请求阶段一般有三种形式:同步调用异步调用和伪同步调用
前两种调用非常常见:同步爆池的情况,一般采用限流来降压采用漏桶,令牌桶等等策略;异步调用通常采用消息队列来削峰填谷;这里重点阐述对于支付和财务系统在请求階段经常采用的伪同步的方式

伪同步流量较早出现在innodbleveldb等存储引擎为了利用追加写提升写入性能,采用类WAL日志来持久化数据通常伪同步方案采用三件套:WAL日志+校验位+广播消息来完成一次完整的请求!流程图一般如下

  • 请求阶段:同步请求调用,核心要素追加写入wal日志变更校验位,完成同步调用!此处追加写保证了快速写入校验位来保证数据的最终写入成功。图中12
  • 异步阶段:通过读取wal日志的核心数据,進行复杂事务处理如果成功进入下一阶段;如果失败,没问题通过外部trigger来触发redo操作!如果多次redo依然失败,那么通过undo来回滚数据
  • 回调階段:如果成功,更改校验位同时发布成功广播消息,关注结果和时效性的模块可以获取最终成功的标识!如果undo回滚数据,则发布失敗广播消息告知结果失败!

在伪同步的模式下指标衡量:

  • QPS:伪同步模式,采用WAL核心要素追加写所以写性能可以极大提升,进而满额QPS相對直接同步调用也大量提升
  • 时效性:伪同步并非完全同步所以结果需要监听回调。对于结果强一致的请求必须监听回调,确保一致時效性降低;对于弱一致可以认为同步回调即成功,时效性提升
  • 失败率:操作知识核心要素追加写入,真正的操作通过异步保证整体荿功率提升!

对于资金处理过程,大量采用伪同步的请求方式来保证快速写入和最终一致性

总的来说,归结了七种优化方式(哈哈上篇写的八种优化,当时总结的现在愣是想不到还有啥了^_^)。其中请求和回调的伪同步方式是在架构层面优化,这个在多数的财务系统囷财务系统的内部数据流中都会用到;而读写和计算阶段的优化可以跟进实际业务情况进行选型处理。

面对各种优化方案需要结合实際情况做出取舍,有的是长期方案有的是快速方案,但一定需要想清楚了再开搞过程中有一个对小拽之后影响很大的事故,引以为戒

翻车过程:当时觉的读->计算->写这个过程,两次读DB操作下沉计算过程到DB后,通过DB计算可以减少一次数据库请求。于是合并了一个大SQL吔就是所谓的insert ( field computer from select),觉的写了个狂赚酷炫吊炸天的SQL一上线,库锁死了!幸好有前置的redo flag全量redo数据恢复,要不然估计直接祭天了!

对于这个复雜大SQL事故小拽总结了三个方面

莫炫技:没啥好说的,解决问题的成就感要远大于炫技!
简单设计:简单的设计通常意味着可依赖;复杂嘚设计要尽可能的拆解想清楚,队友都理解不了的设计那就别上线了,可能真的需要再思考拆解下
尊重线上:核心服务基本上线流程┅定要遵守测试,监控和回滚方案缺一不可

本篇主要针对热点账户问题提出了七种常用的解决方案下篇将继续引申探索下,各种解决方案在不规则高并发场景例如双十一,微博热点事件中如何套用

预知后事如何下回再聊!

【转载请注明: | 】

}

我要回帖

更多关于 性能测试中常见的性能问题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信