news 2026/4/24 21:49:19

Apache JMeter进行TCP并发压力测试初尝试

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Apache JMeter进行TCP并发压力测试初尝试

由于互联网编程实验二第三题要求比较使用线程池与否的服务器的并发性能,遂检索信息并了解到Apache JMeter这个工具

本文主要介绍了在已有Java JDK的情况下对Apache JMeter的安装及配置,以及利用JMeter进行TCP压力测试

一、安装及配置

先在官网下载压缩包:Apache JMeter - Download Apache JMeter

将文件apache-jmeter-5.6.3.zip解压到自己选择的目录中

在根目录下,找到bin文件夹 ,进入文件夹中,找到jmeter.bat,双击即可打开软件

二、TCP服务器

编写Java代码,在Server类的main函数中,指定一个端口作为服务器端口,并在while死循环中不断接收客户端的请求,对于每一个请求新开一个线程ThreadServer,并在其中处理请求

public class Server { static int PORT = 9000; static int MAX_POOL = 100; public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(PORT); // without thread pool while (true) { Socket accept = server.accept(); Thread thread = new Thread(new ThreadServer(accept)); thread.start(); } // with thread pool // ExecutorService service = Executors.newFixedThreadPool(MAX_POOL); // while (true) { // Socket accept = server.accept(); // service.submit(new ThreadServer(accept)); // } } }

代码中将服务器分为两种模式,第一段为没有线程池的模式,第二段为使用线程池的模式。通过分别注释并重新编译运行来启动不同模式的服务器

为了简化服务端和客户端的交互,我们在ThreadServer中仅仅打印连接成功以及断开连接的信息,而不进行多余的通信,如下

public class ThreadServer implements Runnable{ Socket socket; static int BUFFER_SIZE = 1024; static String EXIT_STR = "exit"; public ThreadServer(Socket socket){ this.socket = socket; } @Override public void run(){ try{ System.out.println("connection start"); OutputStream out = socket.getOutputStream(); out.write("connect successfully".getBytes()); // echo service // InputStream in = socket.getInputStream(); // byte[] inBytes = new byte[BUFFER_SIZE]; // int len; // while((len = in.read(inBytes)) != 0){ // String str = new String(inBytes, 0, len); // if(str.equals(EXIT_STR)) // break; // System.out.println("received: " + str); // out.write(str.getBytes()); // } System.out.println("connection end"); socket.close(); }catch (IOException e){ e.printStackTrace(); } } }

注释部分是提供echo服务,需要客户端同步实现,在本题中无需使用,客户端参考以下代码:

public class Client { static String SERVER_HOST = "127.0.0.1"; static int SERVER_PORT = 9000; static int BUFFER_SIZE = 1024; static String EXIT_STR = "exit"; public static void main(String[] args) throws IOException { Socket client = new Socket(SERVER_HOST, SERVER_PORT); Scanner scanner = new Scanner(System.in); OutputStream out = client.getOutputStream(); InputStream in = client.getInputStream(); byte[] buffer = new byte[BUFFER_SIZE]; // echo while(scanner.hasNextLine()){ String lineOfWord = scanner.nextLine(); out.write(lineOfWord.getBytes()); if(lineOfWord.equals(EXIT_STR)) break; int len = in.read(buffer); System.out.println("echo: " + new String(buffer, 0, len)); } client.close(); } }

三、并发测试

1. 创建测试计划

打开JMeter,右键单击测试计划(test plan),一直选择到新建线程组,如下

右键单击新建的线程组,分别新建TCP Sampler和Response Time Graph,分别用于TCP连接以及输出响应时间与时间的折线图

注意到TCP Sampler属于Sampler模块,我们也可在此模块中选择HTTP Request进行HTTP请求的测试;Response Time Graph属于Listener模块,我们可以在此模块中选择Aggregate Report输出测试的聚合报告,包括响应时间的平均值、最小值,以及吞吐量等

在TCP Sampler中,指定服务器的地址及端口号如下

在Response Time Graph指定记录的间隔,单位为ms,这里设置为1000

2. 正式测试

首先启动服务端

D:\idea project\internetprog\exp2\exp2\src>javac Server.java D:\idea project\internetprog\exp2\exp2\src>java Server

单击Thread Group,不断更改以下几个参数,测试不同程度的并发下服务的响应时间

其中

  1. Number of Threads即创建的线程数
  2. Ramp-up period即在多长时间内创建以上线程数,单位为s
  3. Loop Count即执行的次数,勾选Infinite代表无限次执行

在本例中,我选择固定Ramp-up period为1,Loop Count为5,修改Number of Threads依次为2000、4000、6000、8000以及10000,分别对比在有无线程池的服务器中,出现较长延迟的响应时间。每种情况分别测试3~5次。

测试结果如下

线程数无线程池有线程池
20001ms内1ms内
40001s内1s内
60002s内2s内
80004s ~ 8s3s ~ 6s
1000010s ~ 16s3s ~ 7s

可以看出,当并发压力增大时,无线程池出现的长延迟响应时间,相比有线程池的情况增长要快

最后:下方这份完整的软件测试 视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

​​​件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/24 21:48:38

NVIDIA Cosmos合成数据生成技术解析与应用

1. 物理AI数据生成的挑战与NVIDIA Cosmos解决方案在物理AI模型开发过程中,数据获取一直是最大的瓶颈之一。传统的数据采集方式需要投入大量人力物力,比如在自动驾驶领域,要获取不同天气条件下的道路数据,不仅需要组织车队在不同季…

作者头像 李华
网站建设 2026/4/24 21:47:20

不用FileZilla和Xshell,教你用VSCode远程开发搞定Jetson Nano的PyTorch环境

用VSCode远程开发打造Jetson Nano上的PyTorch高效工作流 在边缘计算领域,Jetson Nano凭借其出色的能效比和GPU加速能力,已成为AI开发者的热门选择。然而,传统的开发方式往往需要同时使用FileZilla、Xshell等多个独立工具,不仅操作…

作者头像 李华
网站建设 2026/4/24 21:45:49

免费AI学习资源全指南:从理论到实践

1. 在线AI教育资源全景概览当我在2018年第一次尝试系统学习机器学习时,面对动辄上万的付费课程和晦涩的学术论文,几乎陷入了绝望。直到偶然发现斯坦福的公开课视频,才意识到原来顶级AI教育资源早已向公众敞开大门。如今五年过去,我…

作者头像 李华
网站建设 2026/4/24 21:45:19

科研工作流革命:如何用Zotero-SciHub插件将文献获取时间缩短95%

科研工作流革命:如何用Zotero-SciHub插件将文献获取时间缩短95% 【免费下载链接】zotero-scihub A plugin that will automatically download PDFs of zotero items from sci-hub 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-scihub 在数字化学术研…

作者头像 李华
网站建设 2026/4/24 21:44:23

5步实现B站视频跨平台播放:m4s转MP4完整指南

5步实现B站视频跨平台播放:m4s转MP4完整指南 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经为B站缓存的视频只能在特定客…

作者头像 李华