新手区 写并发压测 java 脚本你必须会的 3 个类

大话性能 · 2018年10月12日 · 最后由 大话性能 回复于 2018年10月15日 · 1990 次阅读

性能测试做到后面,一些特殊的场景利用常用的现成工具满足不了需求,所以你需要学习 java 写一些特定协议的压测脚本,那你不得不研究多线程或线程池,而此时你也一定会遇到 java 并发编程中的几个类,今天重点讲解这 3 个类,CountDownLanch、CyclicBarrier、Semaphore,希望大家以后看到的时候知道是干嘛用的。

接下来,我就最近学习的成果,下面和大家举例子讲解一下,帮助理解。当然篇幅原因,完整的 java 代码例子

1、CountDownLanch

场景
工作中往往会遇到需要异步处理的任务,此时我们就会利用多线程的方式去处理,即启动子线程去执行任务,而此时主线程阻塞,等待所有的子线程完成任务后,再去做一些汇总统计工作。

CountDownLanch 是一个倒数计数器, 给一个初始值 (>=0), 然后每一次调用 countDown 就会减 1, 这很符合等待多个子线程结束的场景: 一个线程结束的时候, countDown 一次, 直到所有的线程都 countDown 了 , 那么所有子线程就都结束了。

先看看 CountDownLanch 提供的方法。

await: 会阻塞等待计数器减少到 0 位置. 带参数的 await 是多了等待时间。

countDown: 将当前的计数减 1。

getCount(): 返回当前的计数。

显而易见, 我们只需要在子线程执行之前, 赋予初始化 countDownLanch, 并赋予线程数量为初始值。

每个线程执行完毕的时候, 就 countDown 一下。主线程只需要调用 await 方法, 可以等待所有子线程执行结束。

2、CyclicBarrier

场景
我们在做压测的时候,如要真正的并发,那么在创建线程成功后需要等待其他线程也创建好了,一起等着,同时发送请求,此时就用到了 CyclicBarrier。

CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。

3、Semaphore

场景
有时候并发太大的时候,我们需要人工的控制,譬如一些数据库的连接数这样子的,资源毕竟有限的,不可能无限去创建连接,此时我们就需要利用 Semaphore 去控制。

Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。可以控制系统的流量,拿到信号量的线程可以进入,否则就等待。通过 acquire() 和 release() 获取和释放访问许可。

更多性能测试相关学习可以关注公众号大话性能。

共收到 5 条回复 时间 点赞

学习

问个小白问题,压测做的少,使用 Jmeter 的话,单台机器,性能一般的话,压测几千机器就很吃力了,脚本写压测的话,单台机器差不多能模拟到多少并发呢?

木月 回复

1、取决于你写的代码性能好坏;
2、取决于框架的性能;
个人觉得,用代码写大部分也是采用线程的模式,也是比较耗资源的。如果是自己写压测端,可以借助于一些高性能的框架,譬如 netty,这样可能写出来的 java 脚本性能会好一些,相同条件下,可以模拟的并发多一些。

请问 java 脚本怎么实现分布式压测呢?

konami1986 回复

还在研究中,目前采用简单的 shell 分发

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册