性能调优的关键指标,你都知道吗?

在业务开发中,在讨论一个服务的性能时,经常会提到一些性能相关的指标,如tps,qps,rt并发线程等。虽然这些指标经常被挂在嘴边,但是每个指标的含义,能比较细致的说出来的,却不多,不信可以尝试回答一下下面的几个问题,没准可以get到新技能

1.到底什么是qps?

2.TPS中的T是什么意思?

3.影响TPS的因素?

4."平响"是怎么计算的?

到底什么是qps

QPS 一开始是用来描述 MySQL 中 SQL 每秒执行数 Query Per Second,所有的 SQL 都被称为 Query,也就是说这里的q是指sql语句。但是在其他场景中,也会经常使用qps。比如,在压测工具中,我们经常使用qps来描述系统的吞吐量;在web服务场景中,使用qps来描述,服务器每秒收到的请求数,这俨然就和tps混在一起了。虽然qps用的很乱,但是在一个团队中,当提到qps的时候,大家都知道说什么,也就没有人就较真q到底是什么了。

TPS中的T是什么意思

TPS的原意是系统每秒处理的事务数也就是 Transaction per second的翻译。说到TPS,就不得不详细说一下这里面的T。
我们都知道 TPS 在不同的行业、不同的业务中定义的粒度都是不同的。所以不管你在哪里用 TPS,一定要有一个前提,就是所有相关的人都要知道你的 T 是如何定义的。但是很多时候T是没有一个统一的定义的,那就意味着,你想怎么定就怎么定。通常情况下,我们会根据场景的目的来定义 TPS 的粒度。如果是接口层性能测试,T 可以直接定义为接口级;如果业务级性能测试,T 可以直接定义为每个业务步骤和完整的业务流。也就说,T的定义也结合业务场景。我们用下面一个示意图来说明一下:
在这里插入图片描述

上图的流程大致为:客户端调用服务端接口1。接口1依赖接口2和接口3.

对于上图,如果我们要测试每个接口的TPS的话,那么这里的T就是每个接口,TPS就表示,一秒内,每个接口可以处理的请求次数。

如果我们要测试整个业务的TPS的话,那么接口1,2,3就在一个T中了,那么业务的TPS,就是一秒内,系统可以处理客户端请求的次数。

但是有时候,测试系统的TPS时,还要分析系统的架构设计,比如说,接口1对接口2和3的调用方式是异步的,那么此时整个业务,可以只看成接口1,此时业务的TPS,数值上可能会更高一些,但是对接口2和接口3也需要进行TPS的分析。

在大部分的性能测试中,TPS都是一个非常重要的指标,因为它通常用来描述一个系统吞吐量的大小,当一个系统的TPS比较大时,说明该系统的的吞吐量比较大,对一个系统性能调优的手段可能会有很多,但是最终的目标就是提高系统的TPS。

影响TPS的因素

通过上面的分析,我们知道了TPS对于一个系统的重要性,系统的调优都是奔着提高系统TPS这个目标去的。但是影响TPS的因素又有哪些呢?

通常情况下影响TPS的因素有两个,事务处理时间系统中事务处理的并发度

通常来说,事务处理时间描述的是服务端处理一个事务的开始时间,到这个事务处理完毕的结束时间之间的时间间隔。
如下图所示:
在这里插入图片描述

如果事务表示的是每个接口,那么M1_T2-M1_T1就是接口1的事务处理时间,M2_T2-M2_T1就是接口2的事务处理时间,M3_T2-M3_T1就是接口3的事务处理时间。

而对于对于用户请求处理的事务来说,事务处理时间就是M1_T2-M1_T1(同步调用的场景下,该时间间隔包含了接口2和接口3的处理时间)。计算方式非常直接简单。但是,我们要知道,这个时间包括了后面一连串的链路。事务处理时间的概念简单至极,但是,对于事务处理时间过长这个问题的定位,就比较复杂了,因为M1_T2-M1_T1这个事务的处理时间,是很多小的事务处理时间组成的。所以要分析一个大事务的处理时间长的问题,就要统计出每个小事务的处理时间,找出响应时间比较长的那个事务,然后对其进行分析。
好在现在有很多链路监控工具和一些 Metrics统计的工具,会记录真个调用链路中,每个方法执行耗时,可以让我们一眼就看出处理时间比较长的事务。

