前言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/