-
批量处理
生产者采用批量压缩后批量发送的方式,这一批消息会被当做一个"批消息"直接由broker处理包括分发、复制、刷盘,然后发送到消费者,由消费者去分解为一条条的数据再去处理。其中broker不需要对这一批消息进行拆解处理。这样不仅减轻了broker的压力,最关重要是减少了生产和消费的交互次数。
-
利用PageCache加速消息读写
我们的系统读取硬盘上的数据时,并不是直接与硬盘交互,而是操作系统会将数据缓存在内存中的PageCache里,基于内存和硬盘的性能差,能最大化读写性能,当应用程序读取PageCache中数据未命中时,会触发“缺页中断”,此时应用程序的读取线程会被阻塞,操作系统把数据从文件复制到PageCache中,然后应用程序再从PageCache中继续读取数据,这时由于触发了硬盘IO,所以性能较差。
但是,操作系统对于PageCache使用后并不会直接删除,只有在内存不够用时,才会基于LRU或其他变种算法清除。
Kafka的业务属性就是不断消费刚刚写入消息,而这些新的消息不会被LRU算法优先清除,所以读取时,命中PageCache几率会非常高。
-
顺序读写提升磁盘IO性能
kafka充分利用磁盘顺序读写性能较好的特性来设计存储结构,它把从Producer收到的消息,顺序写入对应的log文件中,一个文件写满了,就开启一个新的文件顺序写下去。消费的时候,也是从某个log的某个位置开始,顺序读出来。
-
零拷贝( zero-copy )
发送数据,通常需要通过如下几步:
- 磁盘复制到PageCache
- 从PageCache复制到用户缓冲区中(内核态到用户态)
- 从用户缓冲区中复制到socket缓冲区中
而零拷贝就是将第2、3步合为一步,将数据直接从PageCache复制到socket缓冲区中,如图:
这样一来,即避免了数据在内核态和用户态直接的上下文切换,又减少了CPU对数据拷贝的参与次数。
而对于支持 SG-DMA 技术的网卡,可以完全由硬件DMA直接操作数据,全程不需要通过 CPU 来搬运数据:
所以,总体来看,零拷贝技术可以把文件传输的性能提高至少一倍以上。