为了提高系统的TPS,我们可以通过技术手段,减少事务的处理时间,提高单位时间内,单个线程处理的事务个数。

除此之外,增加事务处理线程个数,也可以在一定范围内,提高系统的TPS。这里之所以说在一定范围内对TPS进行提供,主要是因为线程个数设置的过大,反而会影响系统的性能,因为线程过多的情况下,cpu的大部分时间都花在线程的上下文切换了,反而增加了每个事务的处理耗时。线程个数在一定范围内的前提下,TPS的计算方式为:
tps=工作线程数*(1000ms/事务处理耗时)。所以影响TPS的因素主要是事务的处理时间和事务的处理线程数。

"平响"是怎么计算的

很多时候大家都会把事务的处理时间响应时间混在一起。有时候两者在数值上可能是相同的,但是,两者却是两个完全不同概念,两者的差异主要体现在面向的对象不同,响应时间主要面向客户端来说的,而事务处理时间主要面向服务端来说的。

响应时间又称为RT,也就是 response time的缩写。它用来描述一个请求发起时刻到收到响应时刻之间的时间间隔,也就是上面第二张图的T2-T1。

为了更形象的说明两者的差异,我举两个具体的例子:
1.在一个网路延迟比较大的环境中,对于客户端来说,一个请求的响应时间很长,但是服务端对每个请求的处理都很快,处理时间都比较短。

2.假如客户端对请求的响应时间比较敏感,响应时间要限制在50ms内。服务端对请求的处理也比较快,对于每个请求的处理可以控制在1ms内完成,但是如果服务端对请求的处理是串行的情况下,某一时刻有100个请求同时到达服务端,在不考虑网络延迟的情况下,仍会有近50个请求的响应时间大于50ms。

在实际的开发工作中,统计每个请求的响应时间,并没有太大的意义,在分析请求的响应时间时,通常看的是请求的平均响应时间,也就是所谓的"平响"。

平响的计算方法就是所有事务响应时间的平均值。

如果此时有人问你,某个事务的处理时间稳定为t1,那这个请求的平均响应时间是多少,可能大部分人会觉得:每次请求处理都是t1,平均响应时间,就是n*t1/n=t1。如果你也觉得是这样计算的话,那么你就掉坑里了,因为计算系统平均响应时间还要考虑另外一个因素——系统事务处理并发数。

这里我再举个例子:假设某个系统处理某个事务的耗时t1,且这个系统只有一个线程来处理该事务。T时刻,系统收到的3个客户端请求,由于系统是对请求的处理是串行的,那么第一个请求的响应时间为(T+t1-T)=t1,第二个请求的响应时间为(T+t1+t1-T)=2t1,第三个请求的响应时间为(T+t1+t1+t1)-T=3t1。那么此时,对于这个事务的平均响应时间就是(t1+2t1+3t1)/3=2t1,而不是t1。这里平均响应时间是2t1的根本原因就在于:请求到达服务器后,不一定会被立即执行,可能需要等待其他请求的处理,这也是响应时间和处理时间的差异所在。

如果服务器的配置比较高一些的话,我们开启3个线程来同时处理以上的三个请求的话,那么以上3个请求响应时间分别是t1,t1,t1。那么平均响应时间就是(t1+t1+t1)/3=t1。所以响应时间都是大于等于请求的处理执行时间的。

