`
san_yun
  • 浏览: 2600435 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

java NIO入门

    博客分类:
  • NIO
 
阅读更多

NIO和OIO的区别

 

常用模型的缺点

如果不摆出来其他模型的缺点,怎么能对比出 Epoll 的优点呢。

 

 

 

2.1 PPC/TPC 模型

 

Process Per Connection和Thread Per Connection 这两种模型思想类似,就是让每一个到来的连接一边自己做事去,别再来烦我 。只是 PPC 是为它开了一个进程,而 TPC 开了一个线程。可是别烦我是有代价的,它要时间和空间啊,连接多了之后,那么多的进程 / 线程切换,这开销就上来了;因此这类模型能接受的最大连接数都不会高,一般在几百个左右。

 

 

 

2.2 select 模型

 

a. 最大并发数限制,因为一个进程所打开的 FD (文件描述符)是有限制的,由 FD_SETSIZE 设置,默认值是 1024/2048 ,因此 Select 模型的最大并发数就被相应限制了。自己改改这个 FD_SETSIZE ?想法虽好,可是先看看下面吧

 

b. 效率问题, select 每次调用都会线性扫描全部的 FD 集合,这样效率就会呈现线性下降,把 FD_SETSIZE 改大的后果就是,大家都慢慢来,什么?都超时了??!!

 

c. 内核 / 用户空间 内存拷贝问题,如何让内核把 FD 消息通知给用户空间呢?在这个问题上 select 采取了内存拷贝方法。

 

 

 2.3 poll 模型

 

基本上效率和 select 是相同的, select 缺点的 2 3 它都没有改掉。

 

Apache使用的是传统的select模型。 目前Linux下能够承受高并发访问的 Squid、Memcached都采用的是epoll网络I/O模型。处理大量的连接的读写,Apache所采用的select网络I/O模型非常低效。
为什么Nginx的性能要比Apache高得多?这得益于Nginx使用了最新的epoll(Linux 2.6内核)和kqueue(freebsd)网络I/O模型,下面用一个比喻来解析Apache采用的select模型和Nginx采用的epoll模 型进行之间的区别。

 

假设你在大学中读书,要等待一个朋友来访,而这个朋友只知道你在A号楼,但是不知道你具体住在哪里,于是你们约好了在A号楼门口见面.

如果你使用的阻塞IO模型来处理这个问题,那么你就只能一直守候在A号楼门口等待朋友的到来,在这段时间里你不能做别的事情,不难知道,这种方式的效率是低下的.

现在时代变化了,开始使用多路复用IO模型来处理这个问题.你告诉你的朋友来了A号楼找楼管大妈,让她告诉你该怎么走.这里的楼管大妈扮演的就是多路复用IO的角色.

 

select版宿管大妈就会带着你的朋友挨个房间去找,直到找到你为止。

 

而 epoll版宿管大妈会先记下每位同学的房间号,你的朋友来时,只需告诉你的朋友你住在哪个房间即可,不用亲自带着你的朋友满大楼找人。如果来了 10000个人,都要找自己住这栋楼的同学时,select版和epoll版宿管大妈,谁的效率更高,不言自明。

 

同理,在高并发服务器中,轮询I/O是最耗时间的操作之一,select和epoll的性能谁的性能更高,同样十分明了。

 

netty中如何使用select

NioWorker 
1.run()
2.processSelectedKeys()
3.read()

 

 

java 中使用epoll

JDK 6.0 以及JDK 5.0 update 9 的 nio支持epoll (仅限 Linux 系统 ),对并发idle connection会有大幅度的性能提升,这就是很多网络服务器应用程序需要的。

 

启用的方法如下:

 

-Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider  

 

例如在 Linux 下运行的 Tomcat 使用 NIO Connector ,那么启用 epoll 对性能的提升会有帮助。

 

而 Tomcat 要启用这个选项的做法是在 catalina.sh 的开头加入下面这一行

 

CATALINA_OPTS='-Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider'

 

 

 参考:

http://www.ibm.com/developerworks/cn/java/l-niosvr/

 

  • 大小: 32 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics