chooffy104 发表于 2009-4-14 18:57:24

关于LR Socket通讯同步/异步的问题

我使用的是LR8.1

我翻查网上很多资料,大多数资料表明LR的Socket通信是同步的(即阻塞通信),换句话说就是假设没有收到上一条请求的响应信息的话就会一直等到超时。

但是我却遇到了以下问题,

代码片断:
1 lrs_send("socket1", "buf27", LrsLastArg);//发送20M数据包
2 lrs_receive("socket1", "buf28", LrsLastArg);//接收"150"响应
3 lrs_send("socket1", "buf29", LrsLastArg);//继续代码
4 lrs_receive("socket1", "buf30", LrsLastArg);

正常流程应该是这样的:
1、发送一个非常大的数据包(20MB)
2、发送完成后服务器返回一个"150"给我
3、我继续执行下一句语句

但是实际上却是这样的:
1、发送一个非常大的数据包(20MB),服务器限制了500k/s的速度(约40秒才会发送完成)
2、但约10秒后跳过了第1句lrs_send代码,执行第2句lrs_receive代码时 服务器返回了一个""给我(0长度的字符),但这个时候通过网络监测工具看到数据仍在传输
3、下面的语句执行失败

如果是这样的话,从现象来看Socket通信明显是异步的(非阻塞的),因为它没等数据传输完成就执行下一句了。如果是这样的话不断循环就会乱套了

后来我在lrs_send("socket1", "buf27", LrsLastArg)句后面加上了一句lr_think_time(40)可以解决这个问题,但另一个问题来了,就是如果我虚拟用户增加了以后每个用户的传输速度就会降下来,也就是说实际上可能需要更长的时间,那最后还是回导致数据乱套的问题


我想请教以下问题:
1、若LR的Socket通信是异步的,那是否可以设置成同步传输,即阻塞模式
2、若LR的Socket通信是同步的,那为什么数据没有传输完成的情况下LR就执行下一步操作?
3、是否LR只是把(20M)数据包发送到Scoket缓冲里就当是完成了?(因为我们一般不会Sand很大的数据包,所以并没有感觉到这个问题的存在)
4、是否有办法确实的等到了(20M)数据包发送完成后才继续执行以下语句?具体需要怎样做?

另外问一个相关的问题
我测试的结论是LR的速度模拟设置只能限制下载的速度,不能限制上传的速度,不知道各位是否有遇到这样的问题?

[ 本帖最后由 chooffy104 于 2009-4-14 19:01 编辑 ]

zhanglun1980 发表于 2009-4-15 11:46:56

lr winsocket有个很笨的检测。就是发一个数据包,一定要有一个recv。
所以阁下的测试方案,简直不可能完成测试。
MTUsize一般为1500.阁下可以把数据包减小一点。然后服务器端增加一个回应包。这样您就能完成lr socket的录制演示了。

kxcai 发表于 2009-4-15 18:47:37

我的和lz有所不同
需要异步处理,还没解决
比如我需要100个并发,每个用户都会sendData
然后第一个发的可能是最后一个读
但每次压力都上不去
很胸闷

chooffy104 发表于 2009-4-17 17:01:28

尝试了2楼所说的将数据包分成小包再发送,但是一旦分成超过20份就会导致LR崩溃(原因不明)。分成20份虽然能够运行成功但是会一直报以下错误
Action.c(185): 错误: 在扩展 run_time_context.dll 中调用 event-notify Vuser 函数时出现异常: System Exceptions: EXCEPTION_ACCESS_VIOLATION
而且每份仍然有1M这么大

3楼的问题:Socket链接是独立的,100个并发的话就有100条连接,应该不会出现第1个用户发送的信息第100个用户收到这种情况

[ 本帖最后由 chooffy104 于 2009-4-17 17:09 编辑 ]

zhanglun1980 发表于 2009-4-17 17:27:08

有两个原因
1、是你把20M数据分开发到server。server根本没有办法提供20m的socket缓冲区。无法完成组包。
2、你发20m数据是不是发得太快了。导致形成网络拥塞。例如:如果你1s之内发了20分包,(总共大小有20m数据)
一秒得码流为   160mbps/s。就算阁下是千兆内网。也无法,一秒中跑到160mbps/s得速度。
建议继续割包,一个包最好不要超过1400个字节。

chooffy104 发表于 2009-4-17 17:38:18

1、分成20份的时候脚本已经运行成功了(服务器也成功收到并重组数据包了),只是会报EXCEPTION_ACCESS_VIOLATION错
2、发送非常慢,4~5秒才发1/20,每发送一份都会停顿几秒才开始发下一份。另外,若分成1400个字节LR会直接崩溃了(原因不明)。经过反复测试,只要分割成超过20份LR就会崩溃...:L

zhanglun1980 发表于 2009-4-21 10:58:04

lr的data.ws是wsa--windows socket asy...同步socket通讯。
你呀是异步的。或许也是导致lr挂的原因。
4-5秒才发1/20。你要查看下怎么发的,如果前面3900ms一个数据没发。后面100ms发了1/20m。
也会造成拥塞,导致lr down。

z_three 发表于 2009-4-28 15:25:03

:( 没做过这方面的压测,看不懂,继续关注学习中

zishuijing 发表于 2010-4-27 18:00:31

回复 1# 的帖子

关注中,如果文件比较大 因为录制过程中,在data文件里面就得不到文件内容;

mr.bee 发表于 2011-7-21 15:27:25

异步通信就不要考虑传统性能测试工具了,我今天纠结了一个上午。

bingqing_1 发表于 2012-10-22 16:18:18

异步通信的时候,接收不到数据怎么处理呢?有什么好的处理建议没呢?O(∩_∩)O谢谢

bingqing_1 发表于 2012-10-22 16:18:25

异步通信的时候,接收不到数据怎么处理呢?有什么好的处理建议没呢?O(∩_∩)O谢谢

小柯烨 发表于 2012-10-22 17:09:03

观摩中

如果弯弯 发表于 2012-10-23 10:37:51

大体上看明白了,没有过同步异步的概念,学习了
页: [1]
查看完整版本: 关于LR Socket通讯同步/异步的问题