在《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 将很有可能无法享受到零拷贝技术带来的高效数据传输。