LoadRunner使用之web_concurrent_start和web_concurrent_end的作用

转自:http://www.51testing.com/html/63/290563-245377.html
转自:https://zhidao.baidu.com/question/241821465120836164.html

**

问题:loadrunner 关于并发的问题 web_concurrent_start 和 lr_rendezvous

**

web_concurrent_start 和web_concurrent_end 之间的请求可以一次性并发,这是我之前了解到的。

集合点rendezvous,也可以通过多用户并发。

我现在想知道它们有什么区别。
就我的理解,
1用户下,使用web_concurrent_start(end)一次性提交20请求;
和20用户下,通过rendezvous来集合后,每用户提交1个请求;
这两种场景应该是一样的,因为都是一次向服务器同时提交了10个请求。

但是我实际跑的结果来看来,rendezvous方式只能达到19用户,到20用户时服务器卡死,已经尝试多次都如此;
但是使用web_concurrent_start(end)一次性提交20,30以上都没问题。

所以来这里问问有哪位大神知道为什么会这样。

附带我的代码
1,rendezvous方式,20用户
Action()
{
lr_rendezvous(“bingfa”);

web_custom_request(“baseoper_4”,
“URL=http://{IP_PORT}/PLATFORM/baseoper”,
“Method=POST”,
… 略 …,
“Body={… 略 …},
LAST);
}

2,web_concurrent_start(end)方式

Action()
{
int i;

web_concurrent_start(NULL);

for(i=1;i<=20;i++){
web_custom_request(“baseoper_4”,
“URL=http://{IP_PORT}/PLATFORM/baseoper”,
“Method=POST”,
… 略 …,
“Body={… 略 …},
LAST);
}

web_concurrent_end(NULL);
}

——————————————————————————————

从概念上说
前者(web_concurrent_start)是语句的并发 后者(lr_rendezvous)是user的并发
这是两件完全完全不同的事情 没有什么可以比较的 仅仅只是都有“同时执行”的意思而已

详细来说
URL-based 方式 默认是将每个请求录制成一条语句 而一条语句只建立一个到服务器的连接
比方说 一个page上面 有图片 有文本 有音视频 有编辑框 有按钮 有链接 有复选框 等等等等……
那么请求图片 请求文本 请求音视频…… 就上面所有那些 都各自分别是一条语句

如果不写web_concurrent_start和web_concurrent_end函数 就默认按语句的顺序执行请求
而写了web_concurrent_start和web_concurrent_end函数之后 就会将这些请求同时发送
容易想象的是 并发请求时的压力 会比顺序请求的时候 要大

而集合点 或者也有叫同步点的 它的概念比较容易理解 就不解释了

下面针对你的问题:
“1用户下,使用web_concurrent_start(end)一次性提交20请求;
和20用户下,通过rendezvous来集合后,每用户提交1个请求;
这两种场景应该是一样的,因为都是一次向服务器同时提交了10个请求。”

这是不准确的 原因至少有两点:

第一 单用户多请求的并发性 要强于多用户的集合点
这是因为 集合点是多线程的并发 它的并发性是有限的 宏观上是并发 微观上不可能并发
因为如果你的电脑是单CPU的 那么你就不可能获得严格意义上的并发执行
按照操作系统中 进程和线程的关系 在某一个时间点 严格上讲 就只有一个人得到执行
除非你给每个用户配备一个CPU 才能达到真正的并发 但显然这是不可能的

第二 你的每个请求的开销并不一定是相同的 这也导致测试结果的不可控
最简单的 请求一段文字 与请求一段音视频 产生的系统开销肯定是不一样的
你使用的web_custom_request函数 并不是发送完了就完了 而是返回完毕才算完成

返回一段几KB的文字 与返回一段几MB的音视频 对网络的压力肯定是不一样的

当然还可以有其他的理解 你可以自己继续分析

