51Testing软件测试论坛

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

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 8015|回复: 4
打印 上一主题 下一主题

[原创] 对LR中报WSA_IO_pending的解析-Zee

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2007-12-14 10:02:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
原文见:http://blog.csdn.net/zeeslo


首先:谢谢曹向志老师的指点。
下面来看一下这个问题:
问题出现:


前几天一位珠海网友highoo问了一个问题:在使用LR进行性能测试的过程中出现了错误:WSA_IO_PENDING,Message Code 27740。
官方troubleshooting如下:
  1. Message Code 27740
  2. Overlapped transmission of request to '%1' for URL 'URL' failed.

  3. The transmission of data to the server failed. It could be a network, router, or server problem. The word Overlapped refers to the way LoadRunner sends data in order to get a Web Page Breakdown.

  4. Troubleshooting
  5. Add the following statement to the beginning of the script to disable the breakdown of the "First Buffer" into server and network time: web_set_sockets_option("OVERLAPPED_SEND", "0");
复制代码
解决方式:


添加:web_set_sockets_option("OVERLAPPED_SEND", "0")语句。


解析原因:


IO Overlapped是一种异步IO,在socket层,只有少量数据发送的时候,只要create new thread,send, receive,就可以了。但是,当数据量增加的时候,要考虑资源的充分利用,也要避免资源的拥塞队列,如果创建线程过多,和CPU内存磁盘等资源的交互过多,可能导致拥塞出现。在这时就要考虑资源的拥塞问题了,在socket中有两种处理的方式:

1, IO overlapped
工作方式是这样的:
A:调用WSARecv, WSARecvFrom, WSASend, WSASendTo, 或 WSAIoctl.等函数,传入overlapped参数,表示这个函数要执行这个动作;
B:调用WSAGetOverlappedResult函数来取数据;
C:再执行A,调用另一个带有overlapped的参数另一个线程交替处理。

这种方式,可以处理一定量的数据。但是在大数据量的时候,这种处理方式显示出了先天的不足。因为使用这种方式会创建新的线程,这样势必增加系统的开销。当出现成千上万的线程时,系统的开销已经相当大了,因为要频繁的在上下文之间切换。所以在socket编程里,这种方式,处理线程数不是很大的情况下是比较有优势的。

2, IO completion port
在winsock2中引入了异步IO的API:IOCP。其实这里也是overlapped的理念。但有不同,如下描述:
这种异步IO的工作方式是:先开一些线程,处在hold的状态下,应用线程和completion port关联起来,当某个线程要处理数据时,就与completion port进行通信,这样就可以进行socket操作了,这种处理方式就是在刚开始的时候,消耗一些资源开线程,处理大数据量的socket通信,如图:

这样一来completion port就可以处理threads和IO Device之间的交互了。
打个比方来说:
有很多人早上都去坐地铁,但是,如果不限制人往站台走的速度,售票口就要增加很多个才能处理乘客的请求,这样成本就会增加很多,并且站台上最后会挤满了人,最后导致危机出现;而现在,在进入地铁的时候,加上有序的限流措施,这样一来售票口不用增加,也可以处理乘客的请求,站台上就不会有那么大的压力。
在我的理解中,completion port就有着这么一个功能。在处理大数据量的时候,它起着维持秩序的作用。

以上为socket在处理数据量较大时的两种方式。
而在性能测试中,如果开的线程过多,可能某些资源不足导致不停的上下文切换,就会有thread得不到资源,从而出现pending。
如果我们关闭了overlapped,就会同步执行。这时如果CPU速度够快(同时其他资源是足够用的),是可以处理所有请求,并且不会出现pending的。但是,如果thread开的越来越多,也可能导致CPU处理不了,从而出现CPU频繁的上下文切换,或者队列增长。最后出错。这时,我们可以针对性的来提出解决方案了。

[ 本帖最后由 Zee 于 2007-12-14 10:05 编辑 ]

本帖子中包含更多资源

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

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2007-12-14 14:30:13 | 只看该作者
原来是这样啊。这个问题也遇到过,终于明白了
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2014-12-26 13:34
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    3#
    发表于 2008-4-28 09:07:49 | 只看该作者

    楼主博客中这篇文章倒是当时出问题的时候就见过。

    这个贴是今天才看到。

    名字写错了,是higkoo。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2016-12-30 10:59
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]测试排长

    4#
    发表于 2008-4-28 10:48:05 | 只看该作者
    学习了,谢谢
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    5#
    发表于 2009-9-30 11:21:53 | 只看该作者
    我刚刚碰到这个问题,你就帮解决了。谢谢了。
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

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

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

    GMT+8, 2024-11-16 10:39 , Processed in 0.076042 second(s), 29 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

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