Kafka的零拷贝

打印 上一主题 下一主题

主题 1698|帖子 1698|积分 5094

Kafka的零拷贝(Zero-Copy)技术是其实现高吞吐量的关键优化之一,重要通过淘汰数据在内核空间和用户空间之间的冗余复制及上下文切换来提拔性能。以下是其焦点要点:
1. 传统数据拷贝的问题



  • 多次复制:传统文件传输需经历多次数据拷贝(磁盘→内核缓冲区→用户空间→Socket缓冲区→网络),消耗CPU和内存带宽。
  • 上下文切换:用户态与内核态的频繁切换增长延迟。
生存消息的流程

消耗消息时,会先从页缓存中获取消息,如果没有就会经历四次拷贝来发送消息到消耗者。(下图中赤色箭头表示:磁盘→内核缓冲区→用户空间→Socket缓冲区→网络)

2. Kafka的零拷贝实现(零CPU拷贝)




  • 使用sendfile系统调用

    • Kafka消耗者从Broker拉取数据时,Broker通过sendfile直接将磁盘文件的数据从内核缓冲区传输到网卡缓冲区,绕过用户空间(如上图)。
    • 依靠Linux等操作系统的支持,Java中通过FileChannel.transferTo()实现。

  • mmap(内存映射)

    • mmap()操作系统内核提供的一个方法,将内核空间的缓冲区映射到用户空间。
    • 生产者写入时,Kafka可能使用mmap将磁盘文件映射到内存,实现内核与用户空间共享数据,淘汰复制(通过映射淘汰的是内核到用户空间的拷贝)。
    • 但mmap存在同步开销(如页错误),通常更适用于特定场景。


3. 零拷贝的优势



  • 降低CPU使用:避免冗余数据复制,淘汰计算资源消耗。
  • 提拔吞吐量:淘汰I/O操作步骤,加快数据传输速度。
  • 淘汰延迟:淘汰上下文切换次数,提拔响应服从。
4. 应用场景



  • 消耗者读取数据:零拷贝重要应用于Broker向消耗者发送消息的过程,实现高效网络传输。
  • 生产者写入优化:结合次序写入和批量处置惩罚,淘汰磁盘寻址开销,但零拷贝重要作用于读取端。
5. 与其他优化协同



  • 次序I/O:Kafka持久化消息时接纳追加写入(Append-Only),充实利用磁盘次序读写性能。
  • 批量处置惩罚:合并小消息为批量数据,淘汰网络和I/O调用次数。
6. 留意事项



  • 操作系统依靠:sendfile需Linux等支持,Kafka在非Linux环境可能性能受限。
  • 数据处置惩罚限制:零拷贝适用于直接转发数据的场景,若需修改数据(如加密),则无法完全避免复制。
总结

Kafka通过零拷贝技术,结合操作系统的sendfile和mmap机制,最大化淘汰了数据传输过程中的冗余步骤。这种计划使其在消耗者拉取消息时能够高效利用系统资源,明显提拔吞吐量并降低延迟,成为高并发场景下消息系统的理想选择。

kafka使用sendfile:返回的是乐成发送了几个字节数,具体发了什么应用层不知道。
rocketMQ使用mmap:因为mmap返回的是数据的内容,应用层能获取到消息内容举行一些逻辑处置惩罚。rocketmq的一些消息必要获取到消息内容,比较将失败的消息重新投递到死信队列中。
kafka为了性能砍了功能,rocketmq为了功能砍了性能。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万万哇

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表