而且可以预见的是 你这种测试 每一次都有可能获得不同的结果
我指的是你请求的东西不一样的情况下 比如你换一个站点进行测试 结果就有可能是相反的
原因就是我上面说的第二点
追问
非常谢谢回答,能继续说明一下“第一 单用户多请求的并发性 要强于多用户的集合点” 照这么说,应该是单用户多请求造成的压力更大才对,试验的结果是,单用户并发可以达到180个请求;多用户集合点并发只能达到19用户。
两种方式,请求都是完全一样的,就是把产品号码发送到服务器,服务器收到以后进行相应逻辑处理并读写数据库。所以“第二 你的每个请求的开销并不一定是相同的..” 这点我觉得可排除
追答
“单用户并发可以达到180个请求;多用户集合点并发只能达到19用户”
这个实验结果 是以什么为结束的?
是以场景报错而结束嘛?报的是什么错误?

另外 我看到你写的
“两种方式对于服务器来说,都是同时收到20请求”
此同时非彼同时 换言之 你使用的多线程并发的“同时” 不如单线程的“同时” 精确度高
多线程 再怎么“同时” 也有先有后
追问
私信给你了,这里会采用的,先谢谢啊。

——————————————————————————————————————

在以URL-based 方式录制脚本时,出现以下web_concurrent_start(null),web_concurrent_end(null)两个函数,查了一下:

URL-based 方式将每条客户端发出的请求录制成一条语句,对LoadRunner来说,在该模式下,一条语句只建立一个到服务器的连接,LoadRunner提供了web_concurrent_start和web_concurrent_end函数模拟HTML-based的工作方式,

就是并发发出请求!
将多个请求同时发送,不加的话这些URL是排除请求
将web_concurrent_start和web_concurrent_end中间的内容一起发,我都把他当成{},内容放里面就行,表示这里面的东西是在一个并发组里


很多地方都没有把这个东西解释清楚。其实比较容易理解的。就是并发组这个概念把人说晕了。

简单的说:
这两个函数是在URL中标记一个页面请求的,注意:这里我说的是页面(page),并不是请求。
在LR请求一个页面里,由于使用URL的方式录制,会把一个页面中的元素分成几个web函数做处理。所以,LR中实现了web_concurrent_start和web_concurrent_end。实现的作用是:
从web_concurrent_start开始标记,当脚本运行到web_concurrent_start时,后续的脚本都不会立即被执行,直到web_concurrent_end出现。才把这中间的所有的脚本一起执行。
所谓并发组也是指把这一组函数一起执行起来。

如果你用 lr_start_transaction和 lr_end_transaction来替换,脚本完全可以跑通。中间的脚本是从上到下执行的,而不是一起执行的。
其他的没有作用。
语法:
 int web_concurrent_start ( [char * ConcurrentGroupName,] NULL );
参数:
 ConcurrentGroupName:可选的,并发组的标识符。
NULL:参数列表结束的标记符。
返回值
 整型。返回LR_PASS (0)表示成功,返回LR_FAIL (1)表示失败。
说明
 web_concurrent_start函数是并发组开始的标记。组中所有的函数是并发执行的。并发组的结束web_concurrent_end 函数。在并发组中,可以包含的函数有:web_url、web_submit_data、web_custom_request、web_create_html_param、web_create_html_param_ex、web_reg_save_param、web_add_header。
在并发组中的函数不是立即执行的。在并发组开始时,所有的函数首先被记录下来,当并发组结束时,所有的函数并发执行。
所有的Web 用户,HTTP模式下的WAP用户持本函数。运行在Wireless Session Protocol(WSP)回放模式下的WAP虚拟用户,不支持本函数。
web_concurrent_start

 语法:
 int web_concurrent_end ( reserved );
参数:
 reserved:保留的供扩展的字段。
返回值
 整型。返回LR_PASS (0)表示成功,返回LR_FAIL (1)表示失败。
说明
 web_concurrent_end,并发组结束的标记。脚本执行时,碰到 web_concurrent_end函数时,开始并发执行所有记录的函数。
在并发组中的函数不是立即执行的。在并发组开始时,所有的函数首先被记录下来,当并发组结束时,所有的函数并发执行。
可以并发执行的函数的个数是有限制的,使用运行时设置-Netword标签页的Concurrent Connection来设置。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值