- 1、本文档共21页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)