需求:
修改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的性能及数据统计对比报告,在之前博客:
中有详细的介绍。
ok,性能/压力测试工具Apache ab修改系列:Part3 介绍完毕,欢迎拍砖。转发请备注转自:100continue.iteye.com。 谢谢。
分享到:
相关推荐
Apache ab压力测试工具是HTTP服务器性能评估的重要工具,主要用于测试Apache服务器在特定条件下的处理能力。这个工具简单易用,可以提供对服务器性能的详细分析,帮助管理员优化配置,提升服务器响应速度,确保在高...
通过对【压缩包子文件的文件名称列表】中的"Apache ab"进行解压和运行,用户可以深入了解和运用这个工具进行性能评估。 总结来说,ab工具是一个强大且实用的压力测试工具,对于理解Web服务器性能、进行系统调优以及...
* 测试Web应用程序的性能:ab工具可以模拟多个并发用户对Web应用程序的访问请求,以测试Web应用程序的性能和稳定性。 * 测试Web服务器的负载均衡:ab工具可以模拟多个并发用户对Web服务器的访问请求,以测试Web...
Apache的ab(ApacheBench)是一款简单而强大的压力测试工具,专用于接口和并发测试。在Web服务性能优化和系统负载能力评估中,ab扮演着关键角色。它可以帮助开发者和运维人员了解服务器在高并发情况下的表现,以及...
Apache 压力测试工具ab是一个非常实用的性能测试工具,专门用于评估Apache HTTP服务器的性能。通过模拟多个并发用户发送请求,ab可以帮助管理员了解服务器在高负载下的表现,包括处理速度、吞吐量和资源利用率等关键...
Web 性能测试——基于Apache JMeter内容简介:《零成本实现Web性能测试:基于Apache JMeter》是一本关于Web性能测试的实战书籍,读者朋友们在认真阅读完《零成本实现Web性能测试:基于Apache JMeter》后,相信能够将所...
Apache提供了多种压力测试工具,其中包括Apache JMeter、ab(ApacheBench)等,这些工具可以帮助开发者和运维人员理解服务器在高并发情况下的表现。 Apache JMeter是一款功能强大的开源压力和负载测试工具,不仅...
- 提供的`.mht`文件,如“Web性能压力测试工具之ApacheBench(ab)详解.mht”和“Siege使用教程.mht”,包含了详细的使用指南和实例,可以帮助用户深入理解这些工具的用法。 总的来说,Web压力测试是保障网站可靠...
在IT行业中,性能测试是评估系统稳定性和承载能力的重要环节,而`ab`(ApacheBench)就是一个广泛使用的轻量级压力测试工具。它由Apache HTTP服务器项目开发,主要用于测试Web服务器的性能。下面我们将深入探讨`ab`...
Apache JMeter是一款强大的、开源的压力测试工具,专为评估应用程序的性能和稳定性而设计。它最初是为了测试Web应用,但随着时间的发展,其功能已经扩展到支持多种协议和服务,包括HTTP、FTP、SMTP、JDBC、SOAP、RMI...
-n 即requests,用于指定压力测试总共的执行次数。 -c 即concurrency,用于指定的并发数。 -t 即timelimit,等待响应的最大时间(单位:秒)。 -b 即windowsize,TCP发送/接收的缓冲大小(单位:字节)。 -p 即...
在目录/etc下修改profile文件 export CATALINA_HOME=/usr/local/tomcat export CLASSPATH=.:$JAVA_HOME/lib:$CATALINA_HOME/lib export PATH=$PATH:$CATALINA_HOME/bin 执行命令: source /etc/profile 查看环境变量:...
"ab压力测试工具"是Apache HTTP服务器项目的一部分,它是一个简单但功能强大的命令行工具,用于对Web服务器进行性能测试和负载测试。这个工具能够模拟多个并发用户向服务器发送HTTP请求,帮助管理员评估服务器在高...
**Apache JMeter:高效的压力测试工具** Apache JMeter是一款开源的、Java编写的性能测试工具,主要用于测试Web应用,特别是RESTful服务。它能够模拟大量并发用户,对HTTP和FTP服务器进行压力和性能测试,从而评估...
在IT行业中,性能测试是评估系统稳定性和承载能力的重要环节,而压力测试工具则是实现这一目标的关键助手。本文将深入探讨一款名为“ab”的命令行工具,它是一个轻量级但功能强大的HTTP服务器压力测试工具。ab全称为...
在部署和优化Apache服务器的过程中,压力测试是一项至关重要的任务,可以帮助我们评估服务器在高负载情况下的性能和稳定性。"ab"(ApacheBench)是Apache HTTP服务器自带的一个简单压力测试工具,用于模拟多个并发...
【Apache网站压力测试工具ab使用教程】 Apache HTTP服务器自带了一个名为`ab`(ApacheBench)的简单压力测试工具,用于评估Web服务器的性能。它能够模拟多个并发用户请求,以此来测试服务器在高负载下的响应时间和...
《零成本实现Web性能测试:基于Apache JMeter》是一本关于Web性能测试的实战书籍,读者朋友们在认真阅读完《零成本实现Web性能测试:基于Apache JMeter》后,相信能够将所学知识应用到生产实践中。《零成本实现Web性能...
Siege不仅可以进行简单的并发请求测试,还具有回放功能,可以从日志文件中读取历史请求进行回放测试。此外,Siege提供了详细的性能统计信息,包括成功率、响应时间和并发用户的平均响应时间。 5. Pylot Pylot是一款...