ab 和 wrk

ab

全称:ApacheBench,用于 web 性能压力测试,ab 命令会创建很多的并发访问线程,模拟多个访问者同时对某一URL地址进行访问。

ab 命令对发出负载的计算机要求很低,不会占用很高CPU和内存,但却会给目标服务器造成巨大的负载。

ab 是 apache 服务器的附属工具,当然如果不需要 apache 也可以独立安装。

1. yum 安装

yum -y install httpd-tools #这样安装使其不能支持大于2w的并发数

2. 源码安装(推荐)

# 1.安装httpd依赖
yum -y install gcc gcc-c++ automake apr apr-util pcre apr-devel apr-util-devel pcre-devel

# 2.下载httpd包
wget https://mirror.bit.edu.cn/apache//httpd/httpd-2.4.43.tar.gz
tar -zxvf httpd-2.4.43.tar.gz -C /usr/src
cd /usr/src/httpd-2.4.43

# 3.修改ab的源代码 
vim support/ab.c
# 修改第282,后面数字改成自己想要的最大并发数,默认为20000
#define MAX_CONCURRENCY 100000

# 4.编译&安装
./configure --prefix=/usr/local/httpd
make && make install

3.命令行示例

ab -c 200 -n 10000 -p post-1k.txt -T 'application/json' http://IP:端口/k

4.ab常用选项

-n 表示请求总数(与-t参数可任选其一)

-c 表示并发数

-t 标识请求时间

-p:模拟post请求,文件格式为gid=2&status=1,配合-T使用 -T:post数据所使用的Content-Type头信息,如-T 'application/x-www-form-urlencoded'          

5.ab使用案例

1.get请求压测      

 #ab -n 10000 -c 200 -r  "http://IP:端口/k?size=0"        并发200,总请求数量1w,遇到错误不退出继续执行        

#ab -t 600 -c 200 -n 1000000 -r  "http://IP:端口/k?size=0"        并发200,运行10分钟,遇到错误不退出继续执行   

              

 解决方案:从ab源码的小漏洞来设置超时时间和最大请求数(推荐) 根据ab源代码对传入参数的解析顺序来看,对-n的参数的解析是在-t之前,因此,我们可以在设置ab参数时,先设置-t超时时间,再设置-n最大请求数。这样request变量就会被-n重新设置

2.post请求压测

#ab -c 200 -n 10000  -p post-1k.txt -T 'application/json' http://IP:端口/k
[root@haropy ~]# cat data.txt
a=1&b=2
[root@haropy ~]# ab -c 10 -n 100 -p data.txt -T 'application/x-www-form-urlencoded' https://www.baidu.com/

6.ab结果详解

ab选项详解

 选项    作用
