场景:

大家在使用Jmeter测试的时候应该发现了,

(1)线程启动了就会直接发送测试请求;--如果要模拟在一瞬间高并发量测试的时候,需要调高线程数量,这很耗测试机器的性能,往往无法支持较大的并发数,无法控制每次测试的瞬间并发量;

(2)如果使用了constant throughput timer,可以模拟较长时间的并发测试,但是仍无法满足稳定的瞬间高并发测试;

解决:

1、使用集合点;

作用:阻塞线程,直到指定的线程数量到达后,再一起释放,可以瞬间产生很大的压力。

引用虫师的话“红军排长说:等一等!集结了所有战友后,大家再一起冲啊!这样给敌人的压力是最大的。”

操作步骤

1、添加集合点,在Jmeter里是synchronized timer;

2、面板说明及设置

(1)面板说明

1)名称:自定义名称

2)Number of Simulated Users to Group by

Define how many simulated users trigger the release of the synchronizing block(default value of '0'means all users).

即a.每集合够多少个模拟用户(线程)后发送一次测试请求;

b.如果设置为0,等同于设置为线程租中的线程数;

c.确保设置的值不大于它所在线程组包含的用户数(线程数)-- 一直集结线程而不发出测试请求,直到超时(如果设置了的话)。

例子说明:“Number of Simulated Users to Group by: 5”表示并发量是5。也就是说,Jmeter会等到5个线程都运行到此处时,这五个线程才开始执行后面的操作,先到达的线程将会在此等候。

3)Timeout in milliseconds

If set to 0,no timeout will occur;if superior to 0,then if after the timeout interval the number of users waiting is not reached,timer will stop waiting.

即a.超时时间,即多少毫秒后同时释放已集结的的线程,发送测试请求;

b.如果设置为0,Timer将等待线程数达到了"Number of Simultaneous Users to Group"中设置的值才释放。如果大于0,那么如果超过Timeout in milliseconds中设置的最大等待时间(毫秒为单位)后还没达到"Number of Simultaneous Users to Group"中设置的值,Timer将不再等待,释放已到达的线程。

(2)设置

我们这里设置Number of Simulated Users to Group by :10

Timeout in milliseconds :500

3、设置线程组属性

因为现在是使用集合点来实现高并发测试,所以现在线程组属性中就可以设置线程在较长的时间来启动,这样测试机器的压力就会相对小一点;

4、添加相关请求,结果树等,运行查看效果

通过结果树可以看到,请求是批量执行的;

1)开始执行的脚本,观察请求的增加数量趋势;或

2)对比请求的发送时间;

5、其他实践

(1)实践1--synchronizing timer应用于多个sampler中的其中一个

如果希望定时器仅应用于其中一个sampler,则把该定时器作为子节点加入,如下图

定时器仅仅对其上的HTTP请求1起作用,即仅在HTTP请求1执行前执行定时器,和HTTP请求2无关。

(2)实践2--synchronizing timer应用于多个sampler

如下,执行HTTP请求1和HTTP请求2前都会执行同步定时器1、2。当执行一个sampler之前时,和sampler处于相同作用域的定时器都会被执行;

注意点

1、网上部分人说“集合点的位置一定要在Sample(采样器)之前才能生效。”

此言差矣,在Jmeter中,timer是在sampler之前执行的。不管这个定时器的位置放在sampler之后,还是之前。当然,如果有多个timer的时候,在相同作用域下,会按上下顺序执行timer,这个就需要慎重放置timer的顺序;

不过,为了更好的可读性,还是建议将timer放在对应的sampler前面 或 子节点中;

2、Synchronizing timer 仅作用于同一个JVM中的线程。

所以,如果使用并发测试,确保"Number of Simultaneous Users to Group by"中设置的值不大于它所在线程组包含的用户数。

(原文:Synchronizing timer blocks only within one JVM, so if using Distributed testing ensure you never set "Number of Simultaneous Users to Group by" to a value superior to the number of users of its containing Thread group considering 1 injector only)

试想:

a.如果分布式测试时,synchronizing timer作用于所有jvm,那么jvm之间或者说监控jvm工作的部件就需要频繁通讯,确定线程的数量及状态等,然后集结了足够的线程后,又要发送信号让Jmeter来发送测试请求,中间存在延时,这样就无法模拟更真实的高并发了,而且这个东西还会消耗测试机器的一部分性能,会给测试结果带来负面影响;

所以暂时是只支持控制单个jvm,如果后面有办法解决上面那些问题后,就可以实现控制多个jvm,控制总并发量;

b.如果分布式测试,并使用了Synchronizing timer,且设置的值是小于单个jvm的线程数量;

