当前位置:网站首页>程序猿专属“压测工具”并发模拟
程序猿专属“压测工具”并发模拟
2022-07-13 18:06:00 【௸ོ 梦ོོღ醒ོൢོོ】
目录
前言
在项目开发中,我们有时候需要测试服务器的抗压和qps,需要同时有多个请求请求同一服务。比如我和你现在都同时在请求百度的服务器提供搜索。
大量的并发访问如果超出了服务器的承受能力的话,轻则导致服务器抛弃一部分请求,重则导致服务器资源耗尽,当机。
有一种攻击叫分布式拒绝服务攻击(DDOS),就是利用这个。使得大量的垃圾请求阻塞服务器,使得服务器无法处理正常的请求从而耗尽资源。
今天分享一下不使用压测工具来测试我们服务器的性能,程序员专属压测工具;
一、Postman
Postman 是一个款 HTTP 请求模拟工具;

首先演示一下 Postman 最基本的使用,创建一个 Spring Boot 项目,测试的代码如下:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("test")
public class TestConrtoller {
@GetMapping("demo")
public String testDemo() {
return "Hello world~";
}
} 
为了便于操作,一般会将
http://127.0.0.1:8080 是经常使用的地址+端口号,可以设置为环境,点击右上角的设置图标

选择 global;

输入IP,端口信息:

以后再进行测试就能这样搞简写了;

知道基本使用之后,我们来看一下如何模拟并发测试;

填写基本信息后,创建:

这个时候会创建出Concurrency的文件夹,我们可以把刚才测试的demo的例子放进这个文件夹下:


这个时候就可以在Concurrency下看到这个接口测试了;

选择并发测试:

这个时候弹出我们想要的框:

点击 Run Concurrency
你可以立马感觉到 CPU 在“燃烧”,因为要记录并打印日志,显示的话是一条一条来的,其实测试的速度,要比你看到的打印的日志的速度快,绿色表示正常;

二、Apache Bench(AB)
ApacheBench 是 Apache 服务器自带的一个web压力测试工具,简称ab。
ab又是一个命令行工具,对发起负载的本机要求很低,根据ab命令可以创建很多的并发访问线程,模拟多个访问者同时对某一URL地址进行访问,因此可以用来测试目标服务器的负载压力。总的来说ab工具小巧简单,上手学习较快,可以提供需要的基本性能指标,但是没有图形化结果,不能监控。
使用的话,首先需要安装 Apache 服务器
网站:传送门 http://httpd.apache.org/download.cgi
因为我的操作系统是 windows10, 这里选择 File for Microsoft Windows
Linux下的安装是非常简单的,这里不再演示:

选择 ApacheHaus:

进入下载页面 选择适合自己电脑的版本:

文件解压到本地文件夹下,如果不是解压在c盘,需要设置参数,注意文件路径最好都是英文,关于需要设置参数,conf->httpd.conf 使用文本编辑器打开,需要修改的有三个地方:


运行根目录,修改成自己解压到本地的路径:

监听端口,默认监听端口是80,如果已被使用会报错需要修改,如果80端口未被使用,可不修改;如果修改了监听端口,则需要把ServerName localhost也相应改成同样的端 口号:


DocumentRoot 测试文件存放地,且该目录必须存在;

配置完成后,命令行cmd进入 D:\softUtil\Apache24\bin 目录下:
httpd.exe -k install
启动:
httpd.exe -k start测试:
-n :请求数
-c: 并发数

三、并发模拟工具JMeter
JMeter也是一款性能测试工具,是图形化的。下载地址:传送门 http://jmeter.apache.org/;

需要 Java8+ 的环境:

解压到你觉得合适的目录下(注意最好是英文路径),进入它的 bin 目录下 启动 jmeter.bat 即可。 
使用很简单,首先在测试计划部分新建一个线程组:



设置好基础信息后添加HTTP请求(基本信息设置好没有OK哈,直接添加HTTP请求)

填写HTTP请求相关的内容:

之后还要添加监听器,这里选择是图形结果:

再添加一个查看结果树吧;

在运行之前打开log Viewer:

下面开始运行:

执行成功,来感受一下结果:

点进去:

查看结果树:

