ApacheBench (ab) 总结
ApacheBench (ab) 测试工具的优点:
- 简单易用:ApacheBench 是一个轻量级、简单易用的性能测试工具,不需要复杂的配置和学习成本,适合快速进行简单的性能测试。
- 快速验证:能够快速验证 Web 服务器的性能表现或代码更改对性能的影响,可以在短时间内执行测试并查看结果。
- 支持并发请求:支持通过
-c
参数指定并发请求数,可以模拟多用户同时访问服务器的情况,评估服务器的并发处理能力。 - 支持多种输出格式:支持输出不同格式的测试结果,包括文本、CSV 和 Gnuplot 文件,便于后续分析和可视化。
ApacheBench (ab) 测试工具的缺点:
- 功能有限:相比于其他性能测试工具如 JMeter,ApacheBench 功能较为有限,主要用于简单的 HTTP 压力测试,不支持复杂的测试场景和高级功能。
- 不适用于复杂场景:对于需要模拟复杂用户行为、进行功能测试或需要定制化配置的测试场景,ApacheBench 的能力有限,无法满足需求。
- 缺乏图形界面:ApacheBench 没有图形用户界面,所有操作都需要通过命令行完成,对于不熟悉命令行操作的用户来说可能不够友好。
- 无法模拟真实用户行为:ApacheBench 主要用于模拟并发请求,无法模拟真实用户的各种操作行为,例如页面浏览、点击等,因此无法完全评估应用程序的性能。
- 仅支持 HTTP 协议:ApacheBench 仅支持 HTTP 协议,无法测试其他类型的协议和应用,如 HTTPS、WebSocket 等。
结论:
ApacheBench 是一个简单、快速的性能测试工具,适用于简单的 HTTP 压力测试场景,它能够模拟多个并发的HTTP请求,以评估服务器的性能、稳定性,但在复杂的测试场景和高级功能需求方面存在一定的局限性
官网:ab - Apache HTTP 服务器基准测试工具 - Apache HTTP Server 版本 2.4
安装
Win安装:
首先,需要安装 Apache 服务器,下载地址:Apache VS17 binaries and modules download (apachelounge.com)
64位操作系统选择上面的一个压缩包,如下图所示
下载后解压,得到如下目录:
打开cmd命令,进入Apache Bench 的bin目录,启动 abs.exe
,如下图所示
Linux安装:
yum安装【不推荐】
yum -y install httpd-tools
测试安装是否成功:
ab -V
参数说明
用法:ab [选项] [http[s]://]hostname[:port]/path
选项包括:
-n requests 执行的请求数量 【***】
-c concurrency 同时进行的多个请求数量【并发】【***】
-t timelimit 用于性能测试的最大时间(秒)【***】
这意味着 -n 默认为 50000
-s timeout 每个响应的最大等待时间(秒)
默认为 30 秒
-b windowsize TCP 发送/接收缓冲区的大小(字节)
-B address 进行出站连接时要绑定的地址
-p postfile 包含要 POST 的数据的文件。也要设置 -T 【***】
-u putfile 包含要 PUT 的数据的文件。也要设置 -T
-T content-type 用于 POST/PUT 数据的 Content-type 头,例如 【***】
'application/x-www-form-urlencoded'
默认为 'text/plain'
-v verbosity 输出更详细的信息,包括每个请求的响应、连接状态、请求处理时间等 【***】
-w 以 HTML 表格形式打印结果 【***】
-i 使用 HEAD 而不是 GET,HEAD 方法不返回响应主体,只返回响应头信息
-x attributes 作为表属性插入的字符串
-y attributes 作为 tr 属性插入的字符串
-z attributes 作为 td 或 th 属性插入的字符串
-C attribute 添加 Cookie,例如 'Apache=1234'(可重复) 【***】
-H attribute 添加任意的头行,例如 'Accept-Encoding: gzip'
插入在所有正常头行之后(可重复)
-A attribute 添加基本的 WWW 身份验证,属性
是用冒号分隔的用户名和密码。
-P attribute 添加基本的代理身份验证,属性
是用冒号分隔的用户名和密码。
-X proxy:port 要使用的代理服务器和端口号
-V 打印版本号并退出
-k 使用 HTTP KeepAlive 功能,即在同一个连接上执行多个请求 【***】
-d 不显示响应百分比表格。
-S 不显示置信估计和警告。
-q 在执行超过 150 个请求时不显示进度
-g filename 将收集的数据输出到 gnuplot 格式文件中。
-e filename 输出百分比服务的 CSV 文件
-r 在套接字接收错误时不退出。
-h 显示使用信息(此消息)
-Z ciphersuite 指定 SSL/TLS 密码套件(请参见 openssl ciphers)
-f protocol 指定 SSL/TLS 协议
(SSL3、TLS1、TLS1.1、TLS1.2 或 ALL)
请求方法
1. GET请求:
get请求,请求100次,并发10
ab -n 100 -c 10 http://192.168.31.247:9999/notice/selectById/2
结果报告分析:
[root@localhost ~]# ab -n 100 -c 10 http://192.168.31.247:9999/notice/selectById/2
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 192.168.31.247 (be patient).....done // 正在对 192.168.31.247 进行性能测试,测试已完成
Server Software: // 服务器软件类型
Server Hostname: 192.168.31.247 // 服务器主机名
Server Port: 9999 // 服务器端口号
Document Path: /notice/selectById/2 // 请求路径
Document Length: 152 bytes // 返回内容长度
Concurrency Level: 10 // 并发连接数 【**】
Time taken for tests: 0.078 seconds // 测试总耗时
Complete requests: 100 // 完成的请求数量
Failed requests: 0 // 失败的请求数量
Write errors: 0 // 写入错误数
Total transferred: 25700 bytes // 总传输字节数
HTML transferred: 15200 bytes // HTML 内容传输字节数
Requests per second: 1282.68 [#/sec] (mean) // 每秒完成的请求数【**】
Time per request: 7.796 [ms] (mean) // 每个请求的平均响应时间 【**】
Time per request: 0.780 [ms] (mean, across all concurrent requests) // 每个请求的平均处理时间(考虑到并发)
Transfer rate: 321.92 [Kbytes/sec] received // 传输速率
Connection Times (ms) // 连接时间统计 【**】
min mean[+/-sd] median max
Connect: 1 1 0.6 1 4 // 连接时间的最小、平均、中位数、最大值
Processing: 3 6 4.1 4 21 // 处理时间的最小、平均、标准偏差、中位数、最大值
Waiting: 2 5 4.1 4 21 // 等待时间的最小、平均、标准偏差、中位数、最大值
Total: 3 7 4.1 6 22 // 总时间的最小、平均、标准偏差、中位数、最大值
Percentage of the requests served within a certain time(ms) //各时间段内完成请求的百分比【**】
50% 6 // 50% 的请求在 6 毫秒内完成
66% 7
75% 7
80% 8
90% 15
95% 20
98% 21
99% 22
100% 22 (longest request) // 所有请求中最长的请求在 22 毫秒内完成
几个比较重要的参数:
- Concurrency Level:这个参数表示同时发起的并发连接数,它反映了测试中模拟的负载情况。并发连接数的增加可能会增加服务器负载,从而影响性能。
- **Requests per second **:这个指标表示系统在单位时间内可以处理的请求数量。它是评估系统吞吐量的关键指标,越高表示系统的处理能力越强大。
- Time per request:它表示每个请求的平均响应时间,包括服务器处理请求的时间以及网络传输时间。较低的响应时间通常意味着更快的性能。
- **Connection Times **:这个部分提供了连接时间的统计信息,包括连接建立时间、处理时间、等待时间等。它可以帮助识别潜在的性能瓶颈,例如连接建立时间过长或者处理时间过长等。
- **Percentage of the requests served within a certain time **:这个部分显示了在不同时间范围内完成请求的百分比。它可以帮助了解系统的响应时间分布情况,从而评估系统在不同负载条件下的性能表现。
其他
在 5 秒内尽可能多地发送请求,-n 默认为 50000
ab -t 5 http://192.168.31.247:9999/notice/selectById/2
-v
参数用于设置输出的详细程度。-v
参数后面可以跟一个数字,表示输出的详细程度级别
-v 0
: 仅显示结果摘要。只输出每个请求的结果摘要,包括请求总数、成功数、失败数、总时间等,不显示任何调试信息。-v 1
: 显示请求结果摘要以及警告信息。输出每个请求的结果摘要,并在发生警告时显示警告信息。-v 2
: 显示请求结果摘要、警告信息以及调试信息。除了请求结果摘要和警告信息外,还会显示调试信息,例如连接信息、请求头信息等。-v 3
或-v 4
: 输出详细的调试信息。这个级别会输出更详细的调试信息,包括每个请求的完整信息、响应信息等
ab -n 10 -c 2 -v 4 http://192.168.31.247:9999/notice/selectById/2
将测试结果输出到.txt格式的文件中
ab -n 10 -c 2 http://192.168.31.247:9999/notice/selectById/2 > result.txt
将测试结果输出到.csv格式的文件中
ab -n 10 -c 2 -e result.csv http://192.168.31.247:9999/notice/selectById/2
将测试结果输出到.gp格式的文件中
ab -n 10 -c 2 -g result.gp http://192.168.31.247:9999/notice/selectById/2
结果文件:
[root@localhost ab]# cat result.gp
starttime seconds ctime dtime ttime wait
Thu Mar 21 14:55:58 2024 1711004158 0 3 3 3
Thu Mar 21 14:55:58 2024 1711004158 0 3 4 3
Thu Mar 21 14:55:58 2024 1711004158 0 4 4 4
Thu Mar 21 14:55:58 2024 1711004158 1 4 5 4
Thu Mar 21 14:56:01 2024 1711004161 0 5 5 5
Thu Mar 21 14:55:58 2024 1711004158 1 7 8 7
Thu Mar 21 14:55:58 2024 1711004158 1004 7 1011 7
Thu Mar 21 14:55:59 2024 1711004159 3004 3 3007 3
Thu Mar 21 14:55:58 2024 1711004158 3008 4 3012 4
Thu Mar 21 14:56:01 2024 1711004161 7014 3 7018 3
starttime
: 测试开始的时间戳。seconds
: 从测试开始到请求完成的时间(秒)。ctime
: 建立连接所花费的时间(毫秒)。dtime
: 完成 DNS 查询所花费的时间(毫秒)。ttime
: 完成请求到收到响应的时间(毫秒)。wait
: 服务器处理请求到发送响应的时间(毫秒)。
-w
以 HTML 表格形式打印结果
ab -n 100 -c 10 -w http://192.168.31.247:9999/notice/selectById/2
2. POST请求
json参数(application/json
)
ab -n 10 -c 5 -p post_data.txt -T "application/json" http://192.168.31.247:9999/notice/add
表单数据(application/x-www-form-urlencoded
)
ab -n 10 -c 5 -p form.txt -T application/x-www-form-urlencoded http://192.168.31.247:9999/test/form
表单数据(multipart/form-data
),这种类型的参数用于在 HTTP 请求中传输复杂的表单数据,可以包含文件、文本等多种类型的数据
ab -n 2 -c 2 -p multipart_data.txt -T "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW" http://192.168.31.247:9999/file/upload
3. HEAD请求:
HEAD 请求是 HTTP 协议中的一种请求方法,它类似于 GET 请求,但服务器只返回请求行和头部信息,而不返回实际的内容主体
ab -n 100 -c 10 -i http://192.168.31.247:9999/notice/selectById/2
4. PUT请求:
json参数(application/json)
ab -n 100 -c 10 -u put_data.txt -T application/json http://192.168.31.247:9999/notice/update
5. DELETE请求:
ab -n 1000 -c 10 -k -m DELETE http://192.168.31.247:9999/notice/delete/25
注意事项
- 在进行测试时,遵守目标服务器的使用规定,避免对其造成不必要的负担。
- 在测试时要确保网络连接稳定,避免因网络问题导致的测试结果不准确。
- 在进行大规模测试时,要考虑服务器资源限制以及网络带宽的影响,避免因测试造成的服务器性能下降。
遇到的问题
1. 非法选项 -m
测试DELETE方法的时候,使用-m参数,指定请求方法,出现非法选项 -m 的错误
原因:
查阅官方文档,发现 -m参数,在 version >= 2.4.10 时才可用。
查看我的Apache Bench版本为2.3
解决办法:
升级版本:从源代码安装
最新版本下载链接:Download - The Apache HTTP Server Project
#解压缩源代码:使用 gzip 解压缩 .tar.gz 文件
gzip -d httpd-2.4.58.tar.gz
#解压缩 .tar 文件
tar xvf httpd-2.4.58.tar
#进入解压缩后的Apache HTTP服务器源代码目录
cd httpd-2.4.58
#执行 configure 脚本以配置编译选项
./configure --prefix=/usr/local/apache2
#使用 make 命令进行编译
make
#执行 make install 命令,安装到指定的目录
make install
#编辑配置文件:通过编辑 Apache 配置文件来配置服务器。您可以使用 vi 或其他文本编辑器来编辑 /usr/local/apache2/conf/httpd.conf 文件,进行必要的配置更改,默认即可
vi /usr/local/apache2/conf/httpd.conf
#启动 Apache 服务器
/usr/local/apache2/bin/apachectl -k start