ab全称:ApacheBench,用于 web 性能压力测试,ab 命令会创建很多的并发访问线程,模拟多个访问者同时对某一URL地址进行访问。
ab 命令对发出负载的计算机要求很低,不会占用很高CPU和内存,但却会给目标服务器造成巨大的负载。
ab 是 apache 服务器的附属工具,当然如果不需要 apache 也可以独立安装
1、ab安装
# centos [root@centos7 wrk]# yum install httpd-tools -y # ubuntu apt-get -y install apache2-utils
待命令安装完成后,在系统中执行 ab -V
如果一切正常,就能看到ab相关信息,说明你的电脑已经安装好了ab工具包了。
2、ab参数
ab用法: ab [options] [http[s]://]hostname[:port]/path,常用参数如下截图:
参数: -c concurrency: 一次产生的请求数,可以理解为并发数 -n requests:执行的总请求数,默认1次 -t timelimit:测试进行的最长时长,可以理解为持续施压时长 -s timeout: 最大超时等待时长 -p postfile: POST 请求文件,但是记得 配置 -T 参数 -u putfile: PUT请求, 但是记得配置 -T 参数 -i: HEAD请求 -m method: 方法名称 -T content-type: 指定POST\PUT请求的头部信息Content-Type,默认为'text/plain',可以根据自己需要更改为如:application/x-www-form-urlencoded、application/json、multipart/form-data -C attribute: 对请求附加一个Cookie:行。其典型形式是name=value的一个参数对,此参数可以重复 -H attribute: 对请求附加额外的头信息。此参数的典型形式是一个有效的头信息行,其中包含了以冒号分隔的字段和值的对(如,"Accept-Encoding:zip/zop;8bit") -A attribute: 对服务器提供BASIC认证信任。用户名和密码由一个:隔开,并以base64编码形式发送。无论服务器是否需要(即,是否发送了401认证需求代码),此字符串都会被发送 -g filename: 把所有测试结果写入一个'gnuplot'或者TSV(以Tab分隔的)文件。此文件可以方便地导入到Gnuplot,IDL,Mathematica,Igor甚至Excel中。其中的第一行为标题 -e filename: 将执行的结果写到csv文件,并提供百分比 -r : 出现错误时,不退出
3、ab示例
案例: 并发请求,指定时长
用100个并发用户,向 http://www.baidu.com/ 这个网址,持续请求120秒
ab -c 100 -t 120 https://www.baidu.com/
案例: 指定请求次数
创建100个线程(模拟10个用户),累计向百度发送10000个请求
ab -c100 -n10000 https://baidu.com/
案例: GET请求带参数,用户登录
ab -c 100 -t 10 -p data.txt -T "application/x-www-form-urlencoded" http://***/path
# data.txt文件内容为
mobilephone=****&pwd=****
案例: POST请求,带参数,参数类型为json,用户登录
ab -c 1 -n 1 -p user.json -T "application/json" -v 4 http://***/path
# user.json是请求的参数文件 {"name":"*****","pwd":"******"}
上面参考连接:http://testingpai.com/article/1595507309308
关心的几个点
1.Concurrency Level: // 并发数
2.Time taken for tests: // 总花费时间
3.Complete requests:// 完成请求数
4.Failed requests: // 失败请求数
5.Requests per second: (mean) // 吞吐率(TPS)
6.Time per request: (mean) // 一个请求花费的平均时间
7.Percentage of the requests served within a certain time (ms) // 请求的时间分布情况
压测主要是评估当前系统的负载,所以一般看看吞吐率(TPS)和成功率就够了,如果想评估接口性能,可以查看第6和第7项数据。
往往需要改变压测参数(并发数和总请求数)多压测几次,才会得到准确的TPS。
注意事项:
- -c 设置最大并发数,一般不超过1024,因为系统默认设置最大打开文件数为1024,linux中,可以通过 ulimit -a查看
- -n 指定最大请求数,但是不能操作 50000
4、编写脚本批量压测接口(多个同时同时压测)
在实际压测中,我们往往要压测很多接口,而很多接口都有同时请求的情况,所以我们不能单独一个一个测接口得到TPS,所以需要自己编写脚本,去完成同时压测的要求。
以下是写的一个简单的批量压测脚本test.sh:
#!/bin/sh RESULT_DIR="/data/home/yawenxu/TestResult/" jsonFileArr="ff0e_00.json ff0e_02.json ff0e_05.json ff0e_06.json ff0e_07.json ff0e_08.json ff0e_10.json ff0e_11.json" # 每个接口post需要的json参数的文件 concurrency=${1-1} #并发数 count=${2-1} #总请求数 input_file_name=$3 exec_single_ab(){ if [ -f $1 ];then /usr/bin/ab -n $2 -c $3 -p $1 -T "application/x-www-form-urlencoded" "http://$4" >$RESULT_DIR$1$2"_nginx.txt" 2>&1 & else echo $1" is not exists" fi } exec_loop_ab(){ for item_name in $jsonFileArr do exec_single_ab $item_name $concurrency $count "http://api.com/xxx" & done } if [ -f $input_file_name ];then exec_single_ab $input_file_name $concurrency $count & else exec_loop_ab & fi
这个脚本保证了多个接口同时压测,同时将每个接口的压测报告保存到文件里,便于分析。执行命令sh test.sh 10000 10000 一次性生成压测报告文件 $RESULT_DIR$1$2"_nginx.txt
4、ab与wrk的区别、优缺点
ab优缺点如下:
1. 简单易用
2. 支持post请求,接受json文件作为参数 (方便编写脚本批量测试)
3. 压测量不大的情况下够用(1024个并发以下)
ab一些明显缺点
1. 无法持续时间压测,控制速度压测。ab没有这个功能。
2. 压测量起不来。主要是ab只能利用单个cpu,只能是单进程,而系统限制每个进程打开的最大文件数为1024,所以最多1024个线程,如果是多核cpu,就浪费了这些资源。
3. 如果中途的请求被服务器拒绝了,测试报告不完整,无法得出已完成请求的压测情况。以下是中途被服务器拒绝的报告,很不友好:
wrk负载测试时可以运行在一个或者多核CPU。
ab -k -c 100 -t 10 http://domain/path
一个很容易被忽视的参数是「k」,它会增加请求头 Connection: Keep-Alive,相当于开启了 HTTP 长连接,这样做一方面可以降低测试服务器动态端口被耗尽的风险,另一方面也有助于给目标服务器更大的压力,测试出更接近极限的结果。
wrk:
wrk 相对于 ab 来说最大的优点是它支持多线程,这样更容易发挥多核 CPU 的能力,从而更容易测试出系统的极限能力,其典型用法如下:
wrk -c 100 -d 10 http://domain/path
wrk 没有类似参数「k」这样打开 HTTP 长链接的选项,这是因为 wrk 使用的是 HTTP/1.1,缺省开启的是长连接,而 ab 使用的是 HTTP/1.0,缺省开启的是短链接。
如何用 wrk 测试短链接?
wrk -H "Connection: Close" -c 100 -d 10 http://domain/path
也就是说通过参数「H」传递一个自定义的 Connection 请求头来关闭长链接。此外,wrk 支持自定义脚本编程。