前言java
上一节主要讲述了BIO和NIO的区别。BIO每一步都是阻塞式的;NIO仅在select的时候阻塞,而且在获取到IO权限后,能够同时操做多个IO。linux
在NIO的具体实现上,又有不一样。在linux上主要分为select ,poll,epoll。编程
简单的背景介绍网络
网络IO本质上是对FD(文件描述符)的操做,用户代码须要先从操做系统获取到FD,进而执行IO操做。上述将的几种实现,主要体如今FD遍历上的不一样。并发
select poll 模式socket
poll是对select的一次改进,可是遍历FD方式是一致的。高并发
在用户调用selector.selectedKeys()的时候,操做系统扫描全部socket,从系统内核复制到用户的内存。随着链接数的增加,遍历、复制的时间线性增加,而且消耗内存随之增大。oop
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/