NIO编程框架.ppt

  1. 1、本文档共21页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
NIO编程框架

提纲 前言:一些背景知识 1:NIO的极限理论速度 2:NIO适用那些应用场景 3:NIO的工作原理和工作模式 4:那些情况适用NIO 5:NIO编程容易犯的错误 6:三种读模式,读是tcp编程的头痛之处 7:几个重要的linux命令 8:需要了解一些tcp的知识 9:需要了解的http知识 10:怎么再提高效率--长连接+控制包大小 11:软件版穿外网跨IDC调用 ;前言:一些背景知识 NIO:现在JDK6使用的模式,实际上就是native方式调用linux的epoll NIO2:JDK7引入NIO2 BIO:block io,就是常见的阻塞模式 OIO:old io,就是BIO,名字是大家取的,你懂的 Reactor:好复杂,我也不懂,专业名称叫做端口多路复用 为什么选用这个方案 1:无域名 2:msf限制 3:client体验 4:。。。。 ;NIO适用那些应用场景 1:需要长连接的网游 2:IM 3:LB 4:代理服务器(SERVICE);NIO的极限理论速度计算公式---单机百万不是梦 机器能开线程数*1000/(网络延迟ms*1 至 ms*2之间 ) 假设网络ping延迟为1ms 比如机器开到100个线程,cpu消耗显著上升到60%,那就是最大能开100线程,那么此时nio svr最大吞吐为 100*1000/2=5w/s 如果能开200线程 200*1000/2=10w/s 同理如果网络延迟是0.5ms 那么都double一下 为什么NIO(epoll)是这个理论公式呢?这个要重NIO的工作原理说起。 PS:外网代理服务器理论速度 100*1000/80=1250 左右,为什么是80?有的分包有的不分包的结果,取一个大致值,是在延迟的70-140之间一个值,大部分不用分包,所以取80比较合理 /arch/c10k_c500k.html /question/12_8750;NIO的工作原理和工作模式 1:异步:很多抽象的知识,描述异步神马的,好高深,不懂,汗 2:观察者:有人把NIO是一个标准的观察者模式,也没错,也蛮高深 3:请求切分阉割法:很土很贴切 这里重要介绍很土的阉割法 所谓阉割法,就是把一个请求过程分为几段,一个网络调用分这么几个过程 tcp connect-send request-process-send backclose 其中connect(accept)、read request、send back、close都是网络io的动作,process是业务逻辑处理服务器的动作。 阉割法的处理方式是 1:accept请求-read reqeust---开端口句柄HOLD住(观察者就在这里不停检查) 2:??求丢给业务逻辑服务器,自己闲着 3:send back 业务处理完了,唤醒观察者,send back并close 工作模式如下图 ;server socket ;那些情况适用NIO 分四种情况 ;NIO编程容易犯的错误 1:端口句柄泄漏,时时要close,最悲剧的是eclipse不能检测运行时错误,比如nullpoint啊什么的,泄漏而导致端口句柄会占满,lsof 2:处理读一定要把握好,否则cpu全耗死在这里,三种读方法 3:要非常非常非常认证的理解 select、rigister、wakeup机制,已经isconnect、isaccpte、isread、iswrite的规律 4:三种读的方式,一定要选择最优的读写分离法。 5:读写分离的时候怎么避免多线程高并发导致的问题 5:selecor里面处理,原则是该干嘛就干嘛,没事就移出seletor中去(滚蛋),才能最大限度接近理论速度,否则cpu不堪重负,也大大加大延迟。 6:socketchanle的参数一定要理解 socketchannle.socket().setTcpNoDelay(true); socketchannle.socket().setSendBufferSize(8096 * 2); socketchannle.socket().setReceiveBufferSize(8096 * 2); 7:不要重复发送和读取,使用最优的读写分离不存在这个问题,用一个状态标志一下 NIO多线程噩梦 /adapterofcoms/archive/2010/05/29/314242.html NIO流传甚广的“错误”例子 /429766/482396 ;三种读方法 1:同步阻塞读方法 能run,连BIO都不如,极糟糕 2:异步复用非阻塞读 能run,效率较高,在大并发下CPU消耗很大,并且随着并发的上升,性能急剧下降 3:读写分离结合线程池 能run,最高效,最大吞吐就是线程池数*1000/网络延迟 ps1:三种读造成性能差别的原因就是wak

文档评论(0)

asd522513656 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档