放荡的人生|面试题详解:Kafka为什么能那么快的6个原因( 四 )

  • 避免内核和用户空间之间的数据拷贝:当应用程序不需要对数据进行访问时 , 则可以避免将数据从内核空间拷贝到用户空间
  • mmap
  • sendfile
  • splice && tee
  • sockmap
  • copy on write:写时拷贝技术 , 数据不需要提前拷贝 , 而是当需要修改的时候再进行部分贝 。
  • 4.2 磁盘文件通过网络发送(Broker 到 Consumer)传统方式实现:先读取磁盘、再用 socket 发送 , 实际也是进过四次 copy
    • buffer = File.read
    • Socket.send(buffer)
    这一过程可以类比上边的生产消息:
    1. 首先通过系统调用将文件数据读入到内核态 Buffer(DMA 拷贝)
    2. 然后应用程序将内存态 Buffer 数据读入到用户态 Buffer(CPU 拷贝)
    3. 接着用户程序通过 Socket 发送数据时将用户态 Buffer 数据拷贝到内核态 Buffer(CPU 拷贝)
    4. 最后通过 DMA 拷贝将数据拷贝到 NIC Buffer
    Linux 2.4+ 内核通过 sendfile 系统调用 , 提供了零拷贝 。 数据通过 DMA 拷贝到内核态 Buffer 后 , 直接通过 DMA 拷贝到 NIC Buffer , 无需 CPU 拷贝 。 这也是零拷贝这一说法的来源 。 除了减少数据拷贝外 , 因为整个读文件 - 网络发送由一个 sendfile 调用完成 , 整个过程只有两次上下文切换 , 因此大大提高了性能 。
    放荡的人生|面试题详解:Kafka为什么能那么快的6个原因Kafka 在这里采用的方案是通过 NIO 的 transferTo/transferFrom 调用操作系统的 sendfile 实现零拷贝 。 总共发生 2 次内核数据拷贝、2 次上下文切换和一次系统调用 , 消除了 CPU 数据拷贝
    5. 批处理在很多情况下 , 系统的瓶颈不是 CPU 或磁盘 , 而是网络IO 。
    因此 , 除了操作系统提供的低级批处理之外 , Kafka 的客户端和 broker 还会在通过网络发送数据之前 , 在一个批处理中累积多条记录 (包括读和写) 。 记录的批处理分摊了网络往返的开销 , 使用了更大的数据包从而提高了带宽利用率 。
    6. 数据压缩Producer 可将数据压缩后发送给 broker , 从而减少网络传输代价 , 目前支持的压缩算法有:Snappy、Gzip、LZ4 。 数据压缩一般都是和批处理配套使用来作为优化手段的 。
    小总结 | 下次面试官问我 kafka 为什么快 , 我就这么说
    • partition 并行处理
    • 顺序写磁盘 , 充分利用磁盘特性
    • 利用了现代操作系统分页存储 Page Cache 来利用内存提高 I/O 效率
    • 采用了零拷贝技术
      • Producer 生产的数据持久化到 broker , 采用 mmap 文件映射 , 实现顺序的快速写入
      • Customer 从 broker 读取数据 , 采用 sendfile , 将磁盘文件读到 OS 内核缓冲区后 , 转到 NIO buffer进行网络发送 , 减少 CPU 消耗
    推荐阅读【放荡的人生|面试题详解:Kafka为什么能那么快的6个原因】如果想对kafka深入研究的朋友可以看看小编珍藏的这几份文档;(转发+关注后私信“666”免费获取)
    放荡的人生|面试题详解:Kafka为什么能那么快的6个原因