之前做性能调试的时候一直用的JMeter压测,最近发现一款简单易用的压力测试工具。 ab(Apache benchmark)是一款常用的压力测试工具,是Apache附带的一个小工具 , 专门用于HTTP Server的benchmark testing,可以同时模拟多个并发请求。

v基础知识

ab的原理:ab命令会创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行访问。它的测试目标是基于URL的,因此,它既可以用来测试apache的负载压力,也可以测试nginx、lighthttp、tomcat、IIS等其它Web服务器的压力。ab命令对发出负载的计算机要求很低,它既不会占用很高CPU,也不会占用很多内存。但却会给目标服务器造成巨大的负载,其原理类似CC攻击。自己测试使用也需要注意,否则一次上太多的负载。可能造成目标服务器资源耗完,严重时甚至导致死机。

先介绍几个性能指标。

吞吐率:服务器并发处理能力的量化描述,单位是reqs/s,指的是某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。

并发连接数:某一时刻服务器所接受的请求数(会话数)。

并发用户数:某一时刻服务器所接受的连接数,一个用户可能同时产生多个连接。

用户平均请求等待时间:总请求数 / 并发用户数。

服务器平均请求等待时间:处理完成所有请求数所花费的时间 / 总请求数。

PV: 即page view,页面浏览量,用户每一次对网站中的每个页面访问均被记录1次。用户对同一页面的多次刷新,访问量累计。

UV:即Unique visitor,独立访客,通过客户端的cookies实现。即同一页面,客户端多次点击只计算一次,访问量不累计。

IP: 即Internet Protocol,本意本是指网络协议,在数据统计这块指通过ip的访问量。即同一页面,客户端使用同一个IP访问多次只计算一次,访问量不累计。

TPS:即Transactions Per Second的缩写,每秒处理的事务数目。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数,最终利用这些信息作出的评估分。

QPS:即Queries Per Second的缩写,每秒能处理查询数目。是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。QPS=并发量 / 平均响应时间

RPS:即Requests Per Second的缩写,每秒能处理的请求数目。等效于QPS

vWindows安装ab test

1.1 下载地址

https://www.apachehaus.com/cgi-bin/download.plx

1.2 解压

用CMD命令行打开解压后的bin目录路径。

1.3 测试

ab -n 100 -c 10 http://toutou.com:8301/user/get?uid=1

-n 表示请求数,-c 表示并发数. -t 表示多少s内并发和请求

上面的命令测试总次数为100,并发数为10(相当于10个用户同时访问,他们总共访问100次)。

在解析返回结果之前,我们先来看看如果宿主机由Windows换成Linux后,如何在Linux上使用ab test。

vLinux安装ab test

2.1 安装ab test

yum -y install httpd-tools

ab -V

2.2 测试

v参数/返回结果

3.1 参数

用法:ab [选项] 地址

