zoukankan      html  css  js  c++  java
  • DIOCP开源项目-DIOCP3的LoadRunner11测试报告

    昨天有个多年的群友(B3.Locet)用LoadRunner11对DIOCP3做压力测试,说测试的时候出现了大量的10053,10054的报告。昨天晚上下载了个LoadRunner11, 今天捣鼓了下。没用过这么高级的东西,

    LoadRunner是专业的测试工具,用来测试DIOCP3 Echo测试服务器,是用socket协议进行测试

    脚本写的很简单,每次发送101次数据,然后关闭连接。

    image

    在运行的时候模拟1000个用户运行,可以选择连续执行,或者只运行一次。经过测试发现,报告上面出现大量的10053,和10054的错误。

    image

    经过几次捣鼓,总结一下

    1.DIOCP3的服务端对每个Socket连接发送请求(WSASend)做了排队处理,由一个队列来保存发送的请求,然后一个个进行排队投递,如果排队数量超过10个将会被T掉(这样可以防止客户端恶意不接受的行为),这样客户端会触发10054,或者10053的错误。

    2.Loadrunner的发送的频率较高,但是接收比较慢,导致了服务端WSASend处理过慢,导致了服务端的发送缓存队列积满(推测,对Loadrunner了解太过肤浅), 应该可以改造下客户端脚本可以处理该问题。

    3.为了让测试数据比较好看,对DIOCP3的测试服务端做了部分调整,把发送缓存队列上提到10240(也就是可以让队列存放1W多个缓存数据),如果每个socket都使得内存爆满,估计会服务端内存暴掉,然后把投递日志的开关关掉了。再次测试,允许许久, OK,基本无错误产生。

    unit iocpTcpServer;

    interface

    {.$DEFINE LOGGER_ON}         //把编译注释掉,可以关闭服务端的日志投递
    {.$DEFINE DEBUG_MSG_ON}  //把编译注释掉,可以关闭服务端的日志投递

    constructor TIocpClientContext.Create;
    begin
      inherited Create;
      FAlive := False;
      FRawSocket := TRawSocket.Create();
      FActive := false;
      FSendRequestLink := TIocpRequestSingleLink.Create(10);   ///这里可以调整发送队列的大小,默认为10
      FRecvRequest := TIocpRecvRequest.Create;
      FRecvRequest.FClientContext := self;
    end;

    总结:

        正常使用发送队列10个基本上可以满足,如果超过该数量,可能服务端根本不存在了,或者网络不通了,服务端关闭连接是正确的做法。

      

  • 相关阅读:
    Hibernate Tools-代码生成
    Java集合(二):List列表
    linux路由
    微软发布SQL Server on Linux
    微软Azure虚拟机备份服务在中国发布
    微软物联网平台再推新!
    微软宣布在Azure上支持更多的开放技术和选择
    2015年微软“十大”开源之举
    “云中论道”之——华山论剑 ,唯快不破:秘笈分享
    牛津计划折射2016年微软开源领域“大步走”
  • 原文地址:https://www.cnblogs.com/DKSoft/p/3907034.html
Copyright © 2011-2022 走看看