`
100Continue
  • 浏览: 157766 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

性能/压力测试工具Apache ab修改系列:Part3——从文件中读取压力/性能测试的 url、header、cookie信息

阅读更多

需求:

修改Apache AB 工具,使其能够从文件中读取压力/性能测试的 url、header、cookie信息,并采用这些信息进行随机组合访问的压力和性能测试。

 

解决方案:

1. 如何从文件中读取url、header、cookie信息,并保证该操作不影响Apache AB的性能及数据统计?

首先,我所考虑的方法是,在ab读取设置参数的时候,如果配置为需要从文件中读取url、header、cookie等信息,则立即将这些信息读入到内存中备用,这样就能在Apache AB开始压测前完成所有的数据准备工作。

 

 

/* edit by gongyuan.cz */
    while ((status = apr_getopt(opt, "J:O:Q:n:c:t:b:T:p:u:v:rkVhwix:y:z:C:H:P:A:g:X:de:Sq"
#ifdef USE_SSL
            "Z:f:"
#endif
            ,&c, &optarg)) == APR_SUCCESS) {
        switch (c) {
			/* edit by gongyuan.cz start --- */
			case 'J':
				if(0 != (r = open_pathfile(optarg)))
					exit(r);
				break;
			case 'O':
				if(0 != (r = open_cookiefile(optarg)))
					exit(r);
				break;
			case 'Q':
				if(0 != (r = open_headerfile(optarg)))
					exit(r);
				break;
			/* edit by gongyuan.cz end ----- */
 

其次,我设计的数据在文件中的存放格式为:

 

数据在文件中存放的格式 写道
5
/url/xxx1.html
/url/xxx2.html
/url/xxx3.html
/url/xxx4.html
/url/xxx5.html

 其中,5代表文件中url的个数,而其后面的5行,每行代表一个url内容。

 

 接下来是读取文件的代码介绍:

 

/* read data to Path from file, edit by gongyuan.cz */

static int open_pathfile(const char *file)
{
    int file_len = 0, pos_cur = 0, line_size = 0, index = 0;
    char* databuff = NULL; 
    char* dataline = NULL;
    
    // 读取文件,并判断是否读取成功    
    FILE * in = fopen(file, "r");
    if (!in) {
        perror("Cannot open path file");
        exit(1);
    }
	
    // 获取文件的总长度大小
    fseek(in, 0, SEEK_END); 
    file_len = ftell(in); 
    fseek(in, 0, SEEK_SET); 
		
    // 设置一个数据buffer,并将文件的所有内容放入该buffer中
    databuff = (char*)malloc(file_len + 1); 
    fread(databuff, 1, file_len, in); 
    *(databuff+file_len) = '\0'; 

    // 以换行符“\n”为分隔符,获取每一行的数据
    // 在此,先读取第一行的数据,即url的数目,之后根据该数值为存放
    // url的数组申请空间
    dataline = strstr(databuff + pos_cur, "\n"); 
    if(dataline) 
    { 
        line_size = dataline - databuff - pos_cur; 
        dataline = (char*)malloc(line_size + 1); 
        strncpy(dataline, databuff + pos_cur, line_size); 
	*(dataline + line_size)= '\0'; 
	// 为存储url内容的数组 char ** pathName分配空间
        pathNum = atoi(dataline);
	pathName = (char**)malloc((pathNum + 1) * sizeof(char *));
	if(pathName == NULL){
		perror("Malloc path name error");
		exit(1);
	}
			
        pos_cur += line_size + 1; 
    } 

    //	读取后续的url内容,并存放到数组中
    do 
    {
        dataline = strstr(databuff + pos_cur, "\n"); 
        // 在此加了限制,防止数组越界
        if(dataline&&index < pathNum) 
        { 
            line_size = dataline - databuff - pos_cur; 
	    // set pathName
            pathName[index] = (char*)malloc(line_size + 1); 
            strncpy(pathName[index], databuff + pos_cur, line_size); 
            *(pathName[index] + line_size) = '\0'; 
	    index++;
            pos_cur += line_size + 1; 
        }
    }while(dataline); 

    // 最后结束,关闭文件,返回0	
    fclose(in);
    return 0;
}

/* ------------------------------------------------------- */
 

 

2. 如何构建url、header、cookie信息的随机组合访问的压力和性能测试?

为了能够根据我们的需求对AB的请求信息进行设置,我将AB内设置请求信息的代码独立编写成一个函数。

 

 

/* set request, edit by gongyuan.cz */

static void set_request()
{
	int snprintf_res = 0;
	/* setup request */
    if (posting <= 0) {
        snprintf_res = apr_snprintf(request, sizeof(_request),
            "%s %s HTTP/1.0\r\n"
            "%s" "%s" "%s"
            "%s" "\r\n",
            (posting == 0) ? "GET" : "HEAD",
            (isproxy) ? fullurl : path,
            keepalive ? "Connection: Keep-Alive\r\n" : "",
            cookie, auth, 
			headerNum ? hdrs_cp : hdrs);
    }
    else {
        snprintf_res = apr_snprintf(request,  sizeof(_request),
            "%s %s HTTP/1.0\r\n"
            "%s" "%s" "%s"
            "Content-length: %" APR_SIZE_T_FMT "\r\n"
            "Content-type: %s\r\n"
            "%s"
            "\r\n",
            (posting == 1) ? "POST" : "PUT",
            (isproxy) ? fullurl : path,
            keepalive ? "Connection: Keep-Alive\r\n" : "",
            cookie, auth,
            postlen,
            (content_type[0]) ? content_type : "text/plain", (headerNum ? hdrs_cp : hdrs));
    }
    if (snprintf_res >= sizeof(_request)) {
        err("Request too long\n");
    }

    if (verbosity >= 2)
        printf("INFO: %s header == \n---\n%s\n---\n", 
                (posting == 2) ? "PUT" : "POST", request);

    reqlen = strlen(request);

    /*
     * Combine headers and (optional) post file into one contineous buffer
     */
    if (posting >= 1) {
        char *buff = malloc(postlen + reqlen + 1);
        if (!buff) {
            fprintf(stderr, "error creating request buffer: out of memory\n");
            return;
        }
        strcpy(buff, request);
        memcpy(buff + reqlen, postdata, postlen);
        request = buff;
    }

#ifdef NOT_ASCII
    inbytes_left = outbytes_left = reqlen;
    status = apr_xlate_conv_buffer(to_ascii, request, &inbytes_left,
                   request, &outbytes_left);
    if (status || inbytes_left || outbytes_left) {
        fprintf(stderr, "only simple translation is supported (%d/%"
                        APR_SIZE_T_FMT "/%" APR_SIZE_T_FMT ")\n",
                        status, inbytes_left, outbytes_left);
        exit(1);
    }
#endif              /* NOT_ASCII */

}


/* ------------------------------------------------------- */

 

 之后,对write_request函数进行修改,在其最前面添加如下代码:

 

static void write_request(struct connection * c)
{
	/* edit by gongyuan.cz start */
	/* set path */
	if(pathNum){
		int index = random() % pathNum;
		path = apr_pstrcat(cntxt, pathName[index], NULL);
		/* set fullurl */
		if(isproxy){
			fullurl = apr_pstrcat(cntxt, fullurl, pathName[index], NULL);
		}
	}
	
	/* set cookie */
	if(cookieNum){
		int index = random() % cookieNum;
		cookie = apr_pstrcat(cntxt, "Cookie: ", cookieName[index], "\r\n", NULL);
	}
	
	/* set header */
	if(headerNum){
		int index = random() % headerNum;
		hdrs_cp = apr_pstrcat(cntxt, hdrs, headerName[index], "\r\n", NULL);
	}
	
	/* set request */
	if(0 != pathNum || 0 != cookieNum || 0 != headerNum){
		set_request();
	}
	/* edit by gongyuan.cz end */

  最后,经过以上的修改之后,修改版的Apache AB工具,不仅具备之前的所有功能,还具备从文件中读取url、header、cookie等信息并随机组合之后进行压力/性能测试。

修改版的Apache AB与原版Apache AB的性能及数据统计对比报告,在之前博客:

性能/压力测试工具Apache ab修改系列:Part1--与Apache AB原版对比测试报告

 中有详细的介绍。

 

ok,性能/压力测试工具Apache ab修改系列:Part3 介绍完毕,欢迎拍砖。转发请备注转自:100continue.iteye.com。 谢谢。

1
2
分享到:
评论

相关推荐

    零成本实现Web性能测试——基于ApacheJMeter

    Web 性能测试——基于Apache JMeter内容简介:《零成本实现Web性能测试:基于Apache JMeter》是一本关于Web性能测试的实战书籍,读者朋友们在认真阅读完《零成本实现Web性能测试:基于Apache JMeter》后,相信能够将所...

    Apache 压力测试工具ab 专注接口测试 并发测试

    Apache 压力测试工具ab 专注接口测试 并发测试Apache 压力测试工具ab 专注接口测试 并发测试

    压力测试工具:apache-jmeter-5.0

    Apache JMeter是Apache组织开发的压力测试工具,也是目前应用最广泛的开源性能测试工具之一。 不过要记住Jmeter由JAVA开发,安装Jmeter之前需要先安装JDK。

    Apache 压力测试工具ab

    ab是Apache超文本传输协议(HTTP)的性能测试工具。 其设计意图是描绘当前所安装的Apache的执行性能, 主要是显示你安装的Apache每秒可以处理多少个请求。

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

    -n 即requests,用于指定压力测试总共的执行次数。 -c 即concurrency,用于指定的并发数。 -t 即timelimit,等待响应的最大时间(单位:秒)。 -b 即windowsize,TCP发送/接收的缓冲大小(单位:字节)。 -p 即...

    Apache ab压力测试工具

    ab是Apache超文本传输协议(HTTP)的性能测试工具。其设计意图是描绘当前所安装的Apache的执行性能,主要是显示你安装的Apache每秒可以处理多少个请求。

    零成本实现WEB性能测试_基于APACHE JMETER_温素剑

    《零成本实现Web性能测试:基于Apache JMeter》是一本关于Web性能测试的实战书籍,读者朋友们在认真阅读完《零成本实现Web性能测试:基于Apache JMeter》后,相信能够将所学知识应用到生产实践中。《零成本实现Web性能...

    几个linux服务器性能测试工具,服务器压力测试

    通过网上收集和对LINUX服务器性能的分析和体验,整理了几个比较实用,功能比较强大的性能测试工具供亲们下载,虽然网络上都对每个工具做了详细的功能介绍和文档说明,但分得很散,所以, 在此本人将各个比较实用的...

    压力测试工具apache-jmeter-5.3

    Apache JMeter是Apache组织开发的基 于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。它可以用于测试静态和动态资源,例如静态文件、Java小服务程序、CGI脚本...

    jsp2.0 应用教程 光盘

    (1)本书和随书附送的光盘中涉及的文档、软件、图片和代码等项目仅供教学使用。 (2)本书实例源程序运行测试环境为: JDK 5.0 update 6和JDK 6.0 beta Tomcat 5.5.12 MySQL 5.0.16 (3)本书涉及的共享软件或免费软件...

    java JDK8 + apache-jmeter-5.4.3.zip 压力测试工具/性能测试工具

    apache-jmeter-5.4.3.zip jmeter5.4.3需要java8+的环境,本压缩包中包含了 jdk8 和 jmeter5.4.3 两个压缩包。 下载至本地后,解压压缩包,点击(jmeter)进入bin文件夹,双击jmeter.bat文件,会启动JMeter GUI工具

    Apache压力测试工具

    Apache压力测试工具,附个人使用笔记,很容易看懂

    零成本实现 Web 性能测试——基于Apache JMeter

    零成本实现 Web 性能测试——基于Apache JMeter

    零成本实现Web性能测试:基于Apache JMeter

    实战章节中作者以测试某大型保险公司电话销售系统为例,手把手教会读者如何用jmeter来完成一个实际的性能测试任务。  本书内容丰富、知识点讲解透彻,适合软件测试工程师、测试经理、高等院校相关专业的学生参考...

    Apache2.4 64位

    修改httpd.conf配置文件 37行: ServerRoot "apache目录" (e.g. 'c:\apache24' 改为 d:\apache) 217行:ServerName 服务器名称 (e.g demo.app.com or 127.0.0.1)去掉# 241行: DocumentRoot 修改网站根目录...

    压力测试apache ab小工具

    NULL 博文链接:https://houzhe11.iteye.com/blog/719461

    Apache Superset 1.2.0教程 (一)—— 安装(Windows版).pdf

    Apache Superset 1.2.0教程 (一)—— 安装(Windows版) superset安装过程

    apache-jmeter-3.10 压力测试工具

    apache-jmeter-3.1的简单压力测试使用方法(下载和安装) 博客转载https://blog.csdn.net/lan_shu/article/details/55190127 压力测试工具LoadRunner是收费的,而且操作复杂。作为开发人员当然是用apache提供的...

    压力测试工具apache-jmeter-4.0

    压力测试工具apache-jmeter,本人正在学习压力测试,分享出来收取一点点回馈去下载所需要的东西~~~

    Flavio Junqueira:Apache BookKeeper——高性能可靠预写式日志

    为了高效的顺序写入,较好的容错性和可扩展性,设计了BookKeeper。它的结构由他们组成:Bookie(存储节点),Ledger(日志文档),Ensemble(用一组Bookie存储Ledger)。

Global site tag (gtag.js) - Google Analytics