IOCP构架之所以公认高效,核心就在于异步IO。在网上纷纷为之膜拜之余,很少看到对稳定性或性能优化的观点。仔细想想,任何技术都有有利的一面,自然也有有弊的一面,这才符合辩证法思想。 
我把自己在编写IOCP构架时重点处理的几个地方交代一下,如果你想认真写好一个稳定的IOCP服务端,建议重新规划以下几个细节。

1)不要修改套接字默认的收发缓冲区大小,即8192字节=8K=2分页。

2)总所周知,x86页面置换最少需要1分页,所以不管IOCP的重叠IO涉及多少字节,OS至少需要加锁/解锁1分页,在使用异步WSARecv/WSASend时,只要重叠缓冲区WSABuf的长度大于0,那么在投递异步操作时,系统至少会锁定1分页的非页面内存,而系统的非页面缓冲池是有大小限制的,如果你的IOCP消耗了太多非分页内存。轻则同服务器其他网络进程无法使用网络,重则可能会导致系统蓝屏或其他崩溃。而对于你的IOCP服务端通讯,常见的现象是客户端无法与服务端进行连接,或者收发包时出现 10055 。

3)正是由于情况2的出现可能性,所以在投递WSARecv/WSASend时,绝对不要贪图简单,直接进行投递,正确的做法应该为每个套接字建立至少2个缓冲队列,一收一发。

4)对于同一个客户端套接字,在同一时间最好只有一个WSARecv/WSASend,如果你想提高IOCP网络吞吐量,可能会在同一个套接字上同时投递多个WSARecv/WSASend,那么你将会面临下面几个情况必须处理:

a)IO线程之间的WSARecv/WSASend操作频繁加锁/解锁,因为你无法保证线程1在GQCS时,线程2不会对相同套接字GQCS。

b)收发出现乱序,仔细想一下,正是因为你对同一套接字同时投递多个WSARecv/WSASend导致的,有你忙的了。

c)短时间内大量WSARecv/WSASend异步操作消耗太多非分页内存,也许在你下次投递收发操作时,OS会毫不留情给你一个10055错误。

5)现在你应该明白服务端的稳定是一个前提,需要比高吞吐量更要优先考虑,那么对于情况4建议的缓冲队列,绝对应该是你首先需要考虑的。

6)合理限制客户端套接字的流量(包速),即你需要规划完整合理的Qos,否则一旦恶意连接试图以大流量正常业务包攻击你的IOCP时,你会发现你的IOCP构架是多么脆弱。

7)为了减少情况6的出现,建议你在客户端/服务端通讯时增加压缩(加密)/解压缩(解密)功能,最好加入时间戳或GUID校验,避免出现同样的业务收发相同的包,最终导致攻击者只需要截取一个正常业务包,就能干出情况6的事情。

也许你会觉得如此实现太影响IOCP吞吐量,确实如此,收/发缓冲队列、Qos、加密解密都会降低IO吞吐量。希望你在决定之前,先衡量一下你未来的IOCP服务端菊花是否够紧,否则有一天你会高呼:OMG,是谁又把我那可怜而又脆弱的IOCP爆菊了?

