linux 压力测试工具之ab

时间:2022-07-23
本文章向大家介绍linux 压力测试工具之ab,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

简介

Apache Benchmark(简称ab) 是Apache安装包中自带的压力测试工具 ,简单易用

在此提供 ab 在 centOS7 下的安装和使用方法 注:个人发现,之前安装的centos6.5 默认已安装了ab,具体原因不明

①.ab(apache benchmark)安装命令:

yum -y install httpd httpd-tools

②.ab测试的命令参数

命令: ab 或 ab -help 显示命令参数如下

ab [可选的参数选项] 需要进行压力测试的url 参数说明: 此外,我们再根据上面的用法介绍界面来详细了解每个参数选项的作用。

-n 即requests,用于指定压力测试总共的执行次数。 -c 即concurrency,用于指定的并发数。 -t 即timelimit,等待响应的最大时间(单位:秒)。 -b 即windowsize,TCP发送/接收的缓冲大小(单位:字节)。 -p 即postfile,发送POST请求时需要上传的文件,此外还必须设置-T参数。 -u 即putfile,发送PUT请求时需要上传的文件,此外还必须设置-T参数。 -T 即content-type,用于设置Content-Type请求头信息,例如:application/x-www-form-urlencoded,默认值为text/plain。 -v 即verbosity,指定打印帮助信息的冗余级别。 -w 以HTML表格形式打印结果。 -i 使用HEAD请求代替GET请求。 -x 插入字符串作为table标签的属性。 -y 插入字符串作为tr标签的属性。 -z 插入字符串作为td标签的属性。 -C 添加cookie信息,例如:"Apache=1234"(可以重复该参数选项以添加多个)。 -H 添加任意的请求头,例如:"Accept-Encoding: gzip",请求头将会添加在现有的多个请求头之后(可以重复该参数选项以添加多个)。 -A 添加一个基本的网络认证信息,用户名和密码之间用英文冒号隔开。 -P 添加一个基本的代理认证信息,用户名和密码之间用英文冒号隔开。 -X 指定使用的和端口号,例如:"126.10.10.3:88"。 -V 打印版本号并退出。 -k 使用HTTP的KeepAlive特性。 -d 不显示百分比。 -S 不显示预估和警告信息。 -g 输出结果信息到gnuplot格式的文件中。 -e 输出结果信息到CSV格式的文件中。 -r 指定接收到错误信息时不退出程序。 -h 显示用法信息,其实就是ab -help。

③.ab的使用

模拟并发请求100次,总共请求10000次 命令模板: ab -c 100 -n 10000 待测试网站(建议完整路径) 内容解释: Server Software: nginx/1.10.2 (服务器软件名称及版本信息) Server Hostname: 192.168.1.106(服务器主机名) Server Port: 80 (服务器端口) Document Path: /index1.html. (供测试的URL路径) Document Length: 3721 bytes (供测试的URL返回的文档大小) Concurrency Level: 1000 (并发数) Time taken for tests: 2.327 seconds (压力测试消耗的总时间) Complete requests: 5000 (的总次数) Failed requests: 688 (失败的请求数) Write errors: 0 (网络连接写入错误数) Total transferred: 17402975 bytes (传输的总数据量) HTML transferred: 16275725 bytes (HTML文档的总数据量) Requests per second: 2148.98 [#/sec] (mean) (平均每秒的请求数) 这个是非常重要的参数数值,服务器的吞吐量 Time per request: 465.338 [ms] (mean) (所有并发用户(这里是1000)都请求一次的平均时间) Time request: 0.247 [ms] (mean, across all concurrent requests) (单个用户请求一次的平均时间) Transfer rate: 7304.41 [Kbytes/sec] received 每秒获取的数据长度 (传输速率,单位:KB/s) ...

④.压力测试(示例)

【测试一】: 命令 ab -c 100 -n 5000 http://192.168.1.106/index1.html

【测试二】: 命令 ab -c 10000 -n 50000 http://192.168.1.106/index1.html

简单解释:并发访问量过大 服务器拒绝访问,理论上通过系统配置,可以有更好的承受能力

⑤.注意事项

测试机与被测试机要分开 不要对线上的服务器做压力测试 观察测试工具ab所在机器,以及被测试的前端机的CPU、内存、网络等都不超过最高限度的75% ab请加-k参考启用http1.1的keepalive功能

核心原理

ab是如何分配并发和请求数的呢?
在test函数中,先给连接数和请求数分配内存,组http报文头、组http请求报文默认使用GET方法(最大2048个字节)
进入for循环
for (i = 0; i < concurrency; i++) {
con[i].socknum = i;
start_connect(&con[i]);
}
start_connect函数里,concurrency有几个并发,就创建几个socket连接
apr_socket_create
设置TCP窗口大小
apr_socket_connect
started++ 打开的并发数加加
进入write_request函数
apr_socket_send 把request里的内容通过socket发过去最大2048个字节 发送数据是一个字节一个字节发的吗?
一个并发创建完成及一次请求发送后,出上一个for循环进入一个do while循环
这个do while循环里面又有一个for循环
for (i = 0; i < n; i++) n为并发数
进入read_connection函数
apr_socket_recv
进入close_connection函数
统计一些成功失败数量 平均时间,到一定数量会显示"Completed XXXX requests"
apr_socket_close
然后connect again,再次调用start_connect函数创建socket连接,再write_request,循环n次
然后return
===================================

常见问题

1) ab并发数不能大于请求数,会提示

ab: Cannot use concurrency level greater than total number of requests

2) 请求数默认不能超过1024个,会提示

socket: Too many open files (24)

可用ulimit -n命令修改,例如:ulimit -n 8192 (设置用户可以同时打开的最大文件数)。

3) 并发数默认不能大于20000个,会提示

ab: Invalid Concurrency [Range 0..20000]

需要修改apache源代码support目录下ab.c文件,找到: #define MAX_CONCURRENCY 20000 将宏定义的值改大,重新编译安装apache。

4) 提示

apr_socket_recv: Connection reset by peer (104)

网上说是apr-util有些问题,不太稳定,多试几次就好了。

5) 还有单独的apache bench源码包,及如何单独安装ab教程 下载:http://apachebench-standalone.googlecode.com/files/ab-standalone-0.1.tar.bz2 安装教程:https://code.google.com/p/apachebench-standalone/wiki/HowToBuild

6)测试时发现有如下错误

...
Failed requests:        998
   (Connect: 0, Receive: 0, Length: 998, Exceptions: 0)
...

7) ab怎么post数据 ?

sudo ./ab -c 10 -n 100 -p ./post.file -T 'application/x-www-form-urlencoded' http://www.abc.cn/test

post.file内容:

aa=bb&cc=dd