java 和netty epoll实现

Java NIO根据操作系统不同, 针对Selector有不同的默认实现:

  • macosx:KQueueSelectorProvider
  • solaris:DevPollSelectorProvider
  • Linux:EPollSelectorProvider (Linux kernels >= 2.6)或 PollSelectorProvider
  • windows: WindowsSelectorProvider

为什么netty还要提供一个基于epoll的实现

自4.0.16起, NettyLinux通过JNI的方式提供了native socket transport.

  • NioEventLoopGroupEpollEventLoopGroup
  • NioEventLoopEpollEventLoop
  • NioServerSocketChannelEpollServerSocketChannel
  • NioSocketChannelEpollSocketChannel

原因:

  1. Nettyepoll transport使用 epoll边缘触发 而 java nio 使用 epoll水平触发(在这个模式下,io来了数据,就只通知这些io设备对应的fd,上次通知过的fd不再通知,内核不用扫描一大堆fd)
  2. netty epoll transport 暴露了更多的java nio没有的配置参数, 如 TCP_CORK, SO_REUSEADDR

参考

Netty native transports

Why native epoll support is introduced in Netty?

高性能网络服务器编程:为什么linux下epoll是最好,Netty要比NIO好?

热评文章