IOCP不可忽视的细节相关推荐

  1. jquery mobile和ajax,使用jquery mobile不可忽视的细节

    jQuery Mobile 是创建移动WEB应用程序的框架.在学习和使用该框架的过程中,有一些心得想要和大家分享一下. 一.框架 因为是移动端开发,所以不要忘了下面这个重要的meta标签哦: 使用jq ...

  2. Gmail Mobile 不可忽视的七个细节

    许多朋友喜欢在 iPhone 上用内置的 Exchange 客户端来收取 Gmail ,的确这样速度很快而且方便(在国内很稳定).可惜这样就无法欣赏到世界上最优秀的 Web App ,并忽视了它那些迷 ...

  3. 计算机专业需要注意什么细节,计算机专业考生复试注意事项

    计算机专业考生复试注意事项 随着计算机相关技术的突飞猛进,对人才的职业发展也提出了更高的要求.近年来,计算机及相关专业一直是研究生报考的热门专业,复试中的竞争日益激烈.如何在复试中脱颖而出呢?导师通常 ...

  4. 苏宁“砍价团”高可用、高并发架构实践

    " 苏宁拼购 808 的火爆见证了砍价团的成功,作为一种新兴的购物营销玩法,砍价团展现出了巨大的商业潜力.不同于传统购物流程的单一模式,砍价团凝练了购物玩法和社群营销的精髓. 来自:51ct ...

  5. 1个平方大概多少立杆_1斤草坪种子播撒多少平方/四季青

    逐月分析冷季型草坪草和暖季型草坪草在长春地区的生长状况,并进行总体评价,为长春地区初选出适合种植的草坪草类型.关键词:冷季型草坪草暖季型草坪草1.长春地区气候总体概括长春地处松辽平原中部,东经124° ...

  6. 论文写作相关事项汇总

    1.如何把别人论文中的曲线图,自动转化为数据点? 点击打开链接 2.写论文和报告容易犯的低级错误,别再像外行一样写论文了 点击打开链接 3.论文写作应该注意的八个细节,录取与否只在审稿人一念之差 点击 ...

  7. 从实现的技术手段细数:高分辨率遥感影像+人工智能的现在和未来

    [转自]http://baijiahao.baidu.com/s?id=1601901487917871613&wfr=spider&for=pc 人工智能不可阻挡地向各行业渗透.这一 ...

  8. 学计算机的是不是都非常木讷,计算机考研复试侧重什么?

    随着计算机相关技术的突飞猛进,对人才的职业发展也提出了更高的要求.近年来,计算机及相关专业一直是研究生报考的热门专业,复试中的竞争日益激烈.如何在复试中脱颖而出呢?导师通常看重学生的那些能力?下面万学 ...

  9. 悬挑脚手架卸载钢丝绳要求_安全不可忽视!脚手架搭设彩色图集,动画展示施工全过程,抠细节...

    安全不可忽视!脚手架搭设彩色图集,动画展示施工全过程,抠细节 无论从事何种工作,安全第一!尤其是工程兄弟们,整天呆在施工现场,面临的危险和意外更多,因此更要注意安全.其中,脚手架就是我们必须注意的一项 ...

最新文章

  1. Android提高21篇之二:SurfaceView的基本使用方法
  2. java - 把日志生成到指定目录
  3. python创建文件并写入-python新建txt文件,并逐行写入数据
  4. keil编译时提示 Undefined symbol __ROR
  5. 一、Go语言环境搭建
  6. Jpeglib使用指南, 各种压缩包的压缩和解压方法, 开源社区分裂史
  7. java设置表格列不可修改_Java DefaultTableModel使单元格不可编辑JTable
  8. 在linux centos7上安装git
  9. css 旋转 animation动画
  10. 老李推荐:第14章8节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-获取控件列表并建立控件树 1...
  11. 腾讯回应“暴力裁员”;小米否认常程与联想签有竞业禁止条款;NumPy 1.16.6 发布 | 极客头条...
  12. 余凯:不做AI芯片,如何改变世界? | 变局者
  13. sun.misc.BASE64Encoder找不到的解决方法
  14. 斐波那契数列与黄金分割比以及矩阵形式推导
  15. C#实现WebService服务 项目完整总结
  16. Putty CentOS SSH 总是自动断开连接
  17. MyBatis generator 注解方式和xml方式
  18. 基于中颖SH88F516驱动TM1640的LED数码管驱动程序
  19. HTML的font标签的使用
  20. python做服务器有优缺点_python做服务器优劣

热门文章

  1. 分区数据导出功能(服务端实现)
  2. 数据库-左外连接-右外连接
  3. Date - Java处理日期和时间
  4. centos7上systemd详解
  5. word打开文档很久很慢_word文档打开特别慢怎么解决,word10打开文档很慢
  6. GCC 编译时优化某一个或几个函数或者不优化某一个或几个函数
  7. vagrant 配置并启动
  8. JAVA NIO知识点总结(2)——直接缓冲区和非直接缓冲区
  9. 安装Apache2.4.23
  10. PHP 文件上传类 FileUpload 高洛峰老师 细说PHP