一、前言

在日常工作当中,开发人员通常需要对相关接口进行基本的的性能测试,相对于一些功能齐全但门槛较高的测试工具,一款部署、使用都比较简单的工具是个不错的选择,下面就简单说说这其中一款比较好用的工具——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 requestsServer 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/sConnection Times (ms)                       //* 网络耗时 (依次是:最小、平均、标准偏差、中位数、最大) ,单位:msmin  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    1927Percentage of the requests served within a certain time (ms)   //* 请求耗时分布情况百分比 ,单位:ms 50%     8266%    10575%    13480%    28490%    321                                                  //* 表示 90%的请求在 321ms 内得到服务端响应结果95%    36798%    74699%   1038100%   1927 (longest request)

以上,就是ab最常用的一个测试命令,以及测试结果报告,是不是很简单!

当然,此处有必要对其中相关请求参数含义,以及测试报告中参数含义进一步说明:

  1. ab压测命令中,-c 后的数字表示并发用户数 ,-n 后的数字表示总请求次数,最后面的地址表示需要测试的接口地址;(通常情况下,我们使用这2个参数就已经可以满足基本需求了)
  2. 测试结果中,最开始是ab工具的版本信息,然后是逐步输出的已完成的请求数,其它各行结果的关键信息含义,笔者已简单标记说明;(//*后面的注释)
  3. 关于Failed requests下参数说明:
参数 说明
Connect 请求连接失败数,即发起请求建立连接过程中失败次数。
Receive 接收失败数,即接收响应结果过程中失败次数。
Length 响应内容长度不一致失败数,即多次请求的响应结果数据长度不一致次数。其根据 Content-Length 判断,如果说一个接口的响应结果 是动态的页面或者说响应报文,会以第一次请求响应结果的 Content-Length为基准,后续请求的Content-Length值与其进行对比,如果不一致,则会算一次该错误。所以,如果一个接口的响应结果是动态的,那么存在该错误结果是合理的,不用慌。
Exceptions 其它异常失败数,即以上几种失败原因外,其它的失败次数。
  1. 几个关键指标进一步说明:
序号 指标 说明
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内处理完成的。通常来说,由于测试本身的存在一定误差性,所以各百分比内的耗时也是非常具有参考价值的指标
  1. 其它更多相关请求参数、响应参数含义,可参考: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、关于动态参数,笔者没有发现,如确有需求,换工具吧。

使用apache ab进行压测详解相关推荐

  1. sysbench 压测 详解

    下载sysbench(mysql官网就有) 解压,进入解压以后的目录 ./autogen.sh ./configure --with-mysql-includes=/usr/local/mysql/i ...

  2. sysbench数据库性能压测详解

    文章目录 0.参考资料&适用范围 1.安装 2.压测 2.1.CPU压测 2.2.MySQL数据库压测 2.2.1.选项说明 2.2.2.压测步骤 0.参考资料&适用范围 参考资料: ...

  3. Apache + Tomcat集群配置详解(1)

    Apache + Tomcat集群配置详解(1) 一.软件准备 Apache 2.2 : http://httpd.apache.org/download.cgi,下载msi安装程序,选择no ssl ...

  4. linux apache两种工作模式详解

    apache两种工作模式详解 刚接触这两个配置时很迷糊,全部开启或全部注释没有几多变化.今天搜索到这么一篇讲得还不错的文章,看了几篇,还是不能完全记住,做一个收藏. 空闲子进程:是指没有正在处理请求的 ...

  5. Linux学习之zImage内核镜像解压过程详解

      zImage内核镜像解压过程详解 收藏 zImage内核镜像解压过程详解 作者: 刘洪涛,华清远见嵌入式培训中心 讲师. 本文以linux-2.6.14内核在S3C2410平台上运行为例,讲解内核 ...

  6. linux tar.xz 解压命令,Linux下.tar.xz文件的解压教程详解

    前言 对于xz这个压缩相信很多人陌生,但xz是绝大数linux默认就带的一个压缩工具,xz格式比7z还要小. 最近在下载某个源码包的时候遇到的这种压缩格式,乘此机会分享一下xz的压缩与解压方法. 安装 ...

  7. 搭建 Apache Jmeter 分布式压测与监控

    1.前言 对于运维工程师来说,需要对自己维护的服务器性能瓶颈了如指掌,比如我当前的架构每秒并发是多少,我服务器最大能接受的并发是多少,是什么导致我的性能有问题:如果当前架构快达到性能瓶颈了,是横向扩容 ...

  8. tar压缩解压命令详解

    tar命令详解 -c:建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其 ...

  9. Apache 的 httpd.conf 属性详解(收藏)

    ServerRoot "/usr/local" ServerRoot用于指定守护进程httpd的运行目录,httpd在启动之后将自动将进程的当前目录改变为这个目录,因此如果设置文件 ...

最新文章

  1. Zabbix+shell监控报警任意web
  2. python拟合曲线误差分析_python曲线拟合不能给出合理的拟合结果
  3. python schedule运行了一遍说没有任务_python-schedule模块(定时任务)基于官方文档总结...
  4. 异或运算^和他的一个常用作用
  5. Java并发编程笔记—基础知识—实用案例
  6. 细节打满,IO 操作必须手动关闭?关闭流方法是否有顺序?
  7. Tmk吃汤饭(模拟)
  8. python全屏模式 spider_我可以使用PIL以全屏模式显示图像吗?
  9. 【进阶修炼】——改善C#程序质量(9)
  10. DataGridView使用技巧二:设置单元格只读
  11. 如何在Mac上设置语音整点报时
  12. Entity Framework 笔记(一)
  13. 河南科技大学计算机科学与技术专业多少分,2016年河南科技大学计算机科学与技术专业在陕西录取分数线...
  14. Android StickHeaderRecyclerView - 让recyclerview头部固定
  15. android深色模式省电吗,护眼又省电,深色模式真这么厉害?
  16. 深度学习---卷积神经网络+tensorflow实现
  17. 图层蒙版和快速蒙版、路径
  18. 剪辑视频时PR播放卡顿不连贯|如何修复Premiere软件中播放太卡问题
  19. 冯诺依曼结构和现代计算机结构模型
  20. vbs字符串正则_VBS正则表达式语法

热门文章

  1. 2020-记录不平凡的一年
  2. 计算机丢失xinput13.dll,Win10系统提示丢失xinput13dll如何解决?
  3. clover写入efi_[授人以渔] 黑苹果clover kext写入系统与硬盘Clover引导
  4. 《Mac---Clover引导问题》
  5. 通用java后台服务
  6. Confluent入门简介
  7. stetho 调试数据库_stetho是适用于android应用程序的最佳调试工具
  8. [Hive]HBaseIntegration:通过Hive读写HBase
  9. MATLAB#4解方程
  10. 讲究!字符串拆分还能这么玩