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

本文介绍了如何在Java环境中安装和配置ApacheJMeter,进行TCP服务器的压力测试,比较了无线程池和使用线程池情况下并发性能的变化,显示随着并发压力增大,线程池对性能的影响显著。
摘要由CSDN通过智能技术生成

前言

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

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

一、安装及配置

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

image.png

将文件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),一直选择到新建线程组,如下

image.png

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

image.png

image.png

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

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

image.png

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

image.png

2. 正式测试

首先启动服务端

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

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

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

image.png

其中

  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

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

  • 51
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
进行 JMeter 支持的并发支付接口压力测试,可以按照以下步骤进行: 1. 安装 JMeter:首先,确保你已经安装了 JMeter 测试工具。你可以从官方网站下载并根据指南进行安装。 2. 创建线程组:在 JMeter 中,线程组用于模拟并发用户。右键点击测试计划,选择添加 -> Threads (Users) -> Thread Group 来创建线程组。在线程组中设置线程数为 3500,以模拟 3500 个并发用户。 3. 添加 HTTP 请求:在线程组下,添加一个 HTTP 请求来模拟支付接口。右键点击线程组,选择添加 -> Sampler -> HTTP Request。在 HTTP 请求中设置目标 URL、请求方法和其他参数。 4. 配置参数化:如果你需要使用不同的参数进行测试,比如不同的用户、账号等信息,可以通过使用 CSV 数据文件或者使用 JMeter 的内置函数来实现参数化。 5. 添加监听器:监听器用于收集和分析测试结果。右键点击线程组,选择添加 -> Listener -> Summary Report,并根据需要添加其他监听器(如 Aggregate Report、View Results Tree 等)。 6. 配置压力测试参数:在线程组中,可以设置并发用户的启动时间、循环次数、持续时间等参数,以控制测试的压力。 7. 运行测试:点击工具栏上的运行按钮来启动测试。JMeter 将会模拟 3500 个并发用户对支付接口进行压力测试,并收集测试结果。 8. 分析结果:使用监听器显示的测试结果,可以分析响应时间、错误率、吞吐量等指标,以评估支付接口的性能。 请注意,在进行大规模并发压力测试时,确保目标系统具备足够的资源和性能来处理这些请求,并遵循合理的测试策略,以避免对生产环境造成过大的影响。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值