今天写了一个可以测试并发数和运行次数的压力测试代码。(Java)
今天写了一个可以测试并发数和运行次数的压力测试代码
- 介绍一下为什么会写这么一个工具。
- 介绍一个这个工具怎么用的。
背景
最近在开发CoapServer端,以及模拟设备侧发送数据调用开发好的CoapServer的性能,进行压力测试。
自己没有找到合适的压力测试的工具,但是测试诉求相对比较简单,觉得用Java可以来控制测试。
测试维度:
- 一共模拟1W台设备,共计发送数据100W次
- 模拟多台设备同时发送数据。
代码和使用
import org.eclipse.californium.core.CoapClient;
import org.eclipse.californium.core.CoapResponse;
import org.eclipse.californium.core.Utils;
import org.eclipse.californium.elements.exception.ConnectorException;
import java.io.IOException;
import java.text.NumberFormat;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class PressTestClient {
static int count = 0;
//总访问量是client_num,并发量是thread_num
int thread_num = 10;
int client_num = 1000;
float avg_exec_time = 0;
float sum_exec_time = 0;
long first_exec_time = Long.MAX_VALUE;
long last_done_time = Long.MIN_VALUE;
float total_exec_time = 0;
String url = "";
String postData = "";
public PressTestClient(int thread_num, int client_num, String url, String postData) {
this.thread_num = thread_num;
this.client_num = client_num;
this.url = url;
this.postData = postData;
}
public void run() {
final PressTestClient currentObj = this;
final ConcurrentHashMap<Integer, ClientThreadRecord> records = new ConcurrentHashMap<Integer, ClientThreadRecord>();
// 建立ExecutorService线程池
ExecutorService exec = Executors.newFixedThreadPool(thread_num);
// thread_num个线程可以同时访问
// 模拟client_num个客户端访问
final CountDownLatch doneSignal = new CountDownLatch(client_num);
for (int i = 0; i < client_num; i++) {
Runnable run = new Runnable() {
public void run() {
int index = getIndex();
long st = System.currentTimeMillis();
try {
//测试的逻辑代码
TlsCoAPClient example = new TlsCoAPClient();
CoapClient coapClient = example.getClient("device_service");
CoapResponse response = null;
try {
System.out.println("start client request:" +index );
response = coapClient.get();
System.out.println("device_service: " + Utils.prettyPrint(response));
Thread.sleep(100);
} catch (ConnectorException | IOException e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
records.put(index, new ClientThreadRecord(st, System.currentTimeMillis()));
doneSignal.countDown();//每调用一次countDown()方法,计数器减1
}
};
exec.execute(run);
}
try {
//计数器大于0 时,await()方法会阻塞程序继续执行
doneSignal.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
/**
* 获取每个线程的开始时间和结束时间
*/
for (int i : records.keySet()) {
ClientThreadRecord r = records.get(i);
sum_exec_time += ((double) (r.et - r.st)) / 1000;
if (r.st < first_exec_time) {
first_exec_time = r.st;
}
if (r.et > last_done_time) {
this.last_done_time = r.et;
}
}
this.avg_exec_time = this.sum_exec_time / records.size();
this.total_exec_time = ((float) (this.last_done_time - this.first_exec_time)) / 1000;
NumberFormat nf = NumberFormat.getNumberInstance();
nf.setMaximumFractionDigits(4);
System.out.println("======================================================");
System.out.println("Thread Num: " + thread_num + ", Client Count: " + client_num + ".");
System.out.println("Avg Exec Time: " + nf.format(this.avg_exec_time) + " s");
System.out.println("Total Exec Time: " + nf.format(this.total_exec_time) + " s");
System.out.println("Throughput: " + nf.format(this.client_num / this.total_exec_time) + " /s");
}
public static int getIndex() {
return ++count;
}
public static void main(String[] args) {
//总访问量和并发量两重循环,依次增大访问
//访问量
for (int j = 500; j < 501; j += 100) {
//并发量
for (int i = 500; i < 501; i += 1) {
//要测试的URL
String url = "http://www.baidu.com/";
new PressTestClient(i, j, url, "").run();
}
}
System.out.println("finished!");
}
}
class ClientThreadRecord {
long st;
long et;
public ClientThreadRecord(long st, long et) {
this.st = st;
this.et = et;
}
}
如何使用?
- main方法中的循环此时是控制 运行数和并发数的
- 上面run方法,是控制你要测试的代码的。可以自定义。
效果展示
今天写了一个可以测试并发数和运行次数的压力测试代码。(Java)的更多相关文章
- 开源API测试工具 Hitchhiker v0.6更新 - 改进压力测试
Hitchhiker 是一款开源的支持多人协作的 Restful Api 测试工具,支持Schedule, 数据对比,压力测试,支持上传脚本定制请求,可以轻松部署到本地,和你的team成员一起协作测试 ...
- (总结)Web性能压力测试工具之WebBench详解
PS:在运维工作中,压力测试是一项很重要的工作.比如在一个网站上线之前,能承受多大访问量.在大访问量情况下性能怎样,这些数据指标好坏将会直接影响用户体验.但是,在压力测试中存在一个共性,那就是压力 ...
- 网站压力测试ab 命令
网站压力测试ab 命令 author: headsen chen 2017-10-25 10:06:35 个人原创,转载请注明作者,出处,否则依法追究法律责任! 1,制作一个a ...
- Web性能压力测试工具之WebBench
在运维工作中,压力测试是一项很重要的工作.比如在一个网站上线之前,能承受多大访问量.在大访问量情况下性能怎样,这些数据指标好坏将会直接影响用户体验.但是,在压力测试中存在一个共性,那就是压力测试的结果 ...
- Web性能压力测试工具之WebBench详解
PS:在运维工作中,压力测试是一项很重要的工作.比如在一个网站上线之前,能承受多大访问量.在大访问量情况下性能怎样,这些数据指标好坏将会直接影响用户体验.但是,在压力测试中存在一个共性,那就是压力测试 ...
- apache-ab并发负载压力测试 不错
ab -n 3000 -c 3000 http://www.test.com/ c 100 即:每次并发3000 个 n 10000 即: 共发送3000 个请求 ab -t 60 -c 100 ht ...
- Jmeter压力测试笔记(6)性能调测-压力并发-模拟生产环境数据
问题原因找到了,那就好办了. 找到阿里云技术人员,让他们强行给我们上架了一个共享代理模式的Redis. 并重新进行压力测试. 哦豁~ 开心,压力测试顺利,异常率大大降低实际为: 数据库DBA反馈,数据 ...
- 推荐一个linux下的web压力测试工具神器webbench
推荐一个linux下的web压力测试工具神器webbench2014-04-30 09:35:29 来源: 评论:0 点击:880 用多了apache的ab工具之后你就会发现ab存在很多问题, ...
- jmeter压力测试的简单实例+badboy脚本录制(一个简单的网页用户登录测试的结果)
JMeter的安装:在网上下载,在下载后的zip解压后,在bin目录下找到JMeter.bat文件,双击就可以运行JMeter. http://jmeter.apache.org/ 在使用jmeter ...
随机推荐
- Numpy库基础___三
ndarray一个强大的N维数组对象Array •ndarray的操作 索引 a = np.arange(24).reshape((2,3,4)) print(a) #[[[ 0 1 2 3] # [ ...
- 关于OAuth2.0 Authorization Code + PKCE flow在原生客户端(Native App)下集成的一点思考
写在前面 前几天看了园友的一篇文章被广泛使用的OAuth2.0的密码模式已经废了,放弃吧 被再次提起: Implicit Flow Password Grant,均已被标记为Legacy,且OAuth ...
- XSS 32个触发事件
标签: 1.onmouseenter:当鼠标进入选区执行代码 <div style="background-color:red" onmouseenter="ale ...
- sql注入mysql注入
#跨库查询及应用思路 information_schema表特性,记录数据库名.表名.列名对应表 information_schema.schemata:存储所有数据库名 schema_name:数据 ...
- corn计划周期任务
corn计划任务 1.计划任务有四种方式 cron ...
- Linux 下命令有哪几种可使用的通配符?分别代表什么含义?
"?"可替代单个字符. "*"可替代任意多个字符. 方括号"[charset]"可替代 charset 集中的任何单个字符,如[a-z],[ ...
- jvm-learning-运行时数据区-整体
在jdk8之后之前的方法区有叫做元数据. 每个JVM只有一个Runtime实例,即为运行时环境,相当于内存结构种的运行时数据区 线程 线程是一个程序里的运行单元,JVM允许一个应用有多个线程并行的执行 ...
- 学习ELK日志平台(四)
一:需求及基础: 场景: 1.开发人员不能登录线上服务器查看详细日志 2.各个系统都有日志,日志数据分散难以查找 3.日志数据量大,查询速度慢,或者数据不够实时 4.一个调用会涉及到多个系统,难以在这 ...
- 四、PCB初始化设置
1.参数设置Setup-Design Parameters 2.显示设置 3.颜色设置(自定义) 4..栅格设置(走线层将25分为5等份)
- 220v-5v稳压电路
5V整流电路原理 先对电路进行整流 整流电路:利用单向导电器件将交流电转换成脉动直流电路,再用电容进行滤波 滤波电路:利用储能元件(电感或电容)把脉动直流电转换成比较平坦的直流电,然后对电路进行稳压 ...