您的位置:首页 > 运维架构 > Apache

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

2015-10-10 19:25 721 查看
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的,发现运行结果非常不稳定,每次测试的结果差异很大,让我一直以为是自己代码修改的问题,但是反复尝试了很久都未能改善,所以就怀疑是虚拟机的效率问题。后来就在物理机上测试果然一切正常。所以建议大家在物理机环境下进行操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息