ab test压力测试

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

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

1.1 下载地址

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

ab test压力测试

1.2 解压

ab test压力测试

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

ab test压力测试

1.3 测试

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

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

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

ab test压力测试

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

2.1 安装ab test

yum -y install httpd-tools

ab -V

ab test压力测试

2.2 测试

ab test压力测试

3.1 参数

用法:ab [选项] 地址

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

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

3.2 返回结果

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

[root@localhost ~]# ab -n 100 -c 10 http://toutou.com:8301/user/get?uid=1
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 toutou.com (be patient).....done

#测试服务器的名字
Server Software:
#请求的URL主机名
Server Hostname:        toutou.com
#web服务器监听的端口
Server Port:            8301

 #请求的URL中的根绝对路径
Document Path:          /user/get?uid=1
#HTTP响应数据的正文长度
Document Length:        131 bytes

并发用户数,这是ab命令中设置的-c参数
Concurrency Level:      10
 #所有这些请求被处理完成所花费的总时间
Time taken for tests:   1.274 seconds
总请求数量,这是ab命令中设置的-n参数
Complete requests:      100
 # 失败的请求数,这里的失败是指请求的连接服务器、发送数据、接收数据等环节发生异常,以及无响应后超时的情况。对于超时时间的设置可以用ab的-t参数。如果接受到的http响应数据的头信息中含有2xx以外的状态码,则会在测试结果显示另一个名为“Non-2xx responses”的统计项,用于统计这部分请求数,这些请求并不算是失败的请求。
