一、吞吐量的定义与计算
Throughput = (number of requests) / (total time)
total time = 测试结束时间 - 测试开始时间
测试结束时间 = MAX(请求开始时间 + Elapsed Time)
测试开始时间 = MIN(请求开始时间)
若没有选中 "Successes" 时,其 Throughput 是包含出错的请求的 Throughput。
若选中 "Successes" 时,Throughput 仅是所有正确的请求的 Throughput。
PS:
设置 Thread Group->Add->Listener->Simple Data Writer 就可以生成报告文件,默认情况下就包括“请求开始时间”和“Elapsed Time ”信息。
二、Jmeter在循环跑时throughput不准确
将Thread Group设置循环次数 > 1或者执行一段时间时,而正好这个Thread Group有多个Sampler,那么在执行结束后,其throughput结果是不准确的,你会发现各个sampler的throughput结果很接近。下面解释这个问题:
比如你的循环次数是10,有A、B两个Sampler,那么他们的执行顺序是这样的
1. loop 1 A t1
2. loop 1 B t2
3. loop 2 A t3
4. loop 2 B t4
5. ...
6. loop 10 A t19
7. loop 10 B t20
结果
• A的throughput = 10 / (t19 - 开始时间)
• B的throughput = 10 / (t20 - 开始时间)
看到问题了吧,计算throughput时会把其他的请求的时间一并计算进去。
三、固定吞吐量下测试系统的性能表现
场景
测试百度主页在20 QPS的情况下,响应时间、流量等性能数据;
分析
1、这里的20 QPS应该是指Jmeter发送请求的QPS,而不是服务器处理的QPS;--因为假如我们以20 QPS的速度向服务器发送请求,但是服务器每秒最多只能处理8个请求,那么我们无论如何都无法测得服务器在20 QPS的情况下的性能数据;
2、难点在于让Jmeter【稳定地】以20 QPS的速度向服务器发送请求;
处理思路
利用Jmeter的constant throughput timer来设置Jmeter的请求吞吐量,同时检测服务器的响应时间等性能数据;
操作步骤:
1、为线程组添加“constant throughput timer(固定吞吐量定时器)”;如下图:
2、配置constant throughput timer
名称:定时的名称;
Target throughput:目标(期望)吞吐量,注意,这里的吞吐量不是per second,而是每分钟;
既然是测试在20 QPS情况下的系统表现,那么这里我们应该填 20*60=1200;
calculate throughput based on:这是一个下拉框,表示以**为基础来控制Jmeter的请求吞吐量,
我们这里选择All active threads in current thread group;说明如下:
--This thread only :分别控制每个线程的吞吐量,选择这种模式时,总的吞吐量为设置的 target Throughput 乘以线程的数量。
如果我们这里选择此种模式,然后设定了是10个线程,那么我们前面的Target throughput就应该填写1200/10=120 或 20/10*60=120了;
--All active threads : 设置的target Throughput 将分配在每个活跃线程上,每个活跃线程在上一次运行结束后等待合理的时间后再次运行。活跃线程指同一时刻同时运行的线程。
如果我们这里选择此种模式,然后设定了是10个线程,那么我们前面的Target throughput就应该填写1200/10=120 或 20/10*60=120了;
--All active threads in current thread group :设置的target Throughput将分配在当前线程组的每一个活跃线程上,当测试计划中只有一个线程组时,该选项和All active threads选项的效果完全相同。
--All active threads (shared ):与All active threads 的选项基本相同,唯一的区别是,每个活跃线程都会在所有活跃线程上一次运行结束后等待合理的时间后再次运行。
All cative threads in current thread group (shared ):与All active threads in current thread group 基本相同,唯一的区别是,每个活跃线程都会在所有活跃线程的上一次运行结束后等待合理的时间后再次运行。
3、配置线程组属性
前面只是配置了QPS,所以我们接着配置,Jmeter持续发送请求的时间,
(1)在线程属性-循环测试处,勾选上“永远”,(此时旁边的editText就无法输入了);
(2)勾选“调度器”,在持续时间中配置10秒,或在启动时间、结束时间处配置一个时间间隔为10秒的时间区间;
4、添加聚合报告、TPS监听器;
(1)我们以20QPS发送10秒,20*10=200个,聚合报告中215个,比较相近,可看为已达到目的;
我测试多次,有时候是205,有时候是210,这个受多因素影响,接近即可;
(2)看TPS;
也是基本为20QPS,百度服务器完成能胜任20QPS的压力;
5、测试报告
相信大家都发现了,同一个测试计划(此处是20QPS的情况下请求10秒),执行多次的结果不尽相同,吞吐量、响应时间等,所以我们写测试报告的时候并不是只写其中一个报告的测试值;
(1)同一个测试计划运行3次以上,并分别将关注的属性值记下来,比如我测试了5次,关注99%line,5次的值分别是300、344、285、360、380;
(2)将这些值绘制成一个曲线图,得出测试结论,99%Line大概是340ms;