修改Apache Benchmark源码实现请求数据随机的压力测试

来源:互联网 发布:淘宝客推广培训 编辑:程序博客网 时间:2024/06/05 10:34

Apache Benchmark(简称ab)是Apache附带的一款开源的网站压力测试工具,可以同时模拟大量并发请求,简单易用。

在用ab对自己的网站进行压力测试时发现:ab模拟的并发请求发送的数据都是同一个,而我希望并发请求能够发送不同的数据。ab虽然支持从指定文件中读取需要post的数据,但不支持读取多个文件,所有并发请求发送的都是同一个文件中的数据。

ab是一款开放源代码的压力测试工具,因此可以通过修改源代码来实现我希望的效果。


研究ab的源代码发现,ab从文件中读出需要post的数据后,保存在全局字符串变量postdata中。然后取postdata与准备好的http报文头组装成完整的http请求保存在全局字符串变量request中。之后为每一个并发请求分别建立一个socket连接,对每个连接分别调用函数write_request(struct connection *c)发送request。

因此可以通过修改write_request(struct connection *c)函数,在发送request之前修改request的内容来实现期望的效果。


我的需求是这样:

发送的请求数据的格式为“&searchKey=ABCD”(不含引号),其中ABCD这段要求所有并发请求各自随机生成,定长4位,由大写英文字母构成。

具体的代码修改方法如下:

首先添加函数char *get_new_request(),该函数用于修改request得到一个新的request,函数体如下:

static char *get_new_request(){  char *buff = xmalloc(postlen + reqlen + 1);  strcpy(buff, request);  char *tmpdata = xmalloc(postlen);  strcpy(tmpdata, postdata);  for (int i = 0; i < 4; i++){    tmpdata[25 + i] = 'A' + rand() % 26;  }  memcpy(buff + reqlen, tmpdata, postlen);  free(tmpdata);  return buff;}
然后修改函数void write_request(struct connection *c),找到其中如下的一条语句:

e = apr_socket_send(c->aprsock, request + c->rwrote, &l);
这条语句用于发送request,将其修改如下:

char *newrequest = get_new_request();e = apr_socket_send(c->aprsock, newrequest + c->rwrote, &l);free(newrequest);
这样就完成了代码的修改,保存后就可以编译执行了。


以下是具体操作流程,包括相关文件下载、修改代码、编译安装、运行等,若已熟悉此过程可直接跳过。

本过程在linux环境下完成,我使用的系统版本是redhat server6.3。


1、下载相关文件

安装apache之前必须先安装apr、apr-util、pcre这三个工具,因此我们需要下载如下4个文件:

下载httpd-2.4.16.tar.bz2 :地址

下载apr-1.5.2.tar.gz:地址

下载apr-util-1.5.4.tar.gz:地址 

下载pcre-8.37.tar.gz:地址

下载后放到目录/opt/(可自行指定)下。


2、修改源码

解压文件httpd-2.4.16.tar.bz2后,在httpd-2.4.16/support/目录下可以找到文件ab.c,这就是ab的源代码文件,按自己的需求对其进行修改即可,修改完成后将文件夹httpd-2.4.16重新打包为httpd-2.4.16.tar.bz2。


3、编译安装

1)卸载系统原有的Apache:

打开终端,进入root

执行如下命令:

rpm-e gnome-user-share

然后执行:

rpm -qa| grep httpd

回车后显示如下信息(版本号可能有所不同):

httpd-tools-2.2.15-15.el6_2.1.x86_64

httpd-2.2.15-15.el6_2.1.x86_64

表示需要卸载这两个软件包,从下往上卸载。执行如下命令:

rpm-e httpd-2.2.15-15.el6_2.1.x86_64

rpm-e httpd- tools-2.2.15-15.el6_2.1.x86_64


注:如果没有先卸载gnome-user-share,则可能会遇到如下错误:

error: Failed dependencies:

        httpd>= 2.2.0 is needed by (installed) gnome-user-share-2.28.2-3.el6.x86_64


2)安装C++编译器(若已安装过,则跳过)

在linux的安装盘中的Packages文件夹中找到文件gcc-c++-4.4.6-4.el6.x86_64.rpm(版本号可能不同),双击即可安装。


3)安装apr

分别执行如下命令:

cd /opt/

tar -zxvf apr-1.5.2.tar.gz

cd apr-1.5.2

./configure --prefix=/usr/local/apr

make && make install


4)安装apr-util

分别执行如下命令:

cd /opt/

tar -zxvf apr-util-1.5.4.tar.gz

cd apr-util-1.5.4

./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr

make&& make install


5)安装pcre

分别执行如下命令:

cd /opt/

tar -zxvf pcre-8.37.tar.gz

cd pcre-8.37

./configure --prefix=/usr/local/pcre

make&& make install


6)安装Apache

分别执行如下命令:

cd /opt/

tar jxvf httpd-2.4.16.tar.bz2

cd httpd-2.4.16

./configure --prefix=/usr/local/apache --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --with-pcre=/usr/local/pcre

make&& make install

至此Apache即安装完成。


4、运行

1、在目录/usr/local/apache/bin/目录下新建一个文件request.txt,写入需要post的请求数据。


2、打开终端,进入root。执行如下命令:

cd /usr/local/apache/bin/

./ab -n 1000 -c 100 -p request.txt -l -T "application/x-www-form-urlencoded" http://111.com

注:其中http://111.com是接收请求的服务器地址;request.txt文件名可自定。

回车后即开始执行测试程序。


其中遇到一个值得注意的问题,一开始我是在VMWare中安装redhat来运行ab的,发现运行结果非常不稳定,每次测试的结果差异很大,让我一直以为是自己代码修改的问题,但是反复尝试了很久都未能改善,所以就怀疑是虚拟机的效率问题。后来就在物理机上测试果然一切正常。所以建议大家在物理机环境下进行操作。


0 0