四、代码模拟
这里需要用到一个类,就是 CountDownLatch。CountDownLatch 是一个计数器闭锁,通过它可以完成类似于阻塞当前线程的功能,即:一个线程或多个线程一直等待,直到其他线程执行的操作完成。
CountDownLatch 用一个给定的计数器来初始化,该计数器的操作是原子操作,即同时只能有一个线程去操作该计数器。调用该类await方法的线程会一直处于阻塞状态,直到其他线程调用 countDown 方法使当前计数器的值变为零,每次调用 countDown 计数器的值减1。
当计数器值减至零时,所有因调用await()方法而处于等待状态的线程就会继续往下执行。这种现象只会出现一次,因为计数器不能被重置。下图和它的方法可以体现出来:

CountDownLatch类只提供了一个构造器:
public CountDownLatch(int count) { };然后下面这 3 个方法是 CountDownLatch 类中最重要的方法(上图能够反映出来);
public void await() throws InterruptedException { };
public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };
public void countDown() { };下面还需要看一个类 Semaphore
Semaphore 与 CountDownLatch 相似,不同的地方在于 Semaphore 的值被获取到后是可以释放的,并不像 CountDownLatch 那样一直减到底。
它也被更多地用来限制流量,类似阀门的 功能。如果限定某些资源最多有N个线程可以访问,那么超过N个主不允许再有线程来访问,同时当现有线程结束后,就会释放,然后允许新的线程进来。有点类似于锁的lock与 unlock过程。相对来说他也有两个主要的方法:
用于获取权限的acquire(),其底层实现与CountDownLatch.countdown()类似;用于释放权限的release(),其底层实现与acquire()是一个互逆的过程。
通过这两个类可以进行测试一下并发的模拟:
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.*;
@Slf4j
public class CuncurrencyTest {
public static int clientTotal = 5000;
public static int threadTotal = 200;
public static int count = 0;
public static void main(String[] args) throws InterruptedException {
ExecutorService executorService = Executors.newCachedThreadPool();
final Semaphore semaphore = new Semaphore(threadTotal);
final CountDownLatch countDownLatch = new CountDownLatch(clientTotal);
for (int i = 0; i < clientTotal; i++) {
executorService.execute(() -> {
try {
semaphore.acquire();
add();
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
log.error("exception",e);
}
countDownLatch.countDown();
});
}
countDownLatch.await();
executorService.shutdown();
log.info("count:{}",count);
}
private static void add() {
count++;
}
}因为 count 不是线程安全的,且没有作防护措施,结果是错的;

上面是对代码的并发模拟的简单形式,值得注意的是,这里提到的两个类不是专门做并发模拟,它们的用途很广泛,等之后更新Java网络编程的东西的时候,还会详细介绍它们。
无情的代码机器记录代码生活。。。。。。。。。。。。。
边栏推荐
- 2021/12/12 attack and defense world crypto question making record
- "Finally I left bytek..." confession of a test engineer with an annual salary of 40W
- 2-3 tree B tree b+ tree
- ABAP BAPI 复制标准项目模板实现项目立项
- 网络层协议
- 测试人的职场危机是35岁?不是,而是中年被裁!
- LVM与磁盘配额
- Five years' experience: the monthly salary is 3000 to 30000, and the change of Test Engineers
- VLAN和Trunnk
- 26岁,干了三年自动化,月薪才12k,能跳槽找到一个更高薪资的工作吗?
猜你喜欢

都说软件测试有手就行,每个人都能做,但为何每年仍有大批被劝退的?

Dictionary tree

TCP协议详解

It is said that software testing can be done by everyone, but why are there still a large number of people who are discouraged every year?

“终于我从字节离职了...“一个年薪40W的测试工程师的自白..

从功能测试到自动化测试,实现薪资翻倍,我整理的超全学习指南【附学习笔记】

Desired in appium_ Caps parameter record

to flash back

The core difference between fairness and unfairness of reentrantlock

POI框架学习-导入导出案例
随机推荐
How to solve the relationship between the two use cases?
滑动窗口详解
主从复制读写分离保姆级教学
Redis主从集群搭建及哨兵模式配置
【软件质量保障笔记】软件质量保障
How to quickly test the new product just taken over
Commodity module development
Basic introduction to flask 6 - Context
Desired in appium_ Caps parameter record
静态路由的原理和配置
c语言编译器介绍
【剑指Offer】链表专项总结
回溯
“终于我从字节离职了...“一个年薪40W的测试工程师的自白..
Du test de fonction au test automatique pour doubler le salaire, mon guide d'apprentissage Super complet [joindre les notes d'apprentissage]
Mvcc multi version concurrency control
NAT and pat principle and configuration
2021/12/12 attack and defense world crypto question making record
【LeetCode】307. 区域和检索 - 数组可修改
刚接手的新产品怎么快速展开测试