精华内容
下载资源
问答
  • 下面的代码既用了栅栏又用了信号量,许多简单的测试使用栅栏就够了。 @Slf4j @NotThreadSafe public class ConcurrencyTest { // 请求总数 public static int clientTotal = 5000; // 同时并发执行的线程...

    目录

    CountDownLatch栅栏

    Semaphore信号量

    并发代码演示

    并发代码线程安全提升


    CountDownLatch栅栏

    CountDownLatch的概念:

    CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。
    CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成了任务,然后在CountDownLatch上等待的线程就可以恢复执行任务。CountDownLatch的详细使用后续我们在深入讲解.


    Semaphore信号量

    Semaphore的概念

    Semaphore是计数信号量。Semaphore管理一系列许可证。每个acquire方法阻塞,直到有一个许可证可以获得然后拿走一个许可证;每个release方法增加一个许可证,这可能会释放一个阻塞的acquire方法。然而,其实并没有实际的许可证这个对象,Semaphore只是维持了一个可获得许可证的数量。

    并发代码演示

    下面的代码既用了栅栏又用了信号量,许多简单的测试使用栅栏就够了。

    @Slf4j
    @NotThreadSafe
    public class ConcurrencyTest {
    
        // 请求总数
        public static int clientTotal = 5000;
    
        // 同时并发执行的线程数
        public static int threadTotal = 200;
    
        public static int count = 0;
    
        public static void main(String[] args) throws Exception {
            ExecutorService executorService = Executors.newCachedThreadPool();
            final Semaphore semaphore = new Semaphore(threadTotal);
            final CountDownLatch countDownLatch = new CountDownLatch(clientTotal);
            for (int i = 0; i < clientTotal ; i++) {
                executorService.execute(() -> {
                    try {
                        semaphore.acquire();
                        add();
                        semaphore.release();
                    } catch (Exception e) {
                        log.error("exception", e);
                    }
                    countDownLatch.countDown();
                });
            }
            countDownLatch.await();
            executorService.shutdown();
            log.info("count:{}", count);
        }
    
        private static void add() {
            count++;
        }
    }
    

    并发代码线程安全提升

    由线程不安全变为线程安全,仅使用栅栏的方式:

    @Slf4j
    public class ConcurencyTest {
    
           // 请求总数
        public static int clientTotal = 5000;
    
        // 原子锁
        public static AtomicInteger count = new AtomicInteger(0);
    
        public static void main(String[] args) throws Exception {
            ExecutorService executorService = Executors.newCachedThreadPool();
    
            final CountDownLatch countDownLatch = new CountDownLatch(clientTotal);
            for (int i = 0; i < clientTotal ; i++) {
                executorService.execute(() -> {
                    countDownLatch.countDown();
                    try {
                        countDownLatch.await();
                        add();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                });
            }
    
            try{
                //直到方法执行完成
                Thread.sleep(10000);
                executorService.shutdown();
                System.out.println(count);
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
    
        private static void add() {
            count.incrementAndGet();
        }
    
    }
    

    或者这样写:

    public class ConcurencyTest {
    
        // 请求总数
        public static int clientTotal = 5000;
    
        // 原子锁
        public static AtomicInteger count = new AtomicInteger(0);
    
        public static void main(String[] args) throws Exception {
    
            CountDownLatch countDownLatch = new CountDownLatch(clientTotal);
    
            for (int i = 0; i < clientTotal ; i++) {
                new Thread(()->{
                    countDownLatch.countDown();
                    try {
                        countDownLatch.await();
                        add();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }).start();
            }
            try {
                Thread.sleep(10000);
                System.out.println(count);
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        }
    
        private static void add() {
            count.incrementAndGet();
        }
    }
    

     

    展开全文
  • 并发场景模拟测试

    2019-04-03 19:13:39
    通过CountDownLatch对高并发场景模拟测试,基于AQS同步队列实现,先阻塞,等待所有线程达到并发执行的效果。
  • 一段模拟并发测试的java代码 最近在做系统的并发调优,发现用jmete模拟并发效果不太好,可能是自己不太会使用,所以自己写了一段模拟并发请求的代码 /** * 回调通知性能测试 */ @Test public void notifyPay(){...

    一段模拟并发测试的java代码

    最近在做系统的并发调优,发现用jmete模拟并发效果不太好,可能是自己不太会使用,所以自己写了一段模拟并发请求的代码

    	/**
         * 回调通知性能测试
         */
        @Test
        public void notifyPay(){
    
            String[] ids = {"616704025123028992","616704025115336704","618854829254705152","613060490263691264"};
    
            while (true){
                CountDownLatch count = new CountDownLatch(1);
                for(int i =0;i<ids.length;i++){
                    int finalI = i;
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                //等待一起执行
                                count.await();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            //TODO 这里写需要并发的业务接口调用 
                            // notifyPayFeign.notifySend(ids[finalI]);
                        }
                    }).start();
                }
                count.countDown();
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
    展开全文
  • Postman 下载软件包 # 官网 启动 测试案例 创建一个Collections,将接口...点击Runner,选择需要并发测试的接口 设置相关参数,点击Run。 Apache Bench 下载软件包 # 官网 https://www.apachelounge.com/ # 软件包 ...

    Postman

    下载软件包

    # 官网
    
    

    启动

    测试案例

    1. 创建一个Collections,将接口保存进Collections
    2. 点击Runner,选择需要并发测试的接口
    3. 设置相关参数,点击Run。

    Apache Bench

    下载软件包

    # 官网
    https://www.apachelounge.com/
    # 软件包
    https://www.apachelounge.com/download/VS16/binaries/httpd-2.4.48-win64-VS16.zip
    

    启动

    在目录【xxx\Apache24\bin 】下,通过cmd进入命令行界面,启动abs.exe

    abs.exe
    

    测试案例

    ab [options] [http://]hostname[:port]/path
    

    例如:

    -n后面的1000代表总共发出1000个请求,-c后面的500表示采用500个并发(模拟500个人同时访问);后面的网址表示测试的目标URL。

    ab -n 1000 -c 500  http://127.0.0.1:8080/test
    # 或
    abs.exe -n 1000 -c 500  http://127.0.0.1:8080/test
    
    1. 参数说明

      • -n

        requests Number of requests to perform //本次测试发起的总请求数

      • -c

        concurrency Number of multiple requests to make //一次产生的请求数(或并发数)

      • -t

        timelimit Seconds to max. wait for responses //测试所进行的最大秒数,默认没有时间限制。

      • -r

        Don’t exit on socket receive errors // 抛出异常继续执行测试任务

      • -p

        postfile File containing data to POST //包含了需要POST的数据的文件,文件格式如“p1=1&p2=2”.使用方法是 -p 111.txt

      • -T

        content-type Content-type header for POSTing //POST数据所使用的Content-type头信息,如 -T “application/x-www-form-urlencoded” 。 (配合-p)

      • -v verbosity How much troubleshooting info to print
        //设置显示信息的详细程度 – 4或更大值会显示头信息, 3或更大值可以显示响应代码(404, 200等), 2或更大值可以显示警告和其他信息。 -V 显示版本号并退出。

      • -C

        attribute Add cookie, eg. -C “c1=1234,c2=2,c3=3” (repeatable)
        //-C cookie-name=value 对请求附加一个Cookie:行。 其典型形式是name=value的一个参数对。此参数可以重复,用逗号分割。提示:可以借助session实现原理传递 JSESSIONID参数,实现保持会话的功能,如-C ” c1=1234,c2=2,c3=3, JSESSIONID=FF056CD16DA9D71CB131C1D56F0319F8″ 。

      • -w

        Print out results in HTML tables //以HTML表的格式输出结果。默认时,它是白色背景的两列宽度的一张表。

      • -i

        Use HEAD instead of GET

    2. 测试报告

      • Document Path:测试页面
      • Document Length: 页面大小
      • Concurrency Level: 测试的并发数
      • Time taken for tests:整个测试持续的时间
      • Complete requests:完成的请求数量
      • Failed requests: 失败的请求数量
      • Write errors: 0
      • Total transferred: 整个过程中的网络传输量
      • HTML transferred: 整个过程中的HTML内容传输量
      • Requests per second: 最重要的指标之一,相当于LR中的每秒事务数,后面括号中的mean表示这是一个平均值
      • Time per request: 最重要的指标之二,相当于LR中的平均事务响应时间,后面括号中的mean表示这是一个平均值
      • Time per request: 每个连接请求实际运行时间的平均值
      • Transfer rate: 平均每秒网络上的流量,可以帮助排除是否存在网络流量过大导致响应时间延长的问题

    JMeter

    下载软件包

    # 官网
    http://jmeter.apache.org/
    # 软件包
    https://mirrors.bfsu.edu.cn/apache//jmeter/binaries/apache-jmeter-5.4.1.zip
    

    启动

    在目录【xxx\apache-jmeter-5.4.1\bin 】下,通过cmd进入命令行界面,window下启动 ,双击【 jmeter.bat 】脚本文件

    测试案例

    1. 添加本次测试计划

      选中TestPaln,右键–>添加–>Threads(Users)–>线程组,定义名称,例如tiger-test

    2. 设置线程数 (所谓线程数就是并发用户数)

    3. 添加协议及相关配置信息

      选中tiger-test,右键–>添加–>Sampler–>HTTP Request,定义名称,例如tiger-request

      填写接口相关参数

    4. 为线程添加监听器

      选中tiger-request,右键–>添加–>Listener–>查看结果树

      选中tiger-request,右键–>添加–>Listener–>图形结果

    5. 打来日志

      选择选项,勾选日志查看

    6. 启动测试

    线程属性

    1. 线程数

      虚拟用户数,假如50

    2. Ramp-Up Period(in seconds)

      虚拟用户增长时长,例如设置为300,也就是说5分钟内,50个用户请求完毕

    3. 循环次数

      一个虚拟用户所多少次测试,例如20,则表示总共执行1000次

    4. ….

    代码

    public class ConcurrencyTest {
        // 请求总数
        public static int clientTotal = 5000;
        // 同时并发执行的线程数
        public static int threadTotal = 200;
        public static AtomicInteger count = new AtomicInteger(0);
    
        public static void main(String[] args) throws Exception {
            // 线程池
            ExecutorService executorService = Executors.newCachedThreadPool();
            // 信号量
            final Semaphore semaphore = new Semaphore(threadTotal);
            // 计数器闭锁,线程执行一次,计数器减1,直到为0
            final CountDownLatch countDownLatch = new CountDownLatch(clientTotal);
            for (int i = 0; i < clientTotal; i++) {
                executorService.execute(() -> {
                    try {
                        semaphore.acquire();
                        add();
                        semaphore.release();
                    } catch (Exception e) {
                        log.error("exception", e);
                    }
                    countDownLatch.countDown();
                });
            }
            // 等待闭锁减为0,才执行下面的操作
            countDownLatch.await();
            // 关闭线程池
            executorService.shutdown();
            log.info("count:{}", count.get());
        }
    
        private static void add() {
            count.incrementAndGet();
        }
    }
    
    
    展开全文
  • 压力测试模拟并发

    2018-10-07 14:16:32
    一、使用简易工具Apache ab ab -n 100 -c 100 https://www.baidu.com/ ab -t 60 -c 100 https://www.baidu.com/ 备注:-n 代表发送60个请求 -c 代表100个并发 -t 代表60秒 不会占用太多的内存。...
    一、使用简易工具Apache ab
    ab -n 100 -c 100 https://www.baidu.com/
    ab -t 60  -c 100 https://www.baidu.com/
    备注:-n 代表发送60个请求
         -c 代表100个并发
         -t 代表60秒

    不会占用太多的内存。

    展开全文
  • 常用的网站性能测试指标有:并发数、响应时间、吞吐量、性能计数器等。 1、并发并发数是指系统同时能处理的请求数量,这个也是反应了系统的负载能力。 2、响应时间 响应时间是一个系统最重要的指标之一,它的...
  • 模拟多线程高并发测试

    千次阅读 2019-06-17 10:42:03
    public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); BidInfoService bidInfoService = (BidInfoSe...
  • 并发测试亲测可用

    2018-04-18 23:37:47
    用于高并发环境测试 需安装jdk>7,无需生成秘钥打开即可使用
  • HTTP并发测试工具

    2018-06-20 16:59:57
    可以在windows平台测试http https并发请求。非常好用的一个工具。
  • HTTP高并发测试工具

    2018-11-30 10:24:17
    HTTP高并发测试工具
  • * 模拟并发测试 */ public static void main(String[] args) throws InterruptedException, ExecutionException { //模拟并发数 int concurrencyNumber = 1000; List<String> resList = Lists.newArrayList...
  • Java模拟并发操作进行压力测试代码

    千次阅读 2017-02-23 17:25:31
    // 模拟2000个客户端访问      for  ( int  index =  0 ; index < client_num; index++) {    final   int  NO = index;   Runnable run =  new  Runnable() {    public   void  run...
  • 模拟多线程高并发进行压力测试

    千次阅读 2020-03-14 16:19:32
    思路 第一种:线程池模拟200个线程——wait等待线程数达200——...两种方案都可以实现瞬时高并发模拟,但是建议使用第二种方案。 第一种方案中,压测过程中,wait状态下的线程已经释放对象上的锁定,唤醒时...
  • 模拟并发访问

    2017-07-25 14:56:27
    利用php自带函数 批处理url访问
  • windows下模拟并发来进行负载测试

    千次阅读 2018-07-23 11:30:42
      Linux有很多开源工具用来测试服务器负载,而windows上非常少,几乎没有除了几...将两个好用的工具是Linux版本通过Cygwin移植过来,方便广大windows人员使用,经过初步测试效果一致,是命令行简单易用的测试软件...
  • 本文实例为大家分享了Python threading模块对单个接口进行并发测试的具体代码,供大家参考,具体内容如下 本文知识点 通过在threading.Thread继承类中重写run()方法实现定制输出结果 代码如下 import requests ...
  • 并发模拟多个用户同时访问所写接口,用于测试接口所需要的的并发,和接口的最多承受用户量,适用于一些简单的压力测试
  • Livestress 直播并发模拟测试工具.rar
  • http_load基于linux平台的一种性能测试工具,本款是编译为windows版本,windows下可使用。以并行复用的方式运行,用以测试web服务器的吞吐量与负载,测试web页面的性能。
  • 主要介绍了Jmeter多用户并发压力测试过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 并发模拟的四种方式

    千次阅读 2019-04-13 21:54:07
    Postman:Http请求模拟工具 Apache Bench(AB):Apache附带的工具,测试网站性能 如输入命令:ab -n 1000 -c 50 http://localhost:8081/test JMeter:Apache组织开发的压力测试工具 安装方法看下文【参考】...
  • /bin/bash#********************************##并发后台运行fun ##for wanggy 2012-01-25 ##note: ##fun_num fun函数后台运行次数 ##sql_num 每个函数sql运行次数 ##********************************##数据库...
  • jmeter模拟真实用户并发测试两种方法 通过正则的方式获取用户token信息 1、测试计划 --> 线程(用户), 创建setUp线程组,先启动的线程组,登陆获取用户token信息 2、添加HTTP请求,填写用户登陆接口参数,在...
  • workerman 压力测试, 支持高并发压力测试, 支持各种数据自定义测试.
  • 单机模拟并发进行压力测试

    千次阅读 2017-12-05 18:26:42
    本文主要介绍如何使用netty实现C100K级别的并发长连接
  • 前言:看到有的文章说Junit不支持多线程,测试了一下 (demo整合mybatis来查询)多线程测试A:查询用户信息@Test public void testThreadJunit2() throws Throwable { for (int i = 0; i &lt; 3; i++) { ...
  • Fiddler-009-模拟性能测试的并发测试

    千次阅读 2018-07-17 15:57:26
    通过 Fiddler 可以简单的模拟性能测试的并发测试 1、抓包获取网站的登录接口请求 2、F12暂停fiddler-&gt;选中要发送的请求-&gt;电脑键盘大写锁定-&gt;shift+R-&gt;输入【10】-&gt;F12启动...
  • php模拟创建大量mysql连接 max_mysql.php for($i=1;$i;$i++){ exec("nohup php /var/www/html/big/link_mysql.php > /dev/null &"); } ?> link_mysql.php $conn=mysql_pconnect("192.168.1.199","big
  • 目的是为了让虚拟用户在这个集合点同时向服务器发送请求以实现并发测试 2.开始测试 2.1压力测试、负载测试和并发测试的区别分析 压力测试:系统达到一定饱和度时,系统处理业务的能力 负载测试:找到系统...
  • 文章目录并发模拟的四种方式一、Postman二、Apache Bench(AB)三、并发模拟工具JMeter四、代码模拟 并发模拟的四种方式 一、Postman Postman是一个款http请求模拟工具 首先演示一下postman最基本的使用 创建一个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 96,998
精华内容 38,799
关键字:

如何模拟并发测试