目前腾讯WeTest服务器性能测试已经正式对外开放, 点击 链接:http://wetest.qq.com/gaps/ 立即体验!

导语   这篇文章其实憋了很久,最初仅仅是对吞吐量计算的个人兴趣研究,从理论建立到论证,因为担心一个不好被挑战的体无完肤,又各种查资料,找大牛讨论,然后又推倒重来,扩展了些内容,在这过程中,个人收获颇多,理清一些对性能测试理解的误区,些许心得体会总结如下,谈不上深刻,尽量朴实。

前言

随着部门业务的拓展,我们有了很多性能测试的机会,但在实战中,慢慢发现,我们对性能测试的理解并不如自己想的那么清晰,对基本概念和理论的混淆,导致对测试结果的不够自信,测试过程也常会面临质疑。

所以这一次,我们不说性能测试怎么做,先一起梳理下性能测试的基本理论,分析这些理论如何在压测工具中产生影响。

系统性能描述

描述一个系统的性能从来不是一句话或是一个数值的事。在IEEE的定义中:性能是系统或组件在给定约束中实现的指定功能的程度,诸如速度、正确性、内存使用等。

所以性能测试报告中,对系统性能的描述应该是多方面的,如:执行效率、稳定性、兼容行、可靠性、可扩展性容量等;其中,执行效率通过并发用户数、响应时间、吞吐量、成功率、资源消耗综合体现。

并发测试

性能测试有:负载测试、压力测试、配置测试、并发测试、容量测试、稳定性测试。其中,并发测试是测试多个用户同时访问同一个应用、同一个模块或者数据记录时是否存在死锁或者其他性能问题。

在实际的压测中,我们基本上都是设置多个并发,再进行负载测试、压力测试等,因为现实中,我们的系统就是面对多个用户的同时使用,并且,并发用户的数量,直接影响着系统资源的消耗,例如cpu、mem、网络连接、带宽,甚至于系统内部逻辑。

并发怎么看?

所谓并发,它的特点是“并行”和“同时”。

LoadRuner的并发很好理解,就是虚拟用户数。因为LR有个集合点,可以在所有虚拟用户初始化且到达集合点后,再一起执行后续操作,从而达到同时且并行的效果。

但目前在后台性能测试,我们自己开发的工具大多不带集合点功能,这时候使用者对并发的理解就会有点混乱。下面以长连接压测为例:

最简单的一种,一个单进程单线程send工具,启动一次连续发m个包,这种其实属于单并发,请求串是一个接一个串行到达压测对象,一般都要再简单封装下,类似多进程并发:

注意这样还是串行执行,下面这种才能起到并发的作用。

另一种是单进程多线程模式,可以配置起多个线程,一个线程发起一个连接到达压测对象,n个线程就有n个连接,

还有一种,连接池模式,线程与连接数并不一一对应,维持工具到压测对象的连接数不变,线程们从连接池挑选空闲的连接持续发送请求。
   

以上三种情况,假设所有线程极致同步且系统性能足够,那么同一时间内(或者说同一瞬间),应该是有等同线程个数的请求同时到达系统,并同时被处理完再一起返回,此时线程就是并发,线程数就是并发数,这里理解应该没有问题。

但实际上,所有的并发不可能做到完全同步,压测过程中由于各种影响,比如:各线程初始化速度不一样,连接数不够,处理速度不一样等,导致在并行节奏上相互有了偏差, 这种现象在系统接近性能瓶颈时,会更加突出。所以会有同学疑问,这还能叫“并发”吗? 这里引入“狭义并发”和“广义并发”的概念。

“广义的并发实际上是在一个时间内操作事务的虚拟用户,而狭义的并发指的是单位时间内向系统发起请求的虚拟用户,前者是“存在”,后者是“请求”,勿容置疑,压力不仅仅受成功发出请求的用户带来的压力,同时也受“存在”的用户影响。”

http://www.cnblogs.com/pohome/articles/2073283.html

这样看来,工具中的线程数设置,更偏像是广义并发,代表着在压测时间段内虚拟用户总数,这也是并发原始值。而在后续的压测过程中,在单位时间内,并发数可能会动态变化,这里是狭义并发。

当工具产生的压力远未到系统性能瓶颈时,理论上,狭义并发=广义并发=工具线程数;当压力增加,系统响应时间增长,部分线程的请求处理正常,部分线程可能请求超时,那么同一单位时间内,同时向系统发起请求的用户数就不等于线程数了。

那么我们如何实时掌握压测过程中可能变化的并发?

《Method for Estimating the Number of Concurrent Users》一文介绍了一种并发估算法(网上有很多相关资料,这里不再累述):

C:并发

n:压测时间段内所有的请求数

L:平均响应时间

T:压测总时长

这里注意:L(平均响应时间)≠ T(总时长)/ n(总请求)

压力是什么?

压力就是并发在单位时间内对压测对象的请求数。在我们的压测工具中,有一个配置项专门用来设置压力,可能是所有线程产生的总压力,也可能是单个线程产生的压力。

