当前位置: > Linux服务器 > 性能测试 >

web压力测试工具ab

时间:2014-09-14 02:27来源:linux.it.net.cn 作者:it

ab是apache自带的一款压力测试工具,安装完apache后就有了,一般在/usr/bin目录下。系统为CentOS。

1、安装apache

yum install httpd

2、ab使用方法形如

ab -c 20 -n 1000 http://www.example.com/

-c:并发数
-n:总请求数

===我蛋疼的看了源代码,这段可以跳过===
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
===================================

假设c为并发数,n为总请求数,done为已完成数。从这里可以看出ab的运作方式是创建c个并发,同时发送c个请求,然后关闭socket连接,如果done小于n,则继续创建c个并发,同时发送c个请求,然后关闭socket连接,一直循环,直到done等于n时退出。

3、ab运行完成后会有比较详细的结果

Server Software:        web服务器软件及版本
Server Hostname:        请求的地址
Server Port:            请求的端口

Document Path:          请求的页面路径
Document Length:        页面大小

Concurrency Level:      并发数
Time taken for tests:   测试总共花费的时间
Complete requests:      完成的请求数
Failed requests:        失败的请求数
Write errors:           写入错误
Total transferred:      总共传输字节数,包含http的头信息等
HTML transferred:       html字节数,实际的页面传递字节数
Requests per second:    每秒处理的请求数,服务器的吞吐量(重要)
Time per request:       平均数,用户平均请求等待时间
Time per request:       服务器平均处理时间
Transfer rate:          平均传输速率(每秒收到的速率)


4、其它注意事项
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)
...


是因为在测试动态页面时,返回的长度和第一次不同,所以ab就判断失败了,对于动态页面这是合理的。可参考:http://mib168.iteye.com/blog/1299990

参考资料:
http://www.cnblogs.com/yjf512/archive/2011/05/24/2055723.html
http://www.kwx.gd/CentOSApp/CentOS-Apache-Bench.html
http://blog.csdn.net/largetalk/article/details/7337102
http://apr.apache.org/docs/apr/0.9/group__apr__network__io.html
http://httpd.apache.org/docs/2.2/programs/ab.html

(责任编辑:IT)
------分隔线----------------------------