Failed requests:        0
#写入错误
Write errors:           0
总的网络传输量(字节数),包含http的头信息等。使用ab的-v参数即可查看详细的http头信息。
Total transferred:      25000 bytes
HTML内容传输量,实际的页面传递字节数。也就是减去了Total transferred中http响应数据中头信息的长度。
HTML transferred:       13100 bytes
每秒处理的请求数,服务器的吞吐量,等于:Complete requests / Time taken for tests(QPS)
Requests per second:    78.48 [#/sec] (mean)
用户平均请求等待时间
Time per request:       127.425 [ms] (mean)
服务器平均处理时间
Time per request:       12.743 [ms] (mean, across all concurrent requests)
平均每秒网络上的流量,即每秒收到的速率
Transfer rate:          19.16 [Kbytes/sec] received

压力测试时的连接处理时间。-- min最小值、mean平均值、[+/-sd]方差、median中位数、maxz最大值
Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   0.3      0       1                 # socket链路建立消耗,代表网络状况好
Processing:    20  121  54.9    119     281          # 写入缓冲区消耗+链路消耗+服务器消耗
Waiting:       13   99  48.7     93     234             # 写入缓冲区消耗+链路消耗+服务器消耗+读取数据消耗
Total:         21  122  54.8    119     281              # 单个事务总时间
ERROR: The median and mean for the initial connection time are more than twice the standard
       deviation apart. These results are NOT reliable.

Percentage of the requests served within a certain time (ms)
  50%    119
  66%    141
  75%    148
  80%    159
  90%    201
  95%    232
  98%    268
  99%    281
 100%    281 (longest request)
整个场景中所有请求的响应情况。在场景中每个请求都有一个响应时间,其中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

4.1.1: 错误描述

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

4.1.2: 解决方案

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

4.2.1: 错误描述

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

4.2.2: 解决方案

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

1.ab判断成功与否知识判断 2xx响应码,不接收服务器的返回值,所以同样的响应ab测试支持的并发数大于LR和Jemter,TPS的响应值也会比较大
2.ab运行的测试并发数与ab所运行的机器的cpu的颗粒度有很大的关系,cpu颗粒度越大,测试结果支持的并发数越大
3.ab不像LR或Jemter那么强大,但是它足够轻便,如果只是在开发过程中想检查一下某个模块的响应情况,或者做一些场景比较简单的测试,ab还是一个不错的选择。

其他参考/学习资料:

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

作 者: 请叫我头头哥
出 处:http://www.cnblogs.com/toutou/
关于作者:专注于基础平台的项目开发。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角 推荐一下。您的鼓励是作者坚持原创和持续写作的最大动力!

Original: https://www.cnblogs.com/toutou/p/ab_test.html
Author: 请叫我头头哥
Title: ab test压力测试

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/587020/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 重构聚合支付案例教你如何写出高扩展性易读的代码

    人间清醒 以下代码逻辑为:按照不同的支付方式调用不同支付方式的逻辑流程。痛点: /** * 旧的支付 * * @param mode 模式 * @param payVO 支付签证官…

    Java 2023年6月5日
    0101
  • Spring系列13:bean的生命周期

    本文内容 bean的完整的生命周期 生命周期回调接口 Aware接口详解 Spring Bean的生命周期 面试热题:请描述下Spring的生命周期? 4大生命周期 从源码角度来说…

    Java 2023年6月5日
    093
  • idea 运行 tyarn 命令提示系统禁止运行脚本

    无法加载文件D:……….(报错信息。。。),因为在此系统上禁止运行脚本,有关详细信息,请参阅 https:/go.microsoft.com/f…

    Java 2023年6月15日
    094
  • Nginx服务器性能优化与安全配置实践指南

    转载自:https://www.bilibili.com/read/cv16151784?spm_id_from=333.999.0.0 1.引言1.1 目的 为了更好的指导部署与…

    Java 2023年5月30日
    076
  • JVM基础(狂神)

    JVM探究 谈谈你对JVM的理解?java8虚拟机和之前的变化更新 什么是OOM,什么是栈溢出?怎么分析 JVM的常用调优参数有哪些? 内存快照如何抓取,怎么分析Dump文件? 谈…

    Java 2023年6月9日
    098
  • Java多线程

    join()方法使用:【已经开了3个线程ABC,要求线程A在线程B的前面执行,线程B在线程C的前面执行】 https://blog.csdn.net/zds448588952/ar…

    Java 2023年6月6日
    085
  • 减少Symantec Endpoint Protection 12误报的方法

    最近安装了Symantec Endpoint Protection 12。结果很多文件都遭了殃。。 VB 写的报毒。C# 写的也不放过。。。 Symantec 向卡巴小红伞360 …

    Java 2023年5月29日
    072
  • 2022年6月1日笔记

    2022年6月1日笔记 求阶乘 输入一个数n,求n的阶乘; 程序源码: #include <stdio.h> main(){ int i=1,result=1,n; s…

    Java 2023年6月9日
    099
  • Springboot中spring-data-jpa实现拦截器

    以下是jpa 拦截器的配置。 第一步: 实现 hibernate接口。重写方法 第二步: 在yml中配置 第三步:结果 java;gutter:true;2019-06-19 17…

    Java 2023年5月30日
    091
  • .net 爬虫框架技术选型

    个人认为爬虫框架分抓取框架和分析框架 1)抓取框架 .net 市面上好的似乎不多,选择要素分两种:1.轻量型,2.重量型。 轻量型是可以定制一些特殊的功能或者插件开关形式。总体性能…

    Java 2023年6月8日
    080
  • SpringMVC工作流程

    SpringMVC 1、MVC Model(模型)+View(视图)+Controller(控制器),通过将业务逻辑、数据、显示分离来组织代码。 Service层(处理业务)、Da…

    Java 2023年6月5日
    098
  • 开源动态可监控线程池DynamicTp介绍

    前言 使用线程池 ThreadPoolExecutor 过程中你是否有以下痛点呢? 代码中创建了一个 ThreadPoolExecutor,但是不知道那几个核心参数设置多少比较合适…

    Java 2023年6月15日
    0100
  • [Kafka]Kafka学习 — 初识Kafka

    Kafka学习 — 初识Kafka 参考资料:稀土掘金《图解 Kafka之实战指南》https://juejin.cn/book/6844733793220165639…

    Java 2023年6月5日
    081
  • 若依框架,导出功能

    若依框架 ,导出功能完善,前后台代码 开发过程中发现一个bug,就是关于导出功能的前端直接使用$.table.exportExcel(),发现有一个bug,就是选中一个人,导出的居…

    Java 2023年6月5日
    0100
  • 改Bug的经验

    如果修复某个Bug花了很长时间,这时候就要问问自己为什么,怎么做才吸取经验教训,在类似的问题上不再出问题,以及采用的方法,使用的工具是否还有改进的地方;当所有问题都解决之后,一定要…

    Java 2023年6月15日
    065
  • Elasticsearch杂记

    主分片,用以解决数据水平扩展的问题。通过主分片,可以将数据分布到集群内的所有节点之上。 一个分片是一个运行的Lucene的实例 主分片数在索引创建时指定,后续不允许修改,除非Rei…

    Java 2023年6月6日
    082
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球