有些同学会在这里纳闷,为什么我设置了发送10w笔/s的请求,系统吞吐量的计算只有1w笔/s,是不是工具有问题?这里是因为混淆了压力和性能。

“压力不等于性能,压力只是检验性能的一种手段,对一个性能良好的系统,在一定的压力下,应该可以保持正常运转,如果超过负荷,则应该分流或化解压力,这也是我们需要检验的”

http://www.cnblogs.com/pohome/articles/2073283.html

例如:100个并发,1s内发送1w笔请求,如果系统的吞吐量计算大于或等于1w笔/s,说明系统承受住100个并发,1w/s的压力,我们可以增加压力继续测试,直到出现性能拐点;如果系统的吞吐量计算是5k笔/s,则说明,如果我们需要系统应付100个并发,1w/s的压力,解决方案要么提升系统性能一倍,要么扩容一台分流压力。

要特别注意:压力是由工具制造,工具的最大性能决定施加的最大压力。我们在测试过程中曾经遇到压测系统还没到极限,工具已经到瓶颈的情况,这时候得到的压测数据是错误的。

吞吐量如何计算?

我们在压测工具制作中,一直存在一个争议——吞吐量的计算。

在性能测试中,吞吐量的计算有两种常见的公式:

公式1: 吞吐量=并发数/平均响应时间

公式2: 吞吐量=请求总数/总时长

公式1、2大家应该都接触过,虽然看上去不一样,其实理论上都是ok的。首先我们可以从C = nL / T 推导:

并发=请求总数*平均响应时间 / 总时长

=》并发 / 平均响应时间 = 请求总数 / 总时长

=》公式1 = 公式2

然后我们构建三组模型进一步论证:

第一组模型

一共有4个线程,同时发了4笔请求,其中3笔耗时1s,一笔耗时2s,整个过程一共耗时2s。

公式1:

平均响应时间 = (1+1+1+2)/ 4= 1.25s ;

并发 = nL/T =4*1.25/2 =2.5

吞吐量 = 2.5 / 1.25 = 2 笔/s

公式2:

吞吐量 = 总笔数/总耗时 = 4/2= 2 笔/s

第二组模型

一共有4个线程,同时发了4笔请求,4笔请求耗时均为1s,1s内全部发送完毕。

公式1:

平均响应时间 = (1+1+1+1)/ 4= 1s

并发 = nL/T =4*1/1 =4

吞吐量 =  4 / 1= 4 笔/s

公式2:

吞吐量 = 总笔数/总耗时 = 4 / 1= 4 笔/s

第三组模型

一共有4个线程,4笔请求耗时均为1s,但线程发送出现不同步现象,一共持续1.5s完成全部:

公式1:

平均响应时间 = (1+1+1+1)/ 4= 1s

并发 = nL/T =4*1/1.5 =2.67

吞吐量 = 2.67 / 1= 2.67 笔/s

公式2:

吞吐量 = 总笔数/总耗时 = 4 / 1.5 = 2.67 笔/s

从我们构建的模型上看,两个公式计算的结果是相等的。但是,这种平衡是建立在并发稳定的基础上,并发如果变化,结果就会有差异。下面我们看一组真实的压测数据

从上图中看出,实际压测时,两个公式还是会有些微差别,这就是因为我们本来预想并发应该=工具线程数,但在压测过程中,实际并发发生了变化,我们再反推下实际的并发数

计算出的实际并发确实稍低于工具线程数。

结论

1、 在单接口压测时,我们用“请求总数/总时长”得到吞吐量;然后再用“吞吐量*平均响应时间”得到实际并发,此举可用来观察系统实际承受的并发;

2、 在多接口压测时,由于短板效应,同一个流程中的所有接口获得的请求总数和总时长都一样,显然“请求总数/总时长”计算各个子接口的吞吐量不合适,所以改用“并发/平均响应时间”,其中的并发数应在压测工具中埋点统计,不可简单使用工具线程数。

结语

在性能测试平台的开发中,为了测试结果更接近现实,我们在吞吐量计算上改过三个版本,小伙伴们也有过几次激烈的讨论,正是对这种小细节的不断纠缠,我们对性能测试的认识也在不断刷新,原本以为正确的地方被颠覆,不理解的环节逐渐清晰,越琢磨越会发现性能测试的有趣。

如文中观点有理解不到位的地方,欢迎大家一起探讨指正。

参考文献

性能测试解惑之并发压力

http://www.cnblogs.com/pohome/articles/2073283.html

软件性能测试流程简介

http://wenku.baidu.com/link?url=9vfFqnNCsJ3Nv0cAl8_nb9SefIN17TFskt02E0yu75Zk6XVcHEz21rfrKrSfIFi7WhSqOWjsvz1k9fnVZ8SNn1GFbDpzjIzOWjBID1NfmOC

软件性能设计与评价

http://www.doc88.com/p-331430307121.html

Method for Estimating the Number of Concurrent Users

http://wenku.baidu.com/link?url=w6eahwDiL_7Fyv5ekbpDGj946jICLtWyc7PphU63t7Mu8u84jdlGIMJSpBaxySUH49bU648a-1Y_xap9iSR4vuO1bMdYBOLhYdntDzyrRB7


