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 之间用冒号(:)隔开,并加个空格(必须要有)