Kafka与操作系统适配性研究

在《Apache Kafka实战》一书中,提到了操作系统与Kafka的适配性。涉及的的epoll与select问题,以及linux零拷贝技术较为重要,因此在此处将操作系统相关特性部分进行记录。

clients 底层网络库的设计

Kafka 新版本 clients 在设计底层网络库时采用了 Java 的 Selector 机制

  • 该机制在 Linux 上的 实现机制就是epoll
  • 在 Windows 平台上, Java NIO 的 Selector 底层是使用 select 模型而非IOCP 实现的,(只有 Java NI02 才是使用 IOCP 实现的 )。

而关于epoll和select,select 函数就属于I/O多路复用模型,而epoll采用的是I/O多路复用模型+信号驱动I/O通常情况下我们会认为epoll 比 select 模型高级。毕竟 epoll 取消了轮询机制,取而代之的是回调机制( callback )。这样当底层连接 Socket 数较多时,可以避免很多无意义的 CPU 时间浪费。

因此,在 Linux 上部署Kafka 要比在 Windows 上部署能够得到更高效的 I/O处理性能 。

数据网络传输效率

Kafka 这种应用必然需要大量地通过网络与磁盘进行数据传输 ,而大部分这样的操作都是通过Java 的FileChannel.transferTo 方法实现的。

  • 在 Linux 平台上该方法底层会调用 sendfile 系统调用,即采用了 Linux 提供的零拷贝(Zero Copy)技术,Linux 提供的诸如 rnmap 、 sendfile 以及 splice 等系统调用即实现了这样的技术 。
  • 对于 Windows 平台而言,虽然它也提供了 TransmitFile 函数来支持零拷贝技术,但是直到 Java 8u60 版本 Windows 平台才正式让 FileChannel 的 transferTo 方法调用该函数。

鉴于很多公司目前的生产环境中还没有正式上线 Java 8 ,因而在 Windows 平台上部署Kafka 将很有可能无法享受到零拷贝技术带来的高效数据传输。

你可能感兴趣的:(Kafka与操作系统适配性研究)