目前腾讯 WeTest服务器性能测试已经正式对外开放:

体验地址:http://wetest.qq.com/gaps/

如何使用简单模式:http://wetest.qq.com/help/documentation/10094.html

如何分析报告:http://wetest.qq.com/help/documentation/10099.html

常用测试指标:http://wetest.qq.com/help/documentation/10098.html

早知道早幸福——从压测工具谈并发、压力、吞吐量相关推荐

  1. 【腾讯优测干货分享】从压测工具谈并发、压力、吞吐量

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/580d914e07b7fc1c26a0cf7c 前言 随着部门业务的拓展,我们有 ...

  2. oracle 压测工具 ld,Oracle压力测试工具使用说明

    博客文章除注明转载外,均为原创. 1.下载安装 Download: 2.安装 ./HammerDB-2.20-Linux-x86-64-Install 安装完成后,进入目录 cd  HammerDB- ...

  3. oracle 压测工具 ld,ORACLE压力测试工具

    Swingbench for oracleRAC使用方法图解 1 Swingbench 简述 1.1 概述 这是Oracle UK的一个员工在一个被抛弃的项目的基础上开发的.目前稳定版本2.2,最新版 ...

  4. 实现一个简单的压测工具

    公司开发了一些服务器程序:上生产前需要进行压力测试,测试点包括:并发数.响应时间.吞吐量等指标.领导说,能不能仿照LoadRunner实现一个简单的压测工具(并发数在10000以上,结果指标以曲线图的 ...

  5. 基于python的压测工具_Python Locust性能测试简介及框架实践

    Locust(俗称 蝗虫), 一个轻量级的开源压测工具,用Python编写.使用 Python 代码定义用户行为,也可以仿真百万个用户: Locust 非常简单易用,是分布式,用户负载测试工具.Loc ...

  6. Http压测工具wrk使用指南【转】

    用过了很多压测工具,却一直没找到中意的那款.最近试了wrk感觉不错,写下这份使用指南给自己备忘用,如果能帮到你,那也很好. 安装 wrk支持大多数类UNIX系统,不支持windows.需要操作系统支持 ...

  7. Http压测工具wrk使用指南

    用过了很多压测工具,却一直没找到中意的那款.最近试了wrk感觉不错,写下这份使用指南给自己备忘用,如果能帮到你,那也很好. 安装 wrk支持大多数类UNIX系统,不支持windows.需要操作系统支持 ...

  8. 精准容量、秒级弹性,压测工具 + SAE 方案如何成功突破传统大促难关?

    作者 | 代序 阿里云云原生技术团队 本文整理自<Serverless 技术公开课>,"Serverless"公众号后台回复"入门",即可获取系列文 ...

  9. python服务端多进程压测工具

    本文描述一个python实现的多进程压测工具,这个压测工具的特点如下: 多进程 在大多数情况下,压测一般适用于IO密集型场景(如访问接口并等待返回),在这种场景下多线程多进程的区分并不明显(详情请参见 ...

最新文章

  1. win8 metro 拖拽重排grid
  2. mybatis学习6复杂查询之一对多的处理
  3. 黑马程序员-异常介绍与处理
  4. 计算机斐波那流程图,循环结构——斐波那契数列.DOC
  5. 内部矩阵维度必须一致simulink_深度学习/目标检测之numpy——向量和矩阵乘法相关...
  6. 【spring】通过GZIP压缩提高网络传输效率(可以实现任何资源的gzip压缩、包括AJAX)
  7. Python学习笔记:创建进程
  8. PostgreSQL体系结构之物理结构
  9. Linux Man手册的使用示例
  10. org.n3r.idworker idworker-client生成唯一id
  11. 如何提高计算机软件的性能,如何提高计算机性能?
  12. 日程表模板html,excel日程表模板(每日工作时间表模板)
  13. 张正友标定法代码解释
  14. 2021-05-23
  15. tp5 上传路径反斜杠的问题 ,反斜杠json_decode函数输出出错的
  16. android微信小程序自动填表_微信小程序自动化实战(一)
  17. 网络硬件三剑客 - 集线器、交换机与路由器
  18. linux中tail命令的作用,Linux中tail命令实例
  19. linux 扩展pam支持第三方认证
  20. element-ui dialog(多弹框、嵌套弹框)被蒙版遮住

热门文章

  1. iOS最新申请DUNS(邓白氏)详细过程,iOS开发者申请DUNS(邓白氏)相关细节,申请DUNS(邓白氏)的方法...
  2. 3D游戏开发所需的数学基础——笛卡尔坐标系
  3. 3、Web 窗体的基本控件——按钮控件(Button,LinkButton)
  4. 是德矢量网络分析仪N5244
  5. 10个Scratch热门作品(4)
  6. 爬虫获取淘宝等电商历史价格,分析资源网站实现本地重建(仅供个人学习)
  7. 3.从零开始搭建基于SpringCloud的京东整站_文件上传微服务
  8. js websocket技术总结
  9. c++ 11 原子操作库 (std::atomic)(一)
  10. 洛谷P1553 数字反转(升级版)