Kafka为何那么快

1. 持久化磁盘顺序读写

Kafka 对消息的存储和缓存严重依赖于文件系统。人们对于“磁盘速度慢”的广泛印象,使得人们对于持久化的架构可以提供强有力的性能产生怀疑。事实上,磁盘的速度比人们预期的要慢的多,也快得多,这取决于人们使用磁盘的方式。并且设计合理的磁盘结构一般能够和网络同样快。linux

关于磁盘性能的关键事实是,磁盘的吞吐量和过去十年里磁盘的寻址延迟不一样。所以,使用6个7200rpm、SATA接口、RAID-5的磁盘阵列在JBOD配置下的顺序写入的性能约为600MB/秒,但随机写入的性能仅约为100k/秒,相差6000倍以上。由于线性的读取和写入是磁盘使用模式中最有规律的,而且由操做系统进行了大量的优化。现代操做系统提供了 read-ahead 和 write-behind 技术,read-ahead 是以大的 data block 为单位预先读取数据,而 write-behind 是将多个小型的逻辑写合并成一次大型的物理磁盘写入。关于该问题的进一步讨论能够参考 ACM Queue article,他们发现实际上 顺序磁盘访问在某些状况下比随机内存访问还要快apache

2. 零拷贝

低效率的操做是字节拷贝,在消息量少时,这不是什么问题。可是在高负载的状况下,影响就不容忽视。为了不这种状况,咱们使用 producer ,broker 和 consumer 都共享的标准化的二进制消息格式,这样数据块不用修改就能在他们之间传递。缓存

broker 维护的消息日志自己就是一个文件目录,每一个文件都由一系列以相同格式写入到磁盘的消息集合组成,这种写入格式被 producer 和 consumer 共用。保持这种通用格式能够对一些很重要的操做进行优化: 持久化日志块的网络传输。 现代的unix 操做系统提供了一个高度优化的编码方式,用于将数据从 pagecache 转移到 socket 网络链接中;在 Linux 中系统调用 sendfile 作到这一点。安全

为了理解 sendfile 的意义,了解数据从文件到套接字的常见数据传输路径就很是重要:服务器

  1. 操做系统从磁盘读取数据到内核空间的 pagecache
  2. 应用程序读取内核空间的数据到用户空间的缓冲区
  3. 应用程序将数据(用户空间的缓冲区)写回内核空间到套接字缓冲区(内核空间)
  4. 操做系统将数据从套接字缓冲区(内核空间)复制到经过网络发送的 NIC 缓冲区 这显然是低效的,有四次 copy 操做和两次系统调用。使用 sendfile 方法,能够容许操做系统将数据从 pagecache 直接发送到网络,这样避免从新复制数据。因此这种优化方式,只须要最后一步的copy操做,将数据复制到 NIC 缓冲区。

咱们指望一个广泛的应用场景,一个 topic 被多消费者消费。使用上面提交的 zero-copy(零拷贝)优化,数据在使用时只会被复制到 pagecache 中一次(经过DMA复制),节省了每次拷贝到用户空间内存中,再从用户空间进行读取的消耗。这使得消息可以以接近网络链接速度的 上限进行消费。网络

pagecache 和 sendfile 的组合使用意味着,在一个kafka集群中,大多数 consumer 消费时,您将看不到磁盘上的读取活动,由于数据将彻底由缓存提供。架构

JAVA 中更多有关 sendfile 方法和 zero-copy (零拷贝)相关的资料,能够参考这里的文章app

pagecache

page cache,又称pcache,其中文名称为页高速缓冲存储器,简称页高缓。page cache的大小为一页,一般为4K。在linux读写文件时,它用于缓存文件的逻辑内容,从而加快对磁盘上映像和数据的访问,以此来减小对磁盘I/O的操做。socket

DMA

DMA(Direct Memory Access)原理: 读一个磁盘扇区,CPU可能发出三个存储指令发起磁盘读,第一个指令发送一个命令字,告诉磁盘发起一个读同时还发送了其余参数。第二个参数指明了应该读的逻辑块号,第三个指令指明了应该存储磁盘扇区内容的主存地址。 在磁盘控制器收到来自CPU的读命令后,它将逻辑块号翻译成一个扇区地址,读取扇区的内容,而后将这些内容直接传到主存,不须要CPU的干涉。DMA传送完成,磁盘扇区的内存被安全的存储在主存中之后,磁盘控制器经过给CPU发送一个中断信号来通知CPU。性能

参考书籍:《深刻理解计算机系统》

3. 端到端的批量压缩

Kafka 以高效的批处理格式支持一批消息能够压缩在一块儿发送到服务器。这批消息将以压缩格式写入,而且在日志中保持压缩,只会在 consumer 消费时解压缩。 Kafka 支持 GZIP,Snappy 和 LZ4 压缩协议

参考地址:kafka.apache.org/documentati…