摘要:在网上找了很多关于windows安装Apache ab安装及压力测试的,但是很遗憾失败的好多,贡献一下我自己测的吧。

ab 是apachebench的缩写。

ab命令会创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行访问。它的测试目标是基于URL的,因此,它既可以用来测试apache的负载压力,也可以测试nginx、lighthttp、tomcat、IIS等其它Web服务器的压力。

ab命令对发出负载的计算机要求很低,它既不会占用很高CPU,也不会占用很多内存。但却会给目标服务器造成巨大的负载,其原理类似CC攻击。自己测试使用也需要注意,否则一次上太多的负载。可能造成目标服务器资源耗完,严重时甚至导致死机。

一:安装

1)打开网址下载:http://httpd.apache.org/download.cgi

选择 Files for Microsoft Windows
图片引用

2)直接选择 ApacheHaus
图片引用

3)我windows10的系统选择【Apache 2.4.41 x64】点击后会弹出一个下载点击下载就好。
图片引用

4)文件解压到本地文件夹下,如果不是解压在c盘,需要设置参数:
- 解压文件后里面有一个【Apache24】的文件夹,将这个文件夹放到你需要存放的盘符中
- 我的解压到了D盘下,需要设置参数,打开conf文件夹中的 --> httpd.conf文件 使用文本编辑器打开

需要修改的有三个地方:
1> 运行根目录,修改成自己解压到本地的路径
注:Define SRVROOT的意思是定义了一个名为SRVROOT的变量
例如APACHE安装目录是c:/apache24,则Define SRVROOT=“c:/apache24”
这样后没再需要使用这个路径的时候,输入${SRVROOT}就可以了
图片引用
2> 监听端口,默认监听端口是80,如果已被使用会报错需要修改,如果80端口未被使用,可不修改;如果修改了监听端口,则需要把ServerName localhost也相应改成同样的端口号
图片引用
3> DocumentRoot 测试文件存放地,且该目录必须存在(我这里在Apache24文件夹下创建了test文件夹)
图片引用

配置完成后,进入D:Apache24/bin目录下(也就是你的程序目录),按Shift同时右击,选择 在此处打开命令窗口运行 【httpd.exe -k install】
(注意:要使用管理员权限打开命令行)
如图完成(我这里有个错误不必纠结,你前面的目录要保证存在就不会有错误)
图片引用

如何启动、关闭?

【services.msc】

找到apache2.4,可以在左侧点击重启、关闭;第二种可以使用命令启动:httpd.exe -k start
图片引用
图片引用
第二种还是进入bin目录执行命令就好

二:测试

1)首先进入到apache27\bin的目录中
使用命令【ab】出现如下,可以看到参数的含义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
D:\utils\Apache24\bin>ab
ab: wrong number of arguments
Usage: ab [options] [http://]hostname[:port]/path
Options are:
-n requests Number of requests to perform(要执行的请求数)
-c concurrency Number of multiple requests to make at a time(一次要发出的多个请求的数量)
-t timelimit Seconds to max. to spend on benchmarking(最大秒数。用于基准测试)
This implies -n 50000
-s timeout Seconds to max. wait for each response(超时。等待每个响应)
Default is 30 seconds(默认30s)
-b windowsize Size of TCP send/receive buffer, in bytes(TCP发送/接收缓冲区的大小,以字节为单位())
-B address Address to bind to when making outgoing connections(地址,以便在进行对外连接时绑定到)
-p postfile File containing data to POST. Remember also to set -T()
-u putfile File containing data to PUT. Remember also to set -T()
-T content-type Content-type header to use for POST/PUT data, ()
eg. 'application/x-www-form-urlencoded'
Default is 'text/plain'
-v verbosity How much troubleshooting info to print()
-w Print out results in HTML tables()
-i Use HEAD instead of GET()
-x attributes String to insert as table attributes()
-y attributes String to insert as tr attributes()
-z attributes String to insert as td or th attributes()
-C attribute Add cookie, ()
eg. 'Apache=1234'. (repeatable)
-H attribute Add Arbitrary header line,()
eg. 'Accept-Encoding: gzip'
Inserted after all normal header lines. (repeatable)
-A attribute Add Basic WWW Authentication, the attributes
are a colon separated username and password.
-P attribute Add Basic Proxy Authentication, the attributes
are a colon separated username and password.
-X proxy:port Proxyserver and port number to use
-V Print version number and exit
-k Use HTTP KeepAlive feature
-d Do not show percentiles served table.
-S Do not show confidence estimators and warnings.
-q Do not show progress when doing more than 150 requests
-l Accept variable document length (use this for dynamic pages)
-g filename Output collected data to gnuplot format file.
-e filename Output CSV file with percentages served
-r Don't exit on socket receive errors.
-m method Method name
-h Display usage information (this message)

D:\utils\Apache24\bin>

2)首先测试最简单的【无参数请求】
【ab -c 10 -n 10 http://localhost:8085/add】
参数解释:
-n :请求数
-c: 并发数
图片引用

