0%

Kafka为什么这么快

Kafka的高吞吐量和低延迟,速度快,原因大概是:顺序写盘、内存映射、页缓存、零拷贝、批量发送。

顺序写盘

Kafka采用顺序写盘的方式,文件追加来写入消息,避免随机磁盘访问,所以写文件是很快的。

页缓存、内存映射文件

Kafka大量使用操作系统页缓存,把磁盘中的数据缓存到内存中,把对磁盘的访问转换为对内存的访问。进程准备读取磁盘上的文件内容时,操作系统会先查看数据是否在页缓存中,如果命中直接返回,避免了对磁盘IO操作,没有命中的话,操作系统会向磁盘发起读请求并将读取的数据存入页缓存,再返回给进程。

写操作会把数据写入到操作系统的页缓存中,操作系统负责刷盘任务。

零拷贝

零拷贝技术,就是指将数据从磁盘文件复制到网卡设备中,不需要经由应用程序转发,减少内核和用户模式的上下文切换。

如果不使用零拷贝,读取数据的过程如下:

  • 操作系统从磁盘读取数据,写到内核空间读缓冲区中
  • 应用程序从内核空间将数据读取到用户空间缓冲区
  • 应用程序将数据写回到内和空间的Socket缓冲区
  • 操作系统将Socket缓冲区中的数据拷贝到网卡缓冲区中

如果使用零拷贝,数据会从内核空间的读缓冲区直接拷贝到Socket缓冲区,再拷贝到网卡缓冲区中。省去了写入到用户空间和从用户空间拷贝的时间。

批量发送

Kafka在发送消息的时候,会将消息缓存到消息累加器中,然后缓存的消息可以进行批量发送,从而减少网络传输带来的资源消耗。

参考

  • Apache kafka实战
  • 深入理解Kafka:核心设计与实践原理
坚持原创技术分享,您的支持将鼓励我继续创作!
Fork me on GitHub