今天写了一个可以测试并发数和运行次数的压力测试代码

  1. 介绍一下为什么会写这么一个工具。
  2. 介绍一个这个工具怎么用的。

背景

最近在开发CoapServer端,以及模拟设备侧发送数据调用开发好的CoapServer的性能,进行压力测试。

自己没有找到合适的压力测试的工具,但是测试诉求相对比较简单,觉得用Java可以来控制测试。

测试维度:

  1. 一共模拟1W台设备,共计发送数据100W次
  2. 模拟多台设备同时发送数据。

代码和使用

  1. import org.eclipse.californium.core.CoapClient;
  2. import org.eclipse.californium.core.CoapResponse;
  3. import org.eclipse.californium.core.Utils;
  4. import org.eclipse.californium.elements.exception.ConnectorException;
  5. import java.io.IOException;
  6. import java.text.NumberFormat;
  7. import java.util.concurrent.ConcurrentHashMap;
  8. import java.util.concurrent.CountDownLatch;
  9. import java.util.concurrent.ExecutorService;
  10. import java.util.concurrent.Executors;
  11. public class PressTestClient {
  12. static int count = 0;
  13. //总访问量是client_num,并发量是thread_num
  14. int thread_num = 10;
  15. int client_num = 1000;
  16. float avg_exec_time = 0;
  17. float sum_exec_time = 0;
  18. long first_exec_time = Long.MAX_VALUE;
  19. long last_done_time = Long.MIN_VALUE;
  20. float total_exec_time = 0;
  21. String url = "";
  22. String postData = "";
  23. public PressTestClient(int thread_num, int client_num, String url, String postData) {
  24. this.thread_num = thread_num;
  25. this.client_num = client_num;
  26. this.url = url;
  27. this.postData = postData;
  28. }
  29. public void run() {
  30. final PressTestClient currentObj = this;
  31. final ConcurrentHashMap<Integer, ClientThreadRecord> records = new ConcurrentHashMap<Integer, ClientThreadRecord>();
  32. // 建立ExecutorService线程池
  33. ExecutorService exec = Executors.newFixedThreadPool(thread_num);
  34. // thread_num个线程可以同时访问
  35. // 模拟client_num个客户端访问
  36. final CountDownLatch doneSignal = new CountDownLatch(client_num);
  37. for (int i = 0; i < client_num; i++) {
  38. Runnable run = new Runnable() {
  39. public void run() {
  40. int index = getIndex();
  41. long st = System.currentTimeMillis();
  42. try {
  43. //测试的逻辑代码
  44. TlsCoAPClient example = new TlsCoAPClient();
  45. CoapClient coapClient = example.getClient("device_service");
  46. CoapResponse response = null;
  47. try {
  48. System.out.println("start client request:" +index );
  49. response = coapClient.get();
  50. System.out.println("device_service: " + Utils.prettyPrint(response));
  51. Thread.sleep(100);
  52. } catch (ConnectorException | IOException e) {
  53. e.printStackTrace();
  54. }
  55. } catch (Exception e) {
  56. e.printStackTrace();
  57. }
  58. records.put(index, new ClientThreadRecord(st, System.currentTimeMillis()));
  59. doneSignal.countDown();//每调用一次countDown()方法,计数器减1
  60. }
  61. };
  62. exec.execute(run);
  63. }
  64. try {
  65. //计数器大于0 时,await()方法会阻塞程序继续执行
  66. doneSignal.await();
  67. } catch (InterruptedException e) {
  68. e.printStackTrace();
  69. }
  70. /**
  71. * 获取每个线程的开始时间和结束时间
  72. */
  73. for (int i : records.keySet()) {
  74. ClientThreadRecord r = records.get(i);
  75. sum_exec_time += ((double) (r.et - r.st)) / 1000;
  76. if (r.st < first_exec_time) {
  77. first_exec_time = r.st;
  78. }
  79. if (r.et > last_done_time) {
  80. this.last_done_time = r.et;
  81. }
  82. }
  83. this.avg_exec_time = this.sum_exec_time / records.size();
  84. this.total_exec_time = ((float) (this.last_done_time - this.first_exec_time)) / 1000;
  85. NumberFormat nf = NumberFormat.getNumberInstance();
  86. nf.setMaximumFractionDigits(4);
  87. System.out.println("======================================================");
  88. System.out.println("Thread Num: " + thread_num + ", Client Count: " + client_num + ".");
  89. System.out.println("Avg Exec Time: " + nf.format(this.avg_exec_time) + " s");
  90. System.out.println("Total Exec Time: " + nf.format(this.total_exec_time) + " s");
  91. System.out.println("Throughput: " + nf.format(this.client_num / this.total_exec_time) + " /s");
  92. }
  93. public static int getIndex() {
  94. return ++count;
  95. }
  96. public static void main(String[] args) {
  97. //总访问量和并发量两重循环,依次增大访问
  98. //访问量
  99. for (int j = 500; j < 501; j += 100) {
  100. //并发量
  101. for (int i = 500; i < 501; i += 1) {
  102. //要测试的URL
  103. String url = "http://www.baidu.com/";
  104. new PressTestClient(i, j, url, "").run();
  105. }
  106. }
  107. System.out.println("finished!");
  108. }
  109. }
  110. class ClientThreadRecord {
  111. long st;
  112. long et;
  113. public ClientThreadRecord(long st, long et) {
  114. this.st = st;
  115. this.et = et;
  116. }
  117. }

