转自【http://novasblog.blog.163.com/blog/static/43713514200901342517155/】
下面是电网公司门户网站的测试时将关联功能灵活应用,解决对整个服务器集群进行压力测试的案例。
一、背景及系统基本架构:
测试的环境已经是正式应用的生产环境,系统采用了负载均衡策略。WEB服务中间件用TOMCAT,负载均衡服务中间件用webservice。系统部署方式为:在IP为“10.180.6.100”的服务器上部署数据库服务PostgreSQL、负载均衡服务webservice及一个应用服务TOMCAT,其它四台服务器上只部署有应用服务TOMCAT。
用户端与服务器的交互过程为:用户在IE中输入“http://10.180.6.100”对网站进行访问,这是唯一对外开放的访问地址,也是域名映射到的地址。客户端浏览器访问“http://10.180.6.100”后,会将访问请求发送到负载均衡服务的入口“http://10.180.6.100/banlance”,负载均衡服务会据服务的资源及服务响应情况将负载分发到不同的服务器(当10.180.6.100上部署的TOMCAT服务资源空闲时也可以指定由10.180.6.100提供服务)。
问题:在录脚本时发现录制的脚本中所有的请求及反应资源URL中的IP地址是固定的,这样将造成在场景运行并发时,只能对脚本中录制是负载均衡指定的提供的服务的服务器造成负载,对其它服务器未造成负载,造成在并发用户是所有的用户都只会向这个地址对应的服务器发出请求。也就是脚本的遇到了硬编码问题。录制后的脚本如下:
vuser_init()
{
//客户端访问http://10.180.6.100/,这是对外提供的唯一访问IP地址,也是网站域名射到的地址。
web_url("10.180.6.100",
"URL=http://10.180.6.100/",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t1.inf",
"Mode=HTML",
LAST);
web_url("loadbalance", //负载均衡服务对请求据均衡策略进行分发处理
"URL=http://10.180.6.100/loadbalance",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t2.inf",
"Mode=HTML",
LAST);
web_submit_data("render_portlet", //录制此脚本时,负载均衡服务指定10.180.6.113服务器提供服务
"Action=http://10.180.6.113/c/portal/render_portlet",
"Method=POST",
"RecContentType=text/html",
"Referer=http://10.180.6.113/c/portal/layout?p_l_id=PUB.1.68",
"Snapshot=t3.inf",
"Mode=HTML",
ITEMDATA,
"Name=p_l_id", "Value=PUB.1.68", ENDITEM,
"Name=p_p_id", "Value=customizeArticles_INSTANCE_gGtp", ENDITEM,
"Name=p_p_action", "Value=0", ENDITEM,
"Name=p_p_state", "Value=normal", ENDITEM,
"Name=p_p_mode", "Value=view", ENDITEM,
"Name=p_p_col_id", "Value=column-7", ENDITEM,
"Name=p_p_col_pos", "Value=0", ENDITEM,
"Name=p_p_col_count", "Value=1", ENDITEM,
EXTRARES,
"Url=/html/images/pisoft-logo-bg.gif", "Referer=http://10.180.6.113/c/portal/layout?p_l_id=PUB.1.68",
ENDITEM,
LAST);
web_custom_request("depart",
"URL=http://10.180.6.113/depart?type=1&ou=105", //所有请求都只针对10.180.6.113进行,造成了硬编码。
"Method=POST",
"Resource=0",
"RecContentType=text/html",
"Referer=http://10.180.6.113/c/portal/layout?p_l_id=PUB.1.68",
"Snapshot=t4.inf",
"Mode=HTML",
"EncType=",
LAST);
.......
return 0;
}
二、解决方案1
开始对此系统进行性能测试时,考虑到所有的服务器的硬件资源是一样的,所以对一台服务进行压力测试,然后据一台的情况来综合的看整个集群的性能情况。也对负载均衡服务进行性能测试,目的是保证负载均衡服务不是整个集群的瓶颈。
三、目前方案2
对一台服务进行压力测试,然后据一台的情况来综合的看整个集群的性能情况这只能是以点盖全,不能反应整个集群的性能情况,如用户访问时,负载均衡对访问进行均衡处理,而不是直接访问到WEB服务,那这样的响应时间统计是有问题的,不准确的。针对此问题,想到负载均衡服务在进行负载均衡处理时,指定的提供服务的IP地址是据各服务器资源应用情况及均衡策略反馈给客户端的,而一但指定了提供的服务器IP,在其后的访问操作(如登录)就不再改变访问地址。想到应用LR提供的关联操作将负载均衡指定的IP地址进行参数化。
四、优化后的脚本
(如何关联请看“手动关联如何操作”)
vuser_init()
{
web_url("10.180.6.100",
"URL=http://10.180.6.100/",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t1.inf",
"Mode=HTML",
LAST);
//关联函数
web_reg_save_param("BanlancePointIP",
"LB=6.",
"RB=/c",
"Search=Headers",
LAST);
web_url("loadbalance",
"URL=http://10.180.6.100/loadbalance",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t2.inf",
"Mode=HTML",
LAST);
//输将取到的IP值输出,便于调试及确定负载均衡服务提供的IP地址
lr_message("Banlance Point IP Is:%s",lr_eval_string("{BanlancePointIP}"));
//将要关联的脚本进行关联操作
web_submit_data("render_portlet",
"Action=http://10.180.6.{BanlancePointIP}/c/portal/render_portlet",
"Method=POST",
"RecContentType=text/html",
"Referer=http://10.180.6.{BanlancePointIP}/c/portal/layout?p_l_id=PUB.1.68",
"Snapshot=t3.inf",
"Mode=HTML",
ITEMDATA,
"Name=p_l_id", "Value=PUB.1.68", ENDITEM,
"Name=p_p_id", "Value=customizeArticles_INSTANCE_gGtp", ENDITEM,
"Name=p_p_action", "Value=0", ENDITEM,
"Name=p_p_state", "Value=normal", ENDITEM,
"Name=p_p_mode", "Value=view", ENDITEM,
"Name=p_p_col_id", "Value=column-7", ENDITEM,
"Name=p_p_col_pos", "Value=0", ENDITEM,
"Name=p_p_col_count", "Value=1", ENDITEM,
EXTRARES,
"URL=/html/images/pisoft-logo-bg.gif", "Referer=http://10.180.6.{BanlancePointIP}/c/portal/layout?
p_l_id=PUB.1.68", ENDITEM,
LAST);
web_custom_request("depart",
"URL=http://10.180.6.{BanlancePointIP}/depart?type=1&ou=105",
"Method=POST",
"Resource=0",
"RecContentType=text/html",
"Referer=http://10.180.6.{BanlancePointIP}/c/portal/layout?p_l_id=PUB.1.68",
"Snapshot=t4.inf",
"Mode=HTML",
"EncType=",
LAST);
.....
return 0;
}
lr_message运行输出结果:
第一次迭代时:Banlance Point IP Is:98
第二次迭代时:Banlance Point IP Is:113
第三次迭代时:Banlance Point IP Is:113