Kafka高性能的原因

Posted by KANG's BLOG on Saturday, March 19, 2022
  • 批量处理

    生产者采用批量压缩后批量发送的方式,这一批消息会被当做一个"批消息"直接由broker处理包括分发、复制、刷盘,然后发送到消费者,由消费者去分解为一条条的数据再去处理。其中broker不需要对这一批消息进行拆解处理。这样不仅减轻了broker的压力,最关重要是减少了生产和消费的交互次数。

  • 利用PageCache加速消息读写

    我们的系统读取硬盘上的数据时,并不是直接与硬盘交互,而是操作系统会将数据缓存在内存中的PageCache里,基于内存和硬盘的性能差,能最大化读写性能,当应用程序读取PageCache中数据未命中时,会触发“缺页中断”,此时应用程序的读取线程会被阻塞,操作系统把数据从文件复制到PageCache中,然后应用程序再从PageCache中继续读取数据,这时由于触发了硬盘IO,所以性能较差。

    但是,操作系统对于PageCache使用后并不会直接删除,只有在内存不够用时,才会基于LRU或其他变种算法清除。

    Kafka的业务属性就是不断消费刚刚写入消息,而这些新的消息不会被LRU算法优先清除,所以读取时,命中PageCache几率会非常高。

  • 顺序读写提升磁盘IO性能

    kafka充分利用磁盘顺序读写性能较好的特性来设计存储结构,它把从Producer收到的消息,顺序写入对应的log文件中,一个文件写满了,就开启一个新的文件顺序写下去。消费的时候,也是从某个log的某个位置开始,顺序读出来。

  • 零拷贝( zero-copy )

    发送数据,通常需要通过如下几步:

    1. 磁盘复制到PageCache
    2. 从PageCache复制到用户缓冲区中(内核态到用户态)
    3. 从用户缓冲区中复制到socket缓冲区中

    img

    而零拷贝就是将第2、3步合为一步,将数据直接从PageCache复制到socket缓冲区中,如图:

    img

这样一来,即避免了数据在内核态和用户态直接的上下文切换,又减少了CPU对数据拷贝的参与次数。

而对于支持 SG-DMA 技术的网卡,可以完全由硬件DMA直接操作数据,全程不需要通过 CPU 来搬运数据

img

所以,总体来看,零拷贝技术可以把文件传输的性能提高至少一倍以上