如何使用?

  1. main方法中的循环此时是控制 运行数和并发数的
  2. 上面run方法,是控制你要测试的代码的。可以自定义。

效果展示

今天写了一个可以测试并发数和运行次数的压力测试代码。(Java)的更多相关文章

  1. 开源API测试工具 Hitchhiker v0.6更新 - 改进压力测试

    Hitchhiker 是一款开源的支持多人协作的 Restful Api 测试工具,支持Schedule, 数据对比,压力测试,支持上传脚本定制请求,可以轻松部署到本地,和你的team成员一起协作测试 ...

  2. (总结)Web性能压力测试工具之WebBench详解

      PS:在运维工作中,压力测试是一项很重要的工作.比如在一个网站上线之前,能承受多大访问量.在大访问量情况下性能怎样,这些数据指标好坏将会直接影响用户体验.但是,在压力测试中存在一个共性,那就是压力 ...

  3. 网站压力测试ab 命令

    网站压力测试ab 命令 author: headsen   chen         2017-10-25   10:06:35 个人原创,转载请注明作者,出处,否则依法追究法律责任! 1,制作一个a ...

  4. Web性能压力测试工具之WebBench

    在运维工作中,压力测试是一项很重要的工作.比如在一个网站上线之前,能承受多大访问量.在大访问量情况下性能怎样,这些数据指标好坏将会直接影响用户体验.但是,在压力测试中存在一个共性,那就是压力测试的结果 ...

  5. Web性能压力测试工具之WebBench详解

    PS:在运维工作中,压力测试是一项很重要的工作.比如在一个网站上线之前,能承受多大访问量.在大访问量情况下性能怎样,这些数据指标好坏将会直接影响用户体验.但是,在压力测试中存在一个共性,那就是压力测试 ...

  6. apache-ab并发负载压力测试 不错

    ab -n 3000 -c 3000 http://www.test.com/ c 100 即:每次并发3000 个 n 10000 即: 共发送3000 个请求 ab -t 60 -c 100 ht ...

  7. Jmeter压力测试笔记(6)性能调测-压力并发-模拟生产环境数据

    问题原因找到了,那就好办了. 找到阿里云技术人员,让他们强行给我们上架了一个共享代理模式的Redis. 并重新进行压力测试. 哦豁~ 开心,压力测试顺利,异常率大大降低实际为: 数据库DBA反馈,数据 ...

  8. 推荐一个linux下的web压力测试工具神器webbench

    推荐一个linux下的web压力测试工具神器webbench2014-04-30 09:35:29   来源:   评论:0 点击:880 用多了apache的ab工具之后你就会发现ab存在很多问题, ...

  9. jmeter压力测试的简单实例+badboy脚本录制(一个简单的网页用户登录测试的结果)

    JMeter的安装:在网上下载,在下载后的zip解压后,在bin目录下找到JMeter.bat文件,双击就可以运行JMeter. http://jmeter.apache.org/ 在使用jmeter ...

随机推荐

  1. Numpy库基础___三

    ndarray一个强大的N维数组对象Array •ndarray的操作 索引 a = np.arange(24).reshape((2,3,4)) print(a) #[[[ 0 1 2 3] # [ ...

  2. 关于OAuth2.0 Authorization Code + PKCE flow在原生客户端(Native App)下集成的一点思考

    写在前面 前几天看了园友的一篇文章被广泛使用的OAuth2.0的密码模式已经废了,放弃吧 被再次提起: Implicit Flow Password Grant,均已被标记为Legacy,且OAuth ...

  3. XSS 32个触发事件

    标签: 1.onmouseenter:当鼠标进入选区执行代码 <div style="background-color:red" onmouseenter="ale ...

  4. sql注入mysql注入

    #跨库查询及应用思路 information_schema表特性,记录数据库名.表名.列名对应表 information_schema.schemata:存储所有数据库名 schema_name:数据 ...

  5. corn计划周期任务

                                                                             corn计划任务 1.计划任务有四种方式   cron ...

  6. Linux 下命令有哪几种可使用的通配符?分别代表什么含义?

    "?"可替代单个字符. "*"可替代任意多个字符. 方括号"[charset]"可替代 charset 集中的任何单个字符,如[a-z],[ ...

  7. jvm-learning-运行时数据区-整体

    在jdk8之后之前的方法区有叫做元数据. 每个JVM只有一个Runtime实例,即为运行时环境,相当于内存结构种的运行时数据区 线程 线程是一个程序里的运行单元,JVM允许一个应用有多个线程并行的执行 ...

  8. 学习ELK日志平台(四)

    一:需求及基础: 场景: 1.开发人员不能登录线上服务器查看详细日志 2.各个系统都有日志,日志数据分散难以查找 3.日志数据量大,查询速度慢,或者数据不够实时 4.一个调用会涉及到多个系统,难以在这 ...

  9. 四、PCB初始化设置

    1.参数设置Setup-Design Parameters 2.显示设置 3.颜色设置(自定义) 4..栅格设置(走线层将25分为5等份)

  10. 220v-5v稳压电路

    5V整流电路原理 先对电路进行整流 整流电路:利用单向导电器件将交流电转换成脉动直流电路,再用电容进行滤波 滤波电路:利用储能元件(电感或电容)把脉动直流电转换成比较平坦的直流电,然后对电路进行稳压 ...