Usage: ab [options] [http[s]://]hostname[:port]/path

  1. -n requests #执行的请求数,即一共发起多少请求。
  2. -c concurrency #请求并发数。
  3. -t timelimit #测试所进行的最大秒数。其内部隐含值是-n 50000,它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。
  4. -s timeout #指定每个请求的超时时间,默认是30秒。
  5. -b windowsize #指定tcp窗口的大小,单位是字节。
  6. -B address #指定在发起连接时绑定的ip地址是什么。
  7. -p postfile #指定要POST的文件,同时要设置-T参数。
  8. -u putfile #指定要PUT的文件,同时要设置-T参数。
  9. -T content-type #指定使用POST或PUT上传文本时的文本类型,默认是'text/plain'。
  10. -v verbosity #设置详细模式等级。
  11. -w #将结果输出到html的表中。
  12. -i #使用HEAD方式代替GET发起请求。
  13. -y attributes #以表格方式输出时,设置html表格tr属性。
  14. -z attributes #以表格方式输出时,设置html表格th或td属性。
  15. -C attribute #添加cookie,比如'Apache=1234'。(可重复)
  16. -H attribute #为请求追加一个额外的头部,比如'Accept-Encoding: gzip'。(可重复)
  17. -A attribute #对服务器提供BASIC认证信任。用户名和密码由一个:隔开,并以base64编码形式发送。无论服务器是否需要(即,是否发送了401认证需求代码),此字符串都会被发送。
  18. -P attribute #对一个中转代理提供BASIC认证信任。用户名和密码由一个:隔开,并以base64编码形式发送。无论服务器是否需要(即, 是否发送了401认证需求代码),此字符串都会被发送。
  19. -X proxy:port #指定代理服务器的IP和端口。
  20. -V #打印版本信息。
  21. -k #启用HTTP KeepAlive功能,即在一个HTTP会话中执行多个请求。默认时,不启用KeepAlive功能。
  22. -d #不显示"percentage served within XX [ms] table"的消息(为以前的版本提供支持)。
  23. -q #如果处理的请求数大于150,ab每处理大约10%或者100个请求时,会在stderr输出一个进度计数。此-q标记可以抑制这些信息。
  24. -g filename #把所有测试结果写入一个'gnuplot'或者TSV(以Tab分隔的)文件。此文件可以方便地导入到Gnuplot,IDL,Mathematica,Igor甚至Excel中。其中的第一行为标题。
  25. -e filename #产生一个以逗号分隔的(CSV)文件,其中包含了处理每个相应百分比的请求所需要(从1%到100%)的相应百分比的(以微妙为单位)时间。由于这种格式已经“二进制化”,所以比'gnuplot'格式更有用。
  26. -r #当收到错误时不要退出。
  27. -h #输出帮助信息
  28. -Z ciphersuite 指定SSL/TLS密码套件
  29. -f protocol 指定SSL/TLS协议(SSL3, TLS1, TLS1.1, TLS1.2 or ALL)

3.2 返回结果

以上文中Linux ab test的结果集为例:

  1. [root@localhost ~]# ab -n 100 -c 10 http://toutou.com:8301/user/get?uid=1
  2. This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
  3. Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
  4. Licensed to The Apache Software Foundation, http://www.apache.org/
  5.  
  6. Benchmarking toutou.com (be patient).....done
  7.  
  8. #测试服务器的名字
  9. Server Software:
  10. #请求的URL主机名
  11. Server Hostname: toutou.com
  12. #web服务器监听的端口
  13. Server Port: 8301
  14.  
  15. #请求的URL中的根绝对路径
  16. Document Path: /user/get?uid=1
  17. #HTTP响应数据的正文长度
  18. Document Length: 131 bytes
  19.  
  20. # 并发用户数,这是ab命令中设置的-c参数
  21. Concurrency Level: 10
  22. #所有这些请求被处理完成所花费的总时间
  23. Time taken for tests: 1.274 seconds
  24. # 总请求数量,这是ab命令中设置的-n参数
  25. Complete requests: 100
  26. # 失败的请求数,这里的失败是指请求的连接服务器、发送数据、接收数据等环节发生异常,以及无响应后超时的情况。对于超时时间的设置可以用ab的-t参数。如果接受到的http响应数据的头信息中含有2xx以外的状态码,则会在测试结果显示另一个名为“Non-2xx responses”的统计项,用于统计这部分请求数,这些请求并不算是失败的请求。
  27. Failed requests: 0
  28. #写入错误
  29. Write errors: 0
  30. # 总的网络传输量(字节数),包含http的头信息等。使用ab的-v参数即可查看详细的http头信息。
  31. Total transferred: 25000 bytes
  32. # HTML内容传输量,实际的页面传递字节数。也就是减去了Total transferred中http响应数据中头信息的长度。
  33. HTML transferred: 13100 bytes
  34. # 每秒处理的请求数,服务器的吞吐量,等于:Complete requests / Time taken for tests(QPS)
  35. Requests per second: 78.48 [#/sec] (mean)
  36. # 用户平均请求等待时间
  37. Time per request: 127.425 [ms] (mean)
  38. # 服务器平均处理时间
  39. Time per request: 12.743 [ms] (mean, across all concurrent requests)
  40. # 平均每秒网络上的流量,即每秒收到的速率
  41. Transfer rate: 19.16 [Kbytes/sec] received
  42.  
  43. # 压力测试时的连接处理时间。-- min最小值、mean平均值、[+/-sd]方差、median中位数、maxz最大值
  44. Connection Times (ms)
  45. min mean[+/-sd] median max
  46. Connect: 0 1 0.3 0 1 # socket链路建立消耗,代表网络状况好
  47. Processing: 20 121 54.9 119 281 # 写入缓冲区消耗+链路消耗+服务器消耗
  48. Waiting: 13 99 48.7 93 234 # 写入缓冲区消耗+链路消耗+服务器消耗+读取数据消耗
  49. Total: 21 122 54.8 119 281 # 单个事务总时间
  50. ERROR: The median and mean for the initial connection time are more than twice the standard
  51. deviation apart. These results are NOT reliable.
  52.  
  53. Percentage of the requests served within a certain time (ms)
  54. 50% 119
  55. 66% 141
  56. 75% 148
  57. 80% 159
  58. 90% 201
  59. 95% 232
  60. 98% 268
  61. 99% 281
  62. 100% 281 (longest request)
  63. # 整个场景中所有请求的响应情况。在场景中每个请求都有一个响应时间,其中50%的用户响应时间小于119毫秒,66%的用户响应时间小于141毫秒,最大的响应时间小于281毫秒

3.3 从上面的返回结果可以得出以下数据:

1.整个测试持续的时间:1.274s

2.完成的请求数:1000

3.失败的请求数:0

4.总的网络传输量(字节数):25000 bytes

5.HTML内容传输量:13100 bytes

6.服务器的吞吐量:78.48 (QPS的稳定值应取决于失败请求为0时支持的最高并发)

7.用户平均请求等待时间:127.425ms

8.服务器平均处理时间:12.743ms

9.平均每秒网络上的流量: 19.16kb

10.99%的用户响应时间小于181ms

v遇到的问题

4.1.1: 错误描述

  1. apr_socket_recv: Connection reset by peer (104)
  2. Total of 2513 requests completed

4.1.2: 解决方案

这个参数的意思是当出现“receive error”,即接收数据错误时是否退出,默认是退出的,所以会出现上述的问题,在参数中加入 -r 参数即可。

4.2.1: 错误描述

  1. Benchmarking toutou.com (be patient)
  2. socket: Too many open files (24)

4.2.2: 解决方案

调整可以打开的文件数: ulimit -n 65535

v博客总结

1.ab判断成功与否知识判断 2xx 响应码,不接收服务器的返回值,所以同样的响应ab测试支持的并发数大于LR和Jemter,TPS的响应值也会比较大

2.ab运行的测试并发数与ab所运行的机器的cpu的颗粒度有很大的关系,cpu颗粒度越大,测试结果支持的并发数越大

3.ab不像LR或Jemter那么强大,但是它足够轻便,如果只是在开发过程中想检查一下某个模块的响应情况,或者做一些场景比较简单的测试,ab还是一个不错的选择。

其他参考/学习资料:

v源码地址

https://github.com/toutouge/javademosecond/tree/master/hellospringboot

作  者:请叫我头头哥


出  处:http://www.cnblogs.com/toutou/


关于作者:专注于基础平台的项目开发。如有问题或建议,请多多赐教!


版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。


特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信


声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是作者坚持原创和持续写作的最大动力!

#comment_body_3242240 { display: none }

ab test压力测试的更多相关文章

  1. kubernetes:基于ab的压力测试

    基于ab的压力测试 # cat apache-test.yaml ################################################################### ...

  2. 使用ab进行压力测试详解

    ab是apache自带的压力测试工具,非常好用.转载几篇对ab工具的详细使用的博文.猛击下面的链接地址 http://www.365mini.com/page/apache-benchmark.htm ...

  3. 网站appache的ab命令压力测试性能

    ①:相关不错的博文链接:http://johnnyhg.iteye.com/blog/523818 ②:首先配置好对应的环境上去,有对应的命令 ③:压力测试的指令如下: 1. 最基本的关心两个选项 - ...

  4. ab网站压力测试

    ab网站压力测试命令的参数.输出结果的中文注解    permalink 以前安装好APACHE总是不知道该如何测试APACHE的性能,现在总算找到一个测试工具了.就是APACHE自带的测试工具AB( ...

  5. 使用Apache ab进行压力测试(参数说明)

    我们一般会使用Apache自带的ab来对项目进行压力测试,看项目的执行情况如何. 我们可以使用 ab -v 来查看ab的详细参数使用方法. [root@node234 bin]# ./ab -v ab ...

  6. ab做压力测试

    ab是apache 自带的一个压力测试的小工具,可用于接口简单的压力测试. 以下是AB的简要介绍 格式:ab [options] [http://]hostname[:port]/path 参数说明: ...

  7. ubuntu下 使用AB做压力测试

    1最近刚开始接触apache大数据下数据优化,讲一下apache 下ab压力测试工具. 程序“ab”尚未安装. 您可以使用以下命令安装: apt-get install apache2-utils 以 ...

  8. 使用Apache的ab进行压力测试

    概述 ab是apache自带的压力测试工具,当安装完apache的时候,就可以在bin下面找到ab然后进行apache 负载压力测试. 后台测试开发中,常用的压力测试服务,php一般选择xampp,下 ...

  9. ab 站点压力测试工具

    ab--压力测试工具 前端时间由于需要测试一个网站的高并发的情况,使用到了一个ab测试工具,下面是我自己的体验及参考网上别人的博客所写,希望对大家有所帮助. ab工具简介 ab 全称:apache b ...

  10. Linux学习13-CentOS安装ab做压力测试

    前言 网站性能压力测试是服务器网站性能调优过程中必不可缺少的一,测试环境准备好了后,如何对网站做压力测试? 压力测试的工具很多,如:ab.http_load.webbench.siege.jmeter ...

随机推荐

  1. HBuilderX SVN地址更改(SVN服务器IP地址变更)

    HBuilderX编辑器中无法修改SVN地址,需要手动在SVN工具中修改 修改步骤: 1.右键编辑器中的SVN项目,选择打开文件所在目录 2.目录中空白处右键,选择TortoiseSVN --> ...

  2. GreenDao增删改查

    3.GreenDao增删改查 (1)插入 常用API //这是最简单的插入语句,新增一行数据,返回值为行号 public long insert(T entity) //传递一个数组,新增多行数据 p ...

  3. ERP出入库进阶操作与子流程--开源软件诞生28

    赤龙ERP出入库进阶讲解--第28篇 用日志记录"开源软件"的诞生 [进入地址 点亮星星]----祈盼着一个鼓励 博主开源地址: 码云:https://gitee.com/redr ...

  4. SFTP 连接服务器下载文件方法采坑说明

    本篇博客主要记录请求SFTP服务器的一些方法采坑情况. 采坑的方法说明: 1. cd():这个方法用于进入某个目录下. 默认情况,当连接SFTP服务器成功后直接进入用户目录,比如我连接自己本机SFTP ...

  5. 简单的 通过ID获取文件名称

    模型中的方法class 模型名{ /** * 通过ID获取文件名称 */ public static function getNameById($id) { $model = self::findOn ...

  6. Java进阶专题(十七) 系统缓存架构设计 (上)

    前言 ​ 我们将先从Redis.Nginx+Lua等技术点出发,了解缓存应用的场景.通过使用缓存相关技术,解决高并发的业务场景案例,来深入理解一套成熟的企业级缓存架构如何设计的.本文Redis部分总结 ...

  7. selenium调用JS实现自动化

    webdriver自带的api使用起来有局限性,比如下拉滚动条文本框输入,以及一些弹出框的操作,使用JS直接操作方便又灵活. 一:示例 from selenium import webdriver f ...

  8. python定时执行详解

    知识点 1. sched模块,准确的说,它是一个调度(延时处理机制),每次想要定时执行某任务都必须写入一个调度. (1)生成调度器:s = sched.scheduler(time.time,time ...

  9. Linux无法新增用户

    1.查看当前用户是否有权限创建用户 2.磁盘空间不足,vi打开/etc/passwd 报: E297: Write error in swap file"adduser.sh" 1 ...

  10. CentOS 7下使用systemctl为Nginx启用进程守护实现开机自启

    1.cd到指定目录 cd /usr/lib/systemd/system 2.创建nginx.service vi nginx.service 3.输入以下内容,路径为nginx安装路径 [Unit] ...