3)接着我们测试【get方法带参数】直接在url后面带参数即可
【ab -c 10 -n 10 http://localhost:8085/add?ceshi=nihao】
图片引用

4)模拟post请求
首先你需要在你的当前目录也就是D:\Apache24\bin目录下创建一个post.txt的文件(当然你也可以自己命名),内容格式为【id=001&name=java】
图片引用

【ab -n 100 -c 10 -p post.txt -T application/x-www-form-urlencoded http://localhost:8085/add】
这里你要特别注意:你是否发现你在网上有很多都是加引号的,我明确告诉你不要加任何一个引号使用空格,因为我测试的使用引号是错误的(最后一个值可以加但是还是不加的好)

顺便把后端接收参数的代码也发出来吧

1
2
3
4
5
6
7
8
@RequestMapping(value = "/add",method = RequestMethod.POST)
public Integer add(HttpServletRequest request){

String ceshi = request.getParameter("id");
String name = request.getParameter("name");

return 1;
}

如果你创建post.txt文件不在bin目录中那么你需要这样写(例如在D盘下的post.txt)

【ab -n 100 -c 10 -p d:\post.txt -T application/x-www-form-urlencoded http://localhost:8085/add】

最后我们来测试如何使用post的方式传json格式的参数

post.txt中应该写成json格式的参数

1
2
3
4
{
"name":"小明",
"age":"18"
}

java后台的接收参数类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
* @Classname StatRequest
* @Description TODO
* @Date 2020/3/21 10:50
* @Created by lyc
*/
public class StatRequest {

private String name;

private int age;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}
}

java后台的的Controller

1
2
3
4
@RequestMapping(value = "/add",method = RequestMethod.POST)
public Integer add(@RequestBody StatRequest statRequest){
return 1;
}

最后执行命令(还是要进入到bin目录中的)
【application/json】是关键
【ab -n 100 -c 10 -p post.txt -T application/json http://localhost:8085/add】
图片引用

如果你还需要添加header请参考【使用命令【ab】出现如下,可以看到参数的含义】

测试结果主要看三个数据

1.Requests per second:吞吐率
服务器并发处理能力的量化描述,单位是reqs/s,指的是某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。
计算公式:总请求数 / 处理完成这些请求数所花费的时间,即
Request per second = Complete requests / Time taken for tests

2.Time per request:上面的是用户平均请求等待时间
处理完成所有请求数所花费的时间/ (总请求数 / 并发用户数),即
Time per request = Time taken for tests /( Complete requests / Concurrency Level)

3.Time per request:下面的是服务器平均请求处理时间
处理完成所有请求数所花费的时间 / 总请求数,即
Time taken for / testsComplete requests
可以看到,它是吞吐率的倒数。
同时,它也=用户平均请求等待时间/并发用户数,即
Time per request / Concurrency Level
可以根据固定并发数,增加请求次数或者固定请求次数,调整并发数来查看上面三个值得变化来调优服务器

也可以查看下图(我抄被人的也忘了是哪篇文章了,虽然有个错别字。还是要感谢)

图片引用