暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

「测试」工具美眉之性能指标TPS和RT

将咖啡转化为程序的工具人 2021-09-08
1592

工具美眉在介绍那么多性能指标之前,先带大家看张图:

这张图的横坐标是并发用户数,纵坐标分别是三个指标:(Utilization)资源利用率、(Throughput)吞吐量、(Response Time)响应时间。


响应时间——用户从发出请求到得到响应之间的总耗时,它由网络传输耗时、服务处理耗时等多个部分组成。


拿web浏览器的服务对响应时间进行说明:

从这张图上看到一个由web发出的请求的响应时间由三部分组成:

  • Resource Scheduling

    浏览器的资源调度,是否有更高优先级的请求,浏览器安排的排队时间

  • Connection Start

    客户端与服务器之间建立连接的时间,包含了DNS域名解析时间、TCP握手时间、SSL认证时间

  • Request/Response

    浏览器发出请求的时间+TTFB(浏览器收到首字节的时间)+整个response接受完的时间


吞吐量——单位时间内系统处理的客户请求数量,吞吐量的常用量化指标有QPS、TPS等。


并发用户数——一时刻与服务器有交互的在线用户数。


图中三条曲线分别代表了随着并发用户数增加,资源利用率、吞吐量和响应时间的情况,分别分割成了三部分:(Light Load)轻负载区,(Heavy Load)重负载区和(Buckie Zone)塌陷区。


图中1标志的位置,代表了资源利用率接近饱和;2标志的位置,代表了吞吐量开始下降;3标志的位置,代表了响应时间变慢,开始影响用户体验。


从上图中三个区域的分割线,我们也能大致得出最优并发用户数和最大并发用户数,所谓最优并发用户数指的是资源利用充足没有资源的空闲或浪费,而响应时间又很快,不影响用户体验,但是当系统的负载达到最大并发用户数后,响应时间就超过了用户可以忍受的最大限度了。


这是性能测试中一个比较经典的图,只能用来作为参考,现实中的情况并不一定如上图那样,响应时间也并不一定是在塌陷区突然上升,有可能在重负载区已经开始增加。吞吐量和响应时间随着并发用户数的增加,也一定会此消彼长。所谓的性能,其实是负载、吞吐量、可接受的响应时间和资源利用率之间的一种平衡。


我们常说的性能指标,通常可以分为两类:技术指标+业务指标。

例如:

业务指标:系统要支持同时1000万人在线。

技术指标:系统能够支持1万TPS。


技术指标又可以分为:时间指标+容量指标+资源指标。

  • 时间指标简单来说可以是平均响应时间或百分位响应时间。

  • 容量指标指的是单接口的容量。

  • 资源利用率指标指的是

    • 操作系统相关的资源:CPU、IO、Mem、Disk、Network等

    • JVM相关的资源:Load Average 、GC、FGC次数等

可以看到有非常多种类的技术指标,而所有的技术指标都是通过业务指标换算而来的,换句话说,如何将系统要支持同时1000万人在线的业务指标,转化成系统能够支持1万TPS的技术指标。


首先我们先要搞清楚的是什么是TPS,也就是每秒事务数,它反映了一个系统的处理能力。我们会根据不同的场景来定义TPS的粒度,例如单个接口的性能测试,这个T可以认为是接口级的,而对于整个业务的性能测试,T可以认为是整个完整的业务流,例如:落单、支付都可以看作两个单个接口,而网购可以看作一个完整的业务流,TPS可以看作是每秒处理的业务数,或者每秒处理的某个接口或交易数。


我们假定用二八法则,计算一下刚才的那个例子,假设1000万用户下午1点到3点间会同时在线进行操作,而且按照80%的业务量在20%的时间里完成,按照一定的业务统计发现,这个业务的并发度控制在5%-1%之间。

    业务量=1000万个,并发度是5%,时间=2x60x60=7200秒
    TPS=并发数/响应时间
    TPS=(5%*业务量*80%)/(20%*时间)=0.05*1000万*0.8/(0.2*7200)=278TPS

    二八原则计算的结果并非在线并发用户数,而是系统要达到的处理能力(吞吐量),而且现实中大都数情况并不是例子中的二八原则,需要具体问题具体分析。

    如果这整个业务流的响应时间是100ms,那并发线程数是 278TPS/(1000ms/100ms28 个(并发线程)


    通常来说,因为引入了缓存队列等机制,一个系统的最大用户数应该远大于并发用户数。

    从上述的计算中可以看到,如果想提高系统整体的tps可以从两方面入手:

    1)增加并发数

    • 比如增加tomcat并发的线程数

    • 增加数据库的连接数,预建立合适数量的TCP连接数

    • 后端服务支持横向扩容,加机器满足更大流量要求

    • 调用链路上的各个系统和服务尽量不要单点,要从头到尾都是能力对等的,不能让其中某一点成为瓶颈。

    • RPC调用的尽量使用线程池,预先建立合适的连接数

    2)减少响应时间

    • 引入缓存,缩短响应时间

    • 流量消峰,提前返回错误

    • 减少调用链

    • 优化数据库,建立索引


    今天的学习就到这里,如果这篇文章对你有所帮助,请点赞和转发哦👍

    文章转载自将咖啡转化为程序的工具人,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论