一、前言
在日常工作当中,开发人员通常需要对相关接口进行基本的的性能测试,相对于一些功能齐全但门槛较高的测试工具,一款部署、使用都比较简单的工具是个不错的选择,下面就简单说说这其中一款比较好用的工具——ApacheBench 。(简称ab)
二、什么是ab
ab最早是apache服务器自带的基准测试小工具,其可以方便地对http服务器进行基准性能测试,对部署机器配置要求较低,部署简单、上手门槛较低,非常适用于对应用接口进行一些基本的性能测试。(可以单独只安装ab测试工具)
三、安装
ab测试工具本身有windows、unix、类unix等多个安装版本,笔者此处以centOS下的安装作为示例:
执行命令:
sudo yum -y install httpd-tools

以上,就是ab的安装了,就一条命令,是不是很简单!(yum命令会自动安装相关依赖包)
安装完成后,可查看版本信息,执行命令 ab -v :

可以看到,笔者通过 yum 命令安装的ab版本为2.3 ;(笔者的centos版本为7.6)
当然,如果你想自己下载安装包编译安装指定版本(写此文时,官方最新released版本是2.4.41),当然也是可以的,只是如果系统有些依赖工具包没有安装的话,还需要先安装相关依赖包,如果不是确实有必要的话,笔者不是很建议,因为稍显麻烦,具体操作方法可参考:http://httpd.apache.org/docs/2.4/install.html 。
此处,再放一个windows版本的下载地址:https://www.apachelounge.com/download/
四、开始使用
一个基础例子
执行命令:
ab -c 10 -n 1000 http://www.baidu.com/
执行结果:
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 www.baidu.com (be patient)
Completed 100 requests //* 已完成请求数
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
Server Software: BWS/1.1 //* 请求的服务器名称、版本号
Server Hostname: www.baidu.com //* 请求的地址
Server Port: 80 //* 请求的端口号
Document Path: / //* 请求的绝对路径,即具体接口名称
Document Length: 199875 bytes //* 响应数据的大小
Concurrency Level: 10 //* 并发用户数
Time taken for tests: 14.567 seconds //* 测试总耗时 ,单位:s
Complete requests: 1000 //* 总请求数
Failed requests: 988 //* 失败总请求数
(Connect: 0, Receive: 0, Length: 988, Exceptions: 0)
Write errors: 0 //* 发送请求失败的次数
Total transferred: 198476425 bytes //* 从服务端收到的总字节数
HTML transferred: 197338475 bytes //* 从服务端收到的总文档字节数,即不包含Total transferred中的HTTP头信息
Requests per second: 68.65 [#/sec] (mean) //* 平均每秒请求数,即吞吐量
Time per request: 145.672 [ms] (mean) //* 平均每次请求并发用户总耗时,即 该值=平均每次请求耗时 * 并发数 ,单位:ms
Time per request: 14.567 [ms] (mean, across all concurrent requests) //* 平均每次请求耗时 ,单位:ms
Transfer rate: 13305.53 [Kbytes/sec] received //* 服务端每秒响应的数据大小,单位: kb/s
Connection Times (ms) //* 网络耗时 (依次是:最小、平均、标准偏差、中位数、最大) ,单位:ms
min mean[+/-sd] median max
Connect: 6 16 89.3 8 1011
Processing: 22 127 160.5 73 1919
Waiting: 8 23 53.5 10 499
Total: 28 143 182.4 82 1927
Percentage of the requests served within a certain time (ms) //* 请求耗时分布情况百分比 ,单位:ms
50% 82
66% 105
75% 134
80% 284
90% 321 //* 表示 90%的请求在 321ms 内得到服务端响应结果
95% 367
98% 746
99% 1038
100% 1927 (longest request)
以上,就是ab最常用的一个测试命令,以及测试结果报告,是不是很简单!
当然,此处有必要对其中相关请求参数含义,以及测试报告中参数含义进一步说明:
- ab压测命令中,
-c后的数字表示并发用户数 ,-n后的数字表示总请求次数,最后面的地址表示需要测试的接口地址;(通常情况下,我们使用这2个参数就已经可以满足基本需求了) - 测试结果中,最开始是ab工具的版本信息,然后是逐步输出的已完成的请求数,其它各行结果的关键信息含义,笔者已简单标记说明;(
//*后面的注释) - 关于Failed requests下参数说明:
| 参数 | 说明 |
|---|---|
| Connect | 请求连接失败数,即发起请求建立连接过程中失败次数。 |
| Receive | 接收失败数,即接收响应结果过程中失败次数。 |
| Length | 响应内容长度不一致失败数,即多次请求的响应结果数据长度不一致次数。其根据 Content-Length 判断,如果说一个接口的响应结果 是动态的页面或者说响应报文,会以第一次请求响应结果的 Content-Length为基准,后续请求的Content-Length值与其进行对比,如果不一致,则会算一次该错误。所以,如果一个接口的响应结果是动态的,那么存在该错误结果是合理的,不用慌。 |
| Exceptions | 其它异常失败数,即以上几种失败原因外,其它的失败次数。 |
- 几个关键指标进一步说明:
| 序号 | 指标 | 说明 |
|---|---|---|
| 1 | Requests per second | 平均每秒请求数,表示服务接口吞吐量,这是衡量服务接口性能非常重要的一个指标。 计算公式-> value=Complete requests(总请求数) / Time taken for tests(处理完所有请求总耗时) 。 |
| 2 | Time per request | 平均每次请求耗时(ms)。这也是衡量服务处理能力的非常重要指标。 计算公式-> 第一个值: value1=1000 * Concurrency Level(并发用户数)* Time taken for tests(处理完所有请求总耗时) / Complete requests(总请求数) 第二个值: value2=1000 * Time taken for tests(处理完所有请求总耗时) / Complete requests(总请求数) |
| 3 | Transfer rate | 服务端响应数据大小(kb/s)。该指标可用于衡量服务器出口网络带宽是否达到瓶颈,对于响应体很大的接口,该指标很有参考意义。 计算公式-> value=1024 * Total transferred(总响应数据字节数) / Time taken for tests(处理完所有请求总耗时) |
| 4 | Percentage of the requests served within a certain time (ms) | 请求耗时分布情况,即总请求次数中指定百分比内的耗时是多少,如:90%以内的请求是321ms内处理完成的。通常来说,由于测试本身的存在一定误差性,所以各百分比内的耗时也是非常具有参考价值的指标 |
- 其它更多相关请求参数、响应参数含义,可参考:http://httpd.apache.org/docs/2.4/programs/ab.html
五、进阶使用,更多测试场景、示例
通过前面几节的讲解,ab的基本使用其实就算是已经入门了。通常,我们使用ab测试的时候,使用最多的参数 就是 -c 、-n 了, 但实际上ab还有不少其它参数可以使用,从而满足特定场景需求,我们可以使用命令 ab -h 查看ab工具所有的参数及其含义解释。
此处给出几个具体命令示例。
例1:
普通 get 无参接口。
直接执行命令。(为便于理解,后续例子中,-c 、-n参数都给2 、10)
命令示例:
ab -c 2 -n 10 http://127.0.0.1:8080/hello/first
例2:
普通 get 带参接口。
直接在接口URL后添加相关参数即可,需要注意的是,此时整个URL需要用引号包起来,否则会识别不了&符号后的参数。
命令示例:
ab -c 2 -n 10 "http://127.0.0.1:8080/hello/second?name=jack&age=18"
例3:
普通 post 带参接口。
一定要带参数 -p 、-T ,否则,测试结果报告中存在 Non-2xx responses 错误选项,且值为总请求数,这个说明服务端并没有正确响应结果。(从服务端日志也可以看出来)
-p参数[小写]表示以post方式发起请求,后面为参数文件绝对路径(笔者直接放在执行命令的当前目录下,所以可以找到文件),文件参数格式如下:
name=jack&age=16
-T参数表示 content-type (媒体类型信息)。
命令示例:
ab -c 2 -n 10 -p 'postdata.txt' -T 'application/x-www-form-urlencoded' http://127.0.0.1:8080/hello/third
其它几个比较有用的参数说明:
-e filename.csv : 将最终测试结果中的百分比值明细输出到指定文件,可以更精确的查看测试结果中的耗时百分比信息。
-C 'token=tokenvalue&uid=123456' : 设置cookie中的值,用于需要在cookie中传参的接口。(大写C ,如登录校验)。
-H 'Cookie: Key1=Value1; Key2=Value2' :在请求头中传递参数,用于一些需要在请求头中传参的接口。
-t timelimit : 表示基准测试的最大秒数,即不管正常测试完成需要多长时间,加上该参数后都会在这个指定时间结束测试(默认没有时间限制)。
六、小结
1、测试可能因各种环境问题引起一定误差,所以ab测试结果也只能说作为一个参考依据;
2、压测过程中,要逐步施压,逐步压出服务接口的最大性能(或者预期的最低性能要求),不要一下就进行很大的压测压力;
3、服务接口的吞吐量 和并发用户数是有关系的,一般来说,在系统承载能力内,提高用户并发数,压测可以逐步测出服务接口的最大吞吐量;
4、ab毕竟是一个小的测试工具,其能够发起的施压能力是有限的(受施压机机器配置、操作系统等限制),想通过ab发起几万甚至几十万的并发请求,这个是不合理的;
5、并发用户数、并发连接数是两个不同的概念,要注意区分;
6、关于动态参数,笔者没有发现,如确有需求,换工具吧。

本文介绍ApacheBench(ab)性能测试工具的安装与使用方法,包括基本命令、参数解析及测试报告解读,适合初学者快速上手。


被折叠的 条评论
为什么被折叠?



