Kafka的高性能原因

Kafka为什么性能高

🚀 Kafka 高性能的原因

Kafka 高性能的秘密主要体现在三个方面:

  • 生产者端:批量收发 + 压缩消息
  • Broker 写入:磁盘顺序读写 + 页缓存
  • Broker 发送给消费者:零拷贝

📤 生产者端:批量收发 + 压缩消息

Kafka 收发消息都是批量进行处理的。生产者不是来一条发一条,而是把多条消息攒成一个 batch,压缩后一次性发出去。比如 100 条小消息单独发要 100 次网络往返,攒成一批只要 1 次。压缩后数据量从 100KB 变成 20KB,网络传输更快。

💡 生产者缓存机制

  • 生产者发送消息时,不会直接把消息发送出去,而是把消息缓存起来,缓存消息量达到配置的批量大小后,才会发送出去。
  • Broker 收到消息后,并不会把批量消息解析成单条消息后落盘,而是作为批量消息进行落盘,同时也会把批量消息直接同步给其他副本。
  • 消费者拉取消息,也不会按照单条进行拉取,而是按照批量进行拉取,拉取到一批消息后,再解析成单条消息进行消费。

💾 Broker 写入:磁盘顺序读写 + 页缓存

🗂️ 顺序写机制

Kafka 采用不断追加写文件的方式来实现顺序写,从而提高磁盘的性能。顺序读写省去了寻址的时间,只要一次寻址,就可以连续读写。Kafka 的 Broker 在写消息数据时,首先为每个 Partition 创建一个文件,然后把数据顺序地追加到该文件对应的磁盘空间中,如果这个文件写满了,就再创建一个新文件继续追加写。这样大大减少了寻址时间,提高了读写性能。

⌨️ Page Cache 机制

而且操作系统会把频繁读写的磁盘数据缓存在 Page Cache 里,很多时候读的是内存而非磁盘。

在 Linux 系统中,Page Cache 是磁盘文件在内存中建立的缓存。当应用程序读写文件时,并不会直接读写磁盘上的文件,而是操作 Page Cache。应用程序写文件时,都先会把数据写入 Page Cache,然后操作系统定期地将 Page Cache 的数据写到磁盘上。而应用程序在读取文件数据时,首先会判断数据是否在 Page Cache 中,如果在则直接读取,如果不在,则读取磁盘,并且将数据缓存到 Page Cache。


⚙️ Broker 发送给消费者:零拷贝

🔍 传统数据传输方式

传统方式将消息发送给消费端时,即使命中了 Page Cache,也需要将 Page Cache 中的数据先复制到内核缓冲区,拷贝到应用程序的内存空间,然后从应用程序的内存空间复制到 Socket 缓存区,将数据发送出去,4 次拷贝。

🧪 零拷贝技术原理

Kafka 采用了零拷贝技术(sendfile)把数据直接从 Page Cache 复制到 Socket 缓冲区中,这样数据不用复制到用户态的内存空间,同时 DMA 控制器直接完成数据复制,不需要 CPU 参与。

零拷贝技术对比:传统方式4次拷贝 vs 零拷贝技术直接传输

零拷贝的技术原理参见 往期博客

그 경기 끝나고 좀 멍하기 있었는데 여러분 이제 살면서 여러가
使用 Hugo 构建
主题 StackJimmy 设计