基于磁盘的Kafka为什么这么快

这篇文章将为大家详细讲解有关基于磁盘的Kafka为什么这么快,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

Kafka是大数据领域无处不在的消息中间件,目前广泛使用在企业内部的实时数据管道,并帮助企业构建自己的流计算应用程序。Kafka虽然是基于磁盘做的数据存储,但却具有高性能、高吞吐、低延时的特点,其吞吐量动辄几万、几十上百万,这其中的原由值得我们一探究竟。
 

零拷贝

这里主要讲的是Kafka利用linux操作系统的 "零拷贝(zero-copy)" 机制在消费端做的优化。首先来了解下数据从文件发送到socket网络连接中的常规传输路径:

  • 操作系统从磁盘读取数据到内核空间(kernel space)的Page Cache

  • 应用程序读取Page Cache的数据到用户空间(user space)的缓冲区

  • 应用程序将用户空间缓冲区的数据写回内核空间到socket缓冲区(socket buffer)

  • 操作系统将数据从socket缓冲区复制到网络发送的NIC缓冲区

这个过程包含4次copy操作和2次系统上下文切换,性能其实非常低效。linux操作系统 "零拷贝" 机制使用了sendfile方法,允许操作系统将数据从Page Cache 直接发送到网络,只需要最后一步的copy操作将数据复制到 NIC 缓冲区,这样避免重新复制数据。示意图如下:

基于磁盘的Kafka为什么这么快

通过这种 "零拷贝" 的机制,Page Cache 结合 sendfile 方法,Kafka消费端的性能也大幅提升。这也是为什么有时候消费端在不断消费数据时,我们并没有看到磁盘io比较高,此刻正是操作系统缓存在提供数据。

关于基于磁盘的Kafka为什么这么快就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。