作者介绍:简历上没有一个精通的运维工程师,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
我们上一章介绍了中间件:Zookeeper,本章将介绍另外一个中间件:Kafka。目前这2个中间件都是基于JAVA语言的。
在面试的时关于Kafa问题的时候,我们经常会问一个问题就是Kafka为什么这么快,这里最主要有两个因素:顺序读写和零拷贝(Zero-Copy),今天我们来介绍零拷贝(Zero-Copy),零拷贝本身是Linux的特性,这个涉及到Linux内核特性,对于普通运维来说,理解它就可以,并不需要了解它的具体实现细节,除非你要开发个类似的功能或者软件。
Kafka的零拷贝(Zero-Copy)技术是其实现高吞吐量的关键优化之一,主要通过减少数据在内核态和用户态之间的冗余拷贝及上下文切换来提升性能。以下是对该机制的详细分析:
在传统的数据传输流程中(例如从磁盘读取文件并通过网络发送),数据需要经历多次拷贝和上下文切换:
read()
系统调用将数据从内核拷贝到用户空间的应用程序缓冲区。write()
将数据从用户空间拷贝到内核的Socket缓冲区。此过程涉及4次数据拷贝和4次上下文切换,导致CPU资源浪费和延迟增加。
Kafka利用Linux的sendfile()
系统调用(通过Java NIO的FileChannel.transferTo()
实现)来优化这一流程:
SG-DMA
技术,可进一步减少为1次),且完全在内核态完成,无需用户态参与。sendfile()
直接将页缓存中的数据拷贝到Socket缓冲区(无需经过用户空间)。sendfile()
将磁盘中的日志文件发送到网络,无需将数据加载到用户空间。sendfile()
及类似机制,Windows等系统实现可能不同。FileChannel.transferTo()
调用底层系统功能,确保跨平台兼容性。Kafka的零拷贝技术通过操作系统提供的sendfile()
系统调用,结合Java NIO的高效封装,实现了数据从磁盘到网络的高效传输。这一机制大幅减少了冗余数据拷贝和CPU开销,是Kafka高吞吐、低延迟特性的核心支柱之一。其适用性依赖于特定的场景(如无需修改数据),并在现代分布式系统中展现了显著的性能优势。