51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 34591|回复: 95
打印 上一主题 下一主题

[求助] 如何实现并发操作(由并发引出的问题及思考-小结)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2007-4-13 00:01:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用loadrunner如何实现用户的并发呢?比如我使用某个用户名登陆服务器,然后进行了一些操作。现在我想模拟100个这样的用户对服务器进行操作,那么我如何模拟这100个用户的并发呢?就是说这100个用户登陆服务器并进行操作,而登陆用户名将在服务器端的列表中显示。那么在controller中如何设置呢?使用不同的用户名加载100个脚本吗?quantity的作用在什么时候使用?

[ 本帖最后由 guxingyun 于 2007-4-18 15:47 编辑 ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2007-4-13 09:16:59 | 只看该作者
建议楼主先了解一下LR的机制和使用手册。

100个用户在Controller里面quality设置。脚本就是你录制的需要并发的脚本。
回复 支持 反对

使用道具 举报

该用户从未签到

3#
 楼主| 发表于 2007-4-13 09:58:07 | 只看该作者
在controller中将quantity设置为100,这样相当于将一个用户初始化100次,然后此用户进行100个这样的并发操作。不知理解对否??
或者是quantity是100,给服务器的压力就是100个这样的用户并发操作,尽管在服务器端看到的在线用户只用一个,但这个用户的操作相当于100个用户同时操作。不知这样的理解是否正确?
如果上面的理解是正确的,那么我想模拟100个用户同时在线并在服务器端真实可见又当如何实现呢?

[ 本帖最后由 guxingyun 于 2007-4-13 10:22 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

4#
 楼主| 发表于 2007-4-13 10:56:30 | 只看该作者

回复 #5 xiaomayi0323 的帖子

就是说这100个用户是controller虚拟的?
至于在服务器端看到的只用一个用户名在线只是一个显示而已,而100个用户同时进行同一操作的工作已经由controller虚拟了。是这样吗??
回复 支持 反对

使用道具 举报

该用户从未签到

5#
 楼主| 发表于 2007-4-13 11:32:52 | 只看该作者
是显示一个用户在线,但是在服务器列表中可以看到他们登陆进来时使用了不同的端口号。在列表中显示的是最后的那个端口号,比如第一个登陆端口是1000,那么第100个为1099,服务器上显示的用户端口号就是1099这个。我的QQ是80277201,还有些问题想请教。
回复 支持 反对

使用道具 举报

该用户从未签到

6#
发表于 2007-4-13 13:15:18 | 只看该作者
我也一直对此问题疑或不解,请求高人指点
回复 支持 反对

使用道具 举报

该用户从未签到

7#
 楼主| 发表于 2007-4-13 15:09:51 | 只看该作者
guxingyun 3#提问:
在controller中将quantity设置为100,这样相当于将一个用户初始化100次,然后此用户进行100个这样的并发操作。不知理解对否??
或者是quantity是100,给服务器的压力就是100个这样的用户并发操作,尽管在服务器端看到的在线用户只用一个,但这个用户的操作相当于100个用户同时操作。不知这样的理解是否正确?
如果上面的理解是正确的,那么我想模拟100个用户同时在线并在服务器端真实可见又当如何实现呢?

版主的回答:
两种理解都有问题,这就是LR的机制问题。
quantity是100,表示利用100个并发用户,这个时候服务器看到的在线用户就是100个。而不是一个用户。LR的机制是:
LoadRunner  是一种预测系统行为和性能的工业级标准性能测试负载测试工具。通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner 能够对整个企业架构进行测试。通过使用LoadRunner ,企业能最大限度地缩短测试时间,优化性能和加速应用系统的发布周期

看完后我的疑问是:
如何在服务器端看到这100个用户,是将用户名参数化吗还是? 看来我是有点钻牛角了。
我把我的录制内容放在下面,很简单的几句。
vuser_init()
{
    lrs_startup(257);
    lrs_create_socket("socket1", "TCP", "LocalHost=0", "RemoteHost=192.168.0.48:8020",  LrsLastArg);
    lrs_send("socket1", "buf0", LrsLastArg);
    return 0;
}

Action()
{
    lr_think_time(0.1);
    lrs_send("socket1", "buf1", LrsLastArg);
    return 0;
}

vuser_end()
{       
    lrs_close_socket("socket1");
    lrs_cleanup();

    return 0;
}

;WSRData 2 1

send buf0 25
        "(username发送给服务器用户名)"

send buf1 101
        "(发送给服务器的内容)"
-1
回复 支持 反对

使用道具 举报

该用户从未签到

8#
发表于 2007-4-13 15:33:42 | 只看该作者
首先,LR并发100个用户时,你在controller 中的Vuser是可以看到100用户的,每个用户不同的ID;
其次,服务端也可以看到的,不过要视乎你测试的系统,我这边的在应用服务器下LOG可以非常清晰地见到每个不同ID的用户操作,也就是说,客户端每与服务器连接上了,服务器分配唯一一个ID给他;
再次,LR中的controller虚拟用户时是分线程(Run Vuser as a thread)和进程(Run Vuer as a process)两种的,结果当然有区别的,不知道LZ是否留意???
回复 支持 反对

使用道具 举报

该用户从未签到

9#
 楼主| 发表于 2007-4-13 17:07:13 | 只看该作者
我在controller 中的Vuser可以看到100用户的,每个用户都拥有不同的ID,只是这些用户拥有相同的用户名。
这样的操作就是100个用户的并发操作了,是吗?
我的设置是Run Vuser as a thread。

[ 本帖最后由 guxingyun 于 2007-4-13 17:17 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

10#
发表于 2007-4-13 17:27:09 | 只看该作者
你脚本为什么只有send没有receive?
回复 支持 反对

使用道具 举报

该用户从未签到

11#
发表于 2007-4-13 22:59:18 | 只看该作者
我要下载
回复 支持 反对

使用道具 举报

该用户从未签到

12#
 楼主| 发表于 2007-4-15 19:52:29 | 只看该作者
我把receive部分的暂时屏蔽了,因为如何动态保存客户端接收服务器发送过来的数据的方法我还不知道,所以就想先将客户端send并发的问题先弄明白了了再考虑receive的保存问题。谢谢各位的解答。
现在我将系统的整个通讯流程和自己实施测试的拟定方案向大家作个介绍,方便大家的解疑和交流。系统由分发中心、应用服务器、通讯服务器、客户端和定位终端构成,就像是现在的车载定位导航.

需要测试应用服务器的压力,测试的目标是10000个定位终端每秒种发送一次数据给通讯服务器,通讯服务器发送给应用服务器,客户端登陆应用服务器可以看到定位终端的位置。我的测试方案是模拟100个通讯服务器,每个通讯服务器每秒钟发送100条定位数据,脚本就和上面所述的一致,100条数据每秒的实现方式是将lr_think_time设置为0.1,然后将运行时设置中的think*0.1,这样实现好像很点笨,不过其他的方式不晓得。
不知你们对这样系统的应用服务器是怎样进行测试的??

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
回复 支持 反对

使用道具 举报

该用户从未签到

13#
发表于 2007-4-16 11:54:33 | 只看该作者
可以用controller的目标场景试试
回复 支持 反对

使用道具 举报

该用户从未签到

14#
 楼主| 发表于 2007-4-16 16:13:59 | 只看该作者

回复 #16 yuanlj 的帖子

谢谢yuanlj提供的思路,根据这个思路我产生了三个疑问,正确与否请各位给与指导。

疑问一:使用controller的目标场景倒是一个新的思路,我现在正在试着使用这种方式进行测试,但是又遇到了新的疑问,就像我在#15楼说的那样,使用的单位是1秒多少数据,但是如果现在更改为1500个定位设备在线,每个设备5秒回传一次数据给通讯服务器,通讯服务器再上传给应用服务器,此处的疑问出现了,我将通讯服务器发送给应用服务器的action定义为一个transaction,在controller的goal(目标)中设置  ?transactions per second ,这个?应该是‘?’多少才合理呢,还是1500吗,应为当这么多设备同时在线后,每一秒回传的数据条数我不知怎么确定,所以我觉得是1500transactions per second,但是我找不到依据,有什么方法可以确定的吗?

疑问二:在看了controller8.2的中文帮助(117页)关于“了解每秒点击次数/事务数和每分钟页面数目类型”(软件自带帮助 Understanding the Hits/Transactions per Second and Pages per Minute Goal Types )时,看到相关如下内容:“在定义每分钟页面数或每秒点击次数 /事务数目标类型时, Controller 将用您定义的目标值除以您指定的最小 Vuser 数,并据此确定每个 Vuser 应该达到的每秒点击次数/ 事务数或每分钟页面次数的目标值。然后, Controller 将根据您定义的加载行为设置开始加载 Vuser”,依据这个说法,我在设置目标场景的最大最小vuser时又当如何确定呢??

疑问三:为了使用目标场景,我在脚本的action中插入了transaction,在controller的目标场景设置页面我取消了Do not change recorded think time ,且run-time setting中的think time设置方式是 replay think time :as recored那么在场景运行的过程中将如何处理think time 呢?
Action()
{
        lr_start_transaction("send");

        lr_think_time(1);
          lrs_send("socket1", "buf1", LrsLastArg);

          lr_end_transaction("send", LR_AUTO);

          return 0;
}

[ 本帖最后由 guxingyun 于 2007-4-16 16:23 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

15#
发表于 2007-4-16 16:16:09 | 只看该作者
呵呵呵呵,又有人开始研究概念了,呵呵。
回复 支持 反对

使用道具 举报

该用户从未签到

16#
发表于 2007-4-16 16:18:40 | 只看该作者
其实这个问题都已经讨论过多次了,可以前人的帖子。

其实稍微了解一下LR的运行机制,这个问题就迎刃而解了。
回复 支持 反对

使用道具 举报

该用户从未签到

17#
 楼主| 发表于 2007-4-16 16:47:12 | 只看该作者

回复 #18 大漠飞鹰 的帖子

哈哈 或许是初学者的原因吧 一个简单的问题也要寻根究底的才能弄个明白
至于lr的运行机制我今天会查资料了解一下的,因为我真的不明白
至于前面提到的‘开始研究概念’主要是想如何才能让这个系统的压力测试更加合理,所以由此引出些疑问和想法,希望各位前辈给与指导 sdlkfj1
回复 支持 反对

使用道具 举报

该用户从未签到

18#
发表于 2007-4-16 16:55:28 | 只看该作者
原帖由 guxingyun 于 2007-4-16 16:47 发表
哈哈 或许是初学者的原因吧 一个简单的问题也要寻根究底的才能弄个明白
至于lr的运行机制我今天会查资料了解一下的,因为我真的不明白
至于前面提到的‘开始研究概念’主要是想如何才能让这个系统的压力测试更 ...


这个问题我稍作描述:
一般指的并发,是某系统下同时在使用的用户数,而不是用时做某一个操作。

LR中的设置用户数后,一般都会陆续增加用户,因此是普通意义上的并发。
如果要测试某一系统下同时做某一操作,例如大家一起点击[申请]提交数据,那么需要在LR中设置集合点。

集合点的相关资料,你查一下软件帮助,里面说的很清楚。
回复 支持 反对

使用道具 举报

该用户从未签到

19#
 楼主| 发表于 2007-4-16 17:13:10 | 只看该作者

回复 #21 大漠飞鹰 的帖子

照这样看来我#15楼之前的疑问是停留在用户和服务器之间,#15楼之后的是服务器与服务器之间的,它们两之间的通信是连续不断的,和集合点不一样,所以在测试应用服务器压力的时候不知如何才准确?
回复 支持 反对

使用道具 举报

该用户从未签到

20#
发表于 2007-4-17 11:08:02 | 只看该作者
原帖由 guxingyun 于 2007-4-15 19:52 发表
我把receive部分的暂时屏蔽了,因为如何动态保存客户端接收服务器发送过来的数据的方法我还不知道,所以就想先将客户端send并发的问题先弄明白了了再考虑receive的保存问题。谢谢各位的解答。
现在我将系统的整 ...


不好意思,忘了你的msn,只好在这里回复。

可以通过目标测试实现,可通过每秒通过的事务来测试。这个没有难度。

至于思考时间,需要注意一下:
1、目标设置中有一个选项“不更改录制时思考时间”,默认是没有选中的。执行时会将事务中的思考时间去除。
2、如果要保留思考时间,需要将上述的选项选中,并且在运行时设置中设置保留思考时间。


很显然,如果加入思考时间,相同每秒事务下,vuser肯定要大。
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-4-25 11:47 , Processed in 0.085488 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表