但是,较难确保所有jvm都在同一时间点集结了同样数量的线程数,这样就很难下测试结论了,因为都不知道是多少并发下的性能表现;当然了,可以将线程的启用时间拉长,并将超时时间延长,这样就很可能会与同一时刻集结到足够的线程,达到超高并发的测试;

所以,分布式测试与Synchronizing timer一般不是同时使用的;如果非要用,则需要慎重设置相关参数;

3、如果设置Timeout in milliseconds为0,且线程数量无法达到"Number of Simultaneous Users to Group by"中设置的值,那么Test将无限等待,除非手动终止。

这个无法达到的情况有如下几种:

a.设置的值大于线程数量,这样就永远无法达到了;

b.最后一批线程数不够集合点数目;

Jmeter之仿真高并发测试-集合点的更多相关文章

  1. Java高并发测试框架JCStress

    前言 如果要研究高并发,一般会借助高并发工具来进行测试.JCStress(Java Concurrency Stress)它是OpenJDK中的一个高并发测试工具,它可以帮助我们研究在高并发场景下JV ...

  2. JMeter入门 | 第一个并发测试

    JMeter入门 | 第一个并发测试 背景 近期我们组新来了一些新同事,之前从来没有用过JMeter做个并发测试,于是准备了一系列小教程去指引新同事,本章主要是新人入门体验教程,快速实现第一个接口并发 ...

  3. springboot2.0+线程池+Jmeter以模拟高并发

    声明:原创在这里https://blog.csdn.net/u011677147/article/details/80271174,在此也谢谢哥们. 1.目录结构 2.BusinessThread.j ...

  4. 对redis高并发测试的研究

    以下引用大神的: 测试项目: https://github.com/14251104246/redis-demo.git 准备 使用docker-compose命令启动redis服务器(可以用其他方式 ...

  5. java高并发测试代码

    package com.example.test; import java.net.URL;import java.net.URLConnection;import java.util.concurr ...

  6. CountDownLatch模拟高并发测试代码

    直接上代码进行验证吧 /** * 通过countdownlatch的机制,来实现并发运行 * 模拟200个并发测试 * @author ll * @date 2018年4月18日 下午3:55:59 ...

  7. jmeter(高并发测试)

    1.首先jmeter需要JDK8以上得运行环境 2.下载jmeter,官方网址:http://jmeter.apache.org/download_jmeter.cgi 3.安装jmeter.jmet ...

  8. http_load 高并发测试

    安装http_load 下载 sudo wget http://www.acme.com/software/http_load/http_load-09Mar2016.tar.gz 解压 sudo t ...

  9. webbench高并发测试

    安装ctags sudo apt-get install ctags 安装webbench 下载webbench http://home.tiscali.cz/~cz210552/distfiles/ ...

随机推荐

  1. super调用父类的属性方法

    super:可以用来修饰属性  方法   构造器 当子类与父类中有同名的属性时,可以通过   super.此属性  显式的调用父类声明的属性 若想调用子类的同名的属性“this.此属性” 2.当子类重 ...

  2. [Python3]星号*的打开方式

    python中,* 号除了用来做数量乘法,还有其他的用处. 结论 概括的来说,就是对修饰的变量进行拆分, 对修饰的形式参数进行参数聚集. 单*号,将被修饰的变量按元素方式拆分, 对修饰的形式参数进行参 ...

  3. 生成随机字符串 php

    /** +---------------------------------------------------------- * 生成随机字符串 +------------------------- ...

  4. eclipse 界面复原

    Windows-----Perspective-----Reset perspective

  5. Java实现 LeetCode 743 网络延迟时间(Dijkstra经典例题)

    743. 网络延迟时间 有 N 个网络节点,标记为 1 到 N. 给定一个列表 times,表示信号经过有向边的传递时间. times[i] = (u, v, w),其中 u 是源节点,v 是目标节点 ...

  6. Java实现 洛谷 P1426 小鱼会有危险吗

    import java.util.LinkedList; import java.util.Scanner; public class Main { private static Scanner ci ...

  7. java实现第四届蓝桥杯危险系数

    危险系数 抗日战争时期,冀中平原的地道战曾发挥重要作用. 地道的多个站点间有通道连接,形成了庞大的网络.但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系. 我们来定义一个危险系数DF( ...

  8. Linux目录处理命令mkdir详解

    mkdir(英文原意:make directories),基本作用是创建新的目录,命令的路径及权限: 可以看到,这个命令的路径是/usr/bin/mkdir,所以它的执行权限是所有用户 mkdir 创 ...

  9. ES6优雅的异步操作Promise()

    一.Promise()的基本使用 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  10. 使用redis实现nodejs并发服务

    const redisClient = require('redis').createClient(6379, '127.0.0.1'); const crypto = require('crypto ...