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

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

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

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

经过几次捣鼓,总结一下

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个基本上可以满足,如果超过该数量,可能服务端根本不存在了,或者网络不通了,服务端关闭连接是正确的做法。

DIOCP开源项目-DIOCP3的LoadRunner11测试报告的更多相关文章

  1. DIOCP开源项目-DIOCP3的重生和稳定版本发布

    DIOCP3的重生 从开始写DIOCP到现在已经有一年多的时间了,最近两个月以来一直有个想法做个 30 * 24 稳定的企业服务端架构,让程序员专注于逻辑实现就好.虽然DIOCP到现在通讯层已经很稳定 ...

  2. DIOCP开源项目-DIOCP3 大文件的传输DEMO<断点续传>

    首先该DEMO在StreamCoder上面做的改动,期间导致StreamCoderDEMO经常出现问题,导致大家运行的时候,频频出现问题,表示道歉. 以下是测试的结果,从服务器下载传输了一个3G左右的 ...

  3. DIOCP开源项目-DIOCP3重写笔记-1

    这几天在在重新DIOCP3,基本工作已经初步完成,进入测试阶段,今天加入排队投递,本认为是个很简单的工作,稍微不注意,留了两个坑,调了7,8个小时,刚刚总算找到问题,记录一下, 关于排队投递的流程 这 ...

  4. DIOCP开源项目-DIOCP3直接发送对象,帮你处理粘包问题

    该DEMO演示,如何在客户端与服务端之间直接传递TStream对象,让你专注于处理数据逻辑,可以忽略处理网络传输间粘包的问题. 上面由服务端向所有的客户端推送一个消息TMemoryStream对象(该 ...

  5. DIOCP开源项目-DIOCP3的ECHO测试<贴图>

    星期六开了测试台测试机子.星期天休息,今天早上来接两个图 开了2个客户端,一个qsl的echo client,一个是楠楠的dbiocp回调客户端.建立13240个连接 今天来后,机子很卡,后来发现是楠 ...

  6. DIOCP开源项目-高效稳定的服务端解决方案(DIOCP + 无锁队列 + ZeroMQ + QWorkers) 出炉了

    [概述] 自从上次发布了[DIOCP开源项目-利用队列+0MQ+多进程逻辑处理,搭建稳定,高效,分布式的服务端]文章后,得到了很多朋友的支持和肯定.这加大了我的开发动力,经过几个晚上的熬夜,终于在昨天 ...

  7. 【DIOCP开源项目】实际应用案例

    案例1 DIOCP是Delphi下进行IOCP服务端通讯开发的一个非常好的开源框架,稳定.高效并且使用起来十分简单. 自己两个多月之前因为需要使用Delphi开发一个TCP服务端,当时也是到处爬文,希 ...

  8. DIOCP开源项目-利用队列+0MQ+多进程逻辑处理,搭建稳定,高效,分布式的服务端

    最近头脑里面一直在想怎么样让能让大家基于DIOCP上写出稳定的服务端程序.很多朋友问我,你DIOCP稳定吗,我可以用他来做三层服务器吗? 当时我是这样回答的,我只能保证DIOCP底层通信的稳定. 说实 ...

  9. DIOCP开源项目-Delphi高性能无锁队列(lock-free)

    最近想在DIOCP中加入任务调度线程,DIOCP的工作线程作为生产者(producer)将接受到的数据对象,投递到任务调度线程中,然后统一进行分配.然而这一切都需要一个队列, 这几天都在关注无锁队列. ...

随机推荐

  1. (原)PyTorch中使用指定的GPU

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6836568.html PyTorch默认使用从0开始的GPU,如果GPU0正在运行程序,需要指定其他G ...

  2. 关于CASE WHEN的多条件汇总问题

    https://bbs.csdn.net/topics/392217817?page=1 问题: --创建测试表 IF EXISTS (SELECT * FROM sys.objects WHERE ...

  3. openstack nova 深入

    一.概述: 由nova --debug list查看到: #nova --debug list DEBUG (session:195) REQ: curl -g -i -X GET http://19 ...

  4. Android开发网上的一些重要知识点[经验分享]

    1. android单实例运行方法 我们都知道Android平台没有任务管理器,而内部App维护者一个Activity history stack来实现窗口显示和销毁,对于常规从快捷方式运行来看都是s ...

  5. xtrabackup-解压备份文件报错sh: qpress: command not found

    # xtrabackup --decompress --target-dir=/data/compressed xtrabackup version 2.4.8 based on MySQL serv ...

  6. JAVA Socket编程和C++ Socket编程有什么不同

    原文链接: http://zhidao.baidu.com/link?url=16TEzhom2Nr8x1_2uTRp-e2pgZRgS5nW5ywtRX2XLHbtLOG8btif5DTyP85jf ...

  7. 跟我学SharePoint 2013视频培训课程——网站导航及页面元素(2)

    课程简介 第2天,介绍SharePoint 2013 网站导航及页面元素 视频 SharePoint 2013 交流群 41032413

  8. Java NIO.2 —— 文件或目录拷贝操作

    拷贝整个文件树是可以递归每个目录和文件调用 Files.copy()方法.在使用的时候有一下注意事项. 在往目录拷贝文件之前,首先要保证目录已经存在.拷贝源目录(不论是否为空)都会生成目标目录.整个任 ...

  9. Knockout: radio选项切换引发click事件的一点总结

    1.场景:如下图,当选择定期存款时,输入框右边出现红色的必输项星号,当选择活期存款时,不再出现该星号. 2.思路一:不使用knockout,直接用click事件,就可以实现这个需求,代码如下: < ...

  10. Winform开发框架之通用高级查询模块--SNF快速开发平台3.3-Spring.Net.Framework

    最近项目确实忙,但也是一直忙于有关项目和框架技术的事情,也一直致力于改善我的WInform开发框架.使得自己及客户使用起来更加方便,更加友好,更加高效. 在很多程序模块中都很常见,也是给客户扩展查询的 ...