前言
上一节主要讲述了BIO和NIO的区别。BIO每一步都是阻塞式的;NIO仅在select的时候阻塞,并且在获取到IO权限后,可以同时操作多个IO。
在NIO的具体实现上,又有不同。在linux上主要分为select ,poll,epoll。
简单的背景介绍
网络IO本质上是对FD(文件描述符)的操作,用户代码需要先从操作系统获取到FD,进而执行IO操作。上述将的几种实现,主要体现在FD遍历上的不同。
select poll 模式
poll是对select的一次改进,但是遍历FD方式是一致的。
在用户调用selector.selectedKeys()的时候,操作系统扫描所有socket,从系统内核复制到用户的内存。随着连接数的增长,遍历、复制的时间线性增长,并且消耗内存随之增大。
epoll 模式
epoll的模式仅关心活跃的部分,减少遍历和复制操作。
简单总结
epoll模式给高连接数,高并发的程序带来了性能的提高。
如何使用epoll
在Netty编程中,将select 切换成 epoll十分方便。
代码上需要修改两个地方: NioEventLoopGroup 替换成 EpollEventLoopGroup NioServerSocketChannel 替换成 EpollServerSocketChannel
这里需要引入的依赖:netty-transport-native-epoll 或者直接使用 netty-all。
参考: https://cloud.tencent.com/developer/article/1005481 http://colobu.com/2014/09/12/java-nio-epoll/