google搜索 51Testing站内搜索                    软件测试门户 | 软件测试培 训 | 文章资料精选 | 软件测试论坛 | 软件测试博客 | 测试招聘求职 
打印

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

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


使用loadrunner如何实现用户的并发呢?比如我使用某个用户名登陆服务器,然后进行了一些操作。现在我想模拟100个这样的用户对服务器进行操作,那么我如何模拟这100个用户的并发呢?就是说这100个用户登陆服务器并进行操作,而登陆用户名将在服务器端的列表中显示。那么在controller中如何设置呢?使用不同的用户名加载100个脚本吗?quantity的作用在什么时候使用?

[ 本帖最后由 guxingyun 于 2007-4-18 15:47 编辑 ]

TOP

建议楼主先了解一下LR的机制和使用手册。

100个用户在Controller里面quality设置。脚本就是你录制的需要并发的脚本。
欢迎访问Ricky的专业个人测试博客
http://www.rickyzhu.com
专注于测试自动化,性能测试以及测试工具的研究

TOP

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

[ 本帖最后由 guxingyun 于 2007-4-13 10:22 编辑 ]

TOP

可以虚拟100个用户使用你所录制的脚本,这就相当于一百个不同的用户同时登陆服务器进行操作。
只要去找,BUG到处都是。

TOP

不是一个用户进行100个并发操作
而是100个用户同时进行同一操作,这就形成了并发
这100个用户是虚拟的
只要去找,BUG到处都是。

TOP

回复 #5 xiaomayi0323 的帖子


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

TOP

100个用户同时进行同一操作的工作就是由controller来做
至于服务器端是否只显示一个用户在线,就不太清楚
只要去找,BUG到处都是。

TOP

是显示一个用户在线,但是在服务器列表中可以看到他们登陆进来时使用了不同的端口号。在列表中显示的是最后的那个端口号,比如第一个登陆端口是1000,那么第100个为1099,服务器上显示的用户端口号就是1099这个。我的QQ是80277201,还有些问题想请教。

TOP

我也一直对此问题疑或不解,请求高人指点

TOP

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

TOP

首先,LR并发100个用户时,你在controller 中的Vuser是可以看到100用户的,每个用户不同的ID;
其次,服务端也可以看到的,不过要视乎你测试的系统,我这边的在应用服务器下LOG可以非常清晰地见到每个不同ID的用户操作,也就是说,客户端每与服务器连接上了,服务器分配唯一一个ID给他;
再次,LR中的controller虚拟用户时是分线程(Run Vuser as a thread)和进程(Run Vuer as a process)两种的,结果当然有区别的,不知道LZ是否留意???
为生活而测试,为测试而生活!

TOP

我在controller 中的Vuser可以看到100用户的,每个用户都拥有不同的ID,只是这些用户拥有相同的用户名。
这样的操作就是100个用户的并发操作了,是吗?
我的设置是Run Vuser as a thread。

[ 本帖最后由 guxingyun 于 2007-4-13 17:17 编辑 ]

TOP

你脚本为什么只有send没有receive?
个人网站:http://www.7dtest.com

TOP

我要下载

TOP

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

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

TOP

可以用controller的目标场景试试

TOP

回复 #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 编辑 ]

TOP

呵呵呵呵,又有人开始研究概念了,呵呵。
飞翔是我的梦想;
测试需要有鹰一般的眼睛;
搞软件,如同在沙漠中穿行一般,随时都有被埋葬的可能。

MSN:zhyexy@hotmail.com

TOP

其实这个问题都已经讨论过多次了,可以前人的帖子。

其实稍微了解一下LR的运行机制,这个问题就迎刃而解了。
飞翔是我的梦想;
测试需要有鹰一般的眼睛;
搞软件,如同在沙漠中穿行一般,随时都有被埋葬的可能。

MSN:zhyexy@hotmail.com

TOP

回复 #18 大漠飞鹰 的帖子


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

TOP

 
当前时区 GMT+8, 现在时间是 2008-9-7 15:09Copyright(C)上海博为峰软件技术有限公司 2001-2007 电话:021-64471599-8017
当您在访问网站、论坛及博客过程中遇到问题时可发送email:webmaster@51testing.com或发送论坛短信至管理员风在吹