-n    在测试会话中所执行的请求个数。默认时,仅执行一个请求。
-c    一次产生的请求个数。默认是一次一个。
-t    测试所进行的最大秒数。其内部隐含值是-n 50000,它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。
-p    包含了需要POST的数据的文件。
-P    对一个中转代理提供BASIC认证信任。用户名和密码由一个:隔开,并以base64编码形式发送。无论服务器是否需要(即, 是否发送了401认证需求代码),此字符串都会被发送。
-T    POST数据所使用的Content-type头信息。
-v    设置显示信息的详细程度-4或更大值会显示头信息,3或更大值可以显示响应代码(404,200等),2或更大值可以显示警告和其他信息。
-V    显示版本号并退出。
-w    以HTML表的格式输出结果。默认时,它是白色背景的两列宽度的一张表。
-i    执行HEAD请求,而不是GET。
-x    设置<table>属性的字符串。
-X    对请求使用代理服务器。
-y    设置<tr>属性的字符串。
-z    设置<td>属性的字符串。
-C    对请求附加一个Cookie:行。其典型形式是name=value的一个参数对,此参数可以重复。
-H    对请求附加额外的头信息。此参数的典型形式是一个有效的头信息行,其中包含了以冒号分隔的字段和值的对(如,“Accept-Encoding:zip/zop;8bit”)。
-A    对服务器提供BASIC认证信任。用户名和密码由一个:隔开,并以base64编码形式发送。无论服务器是否需要(即,是否发送了401认证需求代码),此字符串都会被发送。
-h    显示使用方法。
-d    不显示"percentage served within XX [ms] table"的消息(为以前的版本提供支持)。
-e    产生一个以逗号分隔的(CSV)文件,其中包含了处理每个相应百分比的请求所需要(从1%到100%)的相应百分比的(以微妙为单位)时间。由于这种格式已经“二进制化”,所以比’gnuplot’格式更有用。
-g    把所有测试结果写入一个’gnuplot’或者TSV(以Tab分隔的)文件。此文件可以方便地导入到Gnuplot,IDL,Mathematica,Igor甚至Excel中。其中的第一行为标题。
-i    执行HEAD请求,而不是GET。
-k    启用HTTP KeepAlive功能,即在一个HTTP会话中执行多个请求。默认时,不启用KeepAlive功能。
-q    如果处理的请求数大于150,ab每处理大约10%或者100个请求时,会在stderr输出一个进度计数。此-q标记可以抑制这些信息。
-r    在遇到socket接收错误后,不退出测试

wrk简介

wrk 是一款针对 Http 协议的基准测试工具,它能够在单机多核 CPU 的条件下,使用系统自带的高性能 I/O 机制,通过多线程和事件模式,对目标机器产生大量的负载 wrk相对于ab来说最大的优点是「支持多线程」

1.wrk 安装与使用

git clone https://github.com/wg/wrk.git wrk
cd wrk
make # 编译
# 将可执行文件移动到 /usr/local/bin 位置
sudo cp wrk /usr/local/bin

wrk命令参数说明

wrk --help
Usage: wrk <options> <url>                           
  Options:                                           
    -c, --connections <N>  Connections to keep open   跟服务器建立并保持的TCP连接数量  总的连接数(每个线程处理的连接数=总连接数/线程数)
    -d, --duration    <T>  Duration of test           压测时间  
    -t, --threads     <N>  Number of threads to use   使用多少个线程进行压测
                                                       
    -s, --script      <S>  Load Lua script file       指定Lua脚本路径  
    -H, --header      <H>  Add header to request      为每一个HTTP请求添加HTTP头
        --latency          Print latency statistics   在压测结束后,打印延迟统计信息
        --timeout     <T>  Socket/request timeout     超时时间
    -v, --version          Print version details      打印正在使用的wrk的详细版本信息
     

备:关于线程数,并不是设置的越大,压测效果越好,线程设置过大,反而会导致线程切换过于频繁,效果降低,一般来说,推荐设置成压测机器 CPU 核心数的 2 倍到 4 倍就行了                             wrk使用案例     

2.命令行示例

wrk -t 50 -c 10000 -d 300 --latency http://IP:端口/k?size=0

线程数为 50,模拟 10000 个并发请求,持续 300 秒 

wrk -t 12 -c 100 -d 300 --script=http-5k.lua  --latency http://IP:端口/k
wrk -t 50 -c 10000 -d 300 -H "Authorization: 123456" --latency http://IP:端口/k?size=0

3.使用案例

http-5k.lua脚本内容如下:

[root@haropy ~]# cat post.lua
wrk.method = "POST"
wrk.body = "login=sammy&password=test"
wrk.headers["Content-Type"] = "appliaction/x-www-form-urlencoded"
[root@haropy ~]# wrk -t 2 -c 6 -d 5s -s post.lua https://www.baidu.com

4.wrk结果分析

注:命令行加 header 时,一定要注意把 header 两边加上引号(""),同时 header 的 key 和 value 之间用冒号(:)隔开,并加个空格(必须要有)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值