系统的平响和TPS一样,都可以比较系统全面的描述系统的性能。TPS越高系统吞吐量越大,性能越强。而在某个TPS下,平响越低,也可以说明这个系统的性能越强。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
oracle动态性能表 学习动态性能表 第一篇--v$sysstat 2007.5.23   按照OracleDocument中的描述,v$sysstat存储自数据库实例运行那刻起就开始累计全实例(instance-wide)的资源使用情况。 类似于v$sesstat,该视图存储下列的统计信息: 1>.事件发生次数的统计(如:user commits) 2>.数据产生,存取或者操作的total列(如:redo size) 3>.如果TIMED_STATISTICS值为true,则统计花费在执行操作上的总时间(如:CPU used by this session) v$sysstat视图常用列介绍:  STATISTIC#: 标识  NAME: 统计项名称  VALUE: 资源使用量 该视图还有一列class-统计类别但极少会被使用,各类信息如下: 1 代表事例活动 2 代表Redo buffer活动 4 代表锁 8 代表数据缓冲活动 16 代表OS活动 32 代表并行活动 64 代表表访问 128 代表调试信息 注意:Statistic#的值在不同版本中各不相同,使用时要用Name做为查询条件而不要以statistic#的值做为条件。 使用v$sysstat中的数据   该视图中数据常被用于监控系统性能。如buffer cache命中率、软解析率等都可从该视图数据计算得出。   该视图中的数据也被用于监控系统资源使用情况,以及系统资源利用率的变化。正因如此多的性能数据,检查某区间内系统资源使用情况可以这样做,在一个时间段开始时创建一个视图数据快照,结束时再创建一个,二者之间各统计项值的不同(end value - begin value)即是这一时间段内的资源消耗情况。这是oracle工具的常用方法,诸如Statspack以及BSTAT/ESTAT都是如此。   为了对比某个区间段的数据,源数据可以被格式化(每次事务,每次执行,每秒钟或每次登陆),格式化后数据更容易从两者中鉴别出差异。这类的对比在升级前,升级后或仅仅想看看一段时间内用户数量增长或数据增加如何影响资源使用方面更加实用。   你也可以使用v$sysstat数据通过查询v$system_event视图来检查资源消耗和资源回收。 V$SYSSTAT中的常用统计   V$SYSSTAT中包含多个统计项,这部分介绍了一些关键的v$sysstat统计项,在调优方面相当有用。下列按字母先后排序: 数据库使用状态的一些关键指标:  CPU used by this session:所有session的cpu占用量,不包括后台进程。这项统计的单位是百分之x秒.完全调用一次不超过10ms  db block changes:那部分造成SGA中数据块变化的insert,update或delete操作数 这项统计可以大概看出整体数据库状态。在各项事务级别,这项统计指出脏缓存比率。  execute count:执行的sql语句数量(包括递归sql)  logons current:当前连接到实例的Sessions。如果当前有两个快照则取平均值。  logons cumulative:自实例启动后的总登陆次数。  parse count (hard):在shared pool中解析调用的未命中次数。当sql语句执行并且该语句不在shared pool或虽然在shared pool但因为两者存在部分差异而不能被使用时产生硬解析。如果一条sql语句原文与当前存在的相同,但查询表不同则认为它们是两条不同语句,则硬解析即会发生。硬解析会带来cpu和资源使用的高昂开销,因为它需要oracle在shared pool中重新分配内存,然后再确定执行计划,最终语句才会被执行。  parse count (total):解析调用总数,包括软解析和硬解析。当session执行了一条sql语句,该语句已经存在于shared pool并且可以被使用则产生软解析。当语句被使用(即共享) 所有数据相关的现有sql语句(如最优化的执行计划)必须同样适用于当前的声明。这两项统计可被用于计算软解析命中率。  parse time cpu:总cpu解析时间(单位:10ms)。包括硬解析和软解析。  parse time elapsed:完成解析调用的总时间花费。  physical reads:OS blocks read数。包括插入到SGA缓存区的物理读以及PGA中的直读这项统计并非i/o请求数。  physical writes:从SGA缓存区被DBWR写到磁盘的数据块以及PGA进程直写的数据块数量。  redo log space requests:在redo logs

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值