首页 > 其他分享 >SRE 必备知识 - Kafka 探秘之零拷贝技术

SRE 必备知识 - Kafka 探秘之零拷贝技术

时间:2024-08-27 11:40:44浏览次数:7  
标签:SRE buffer 数据 Kafka read 内核 拷贝 探秘

如果你了解过 Kafka,那么它用到的一个性能优化技术可能会引起你的注意 -- 操作系统的零拷贝(zero-copy)优化。

零拷贝操作可以避免对数据的非必要拷贝,当然,并非是说完全没有拷贝。

在 Kafka 的场景下,操作系统可以从 page cache 拷贝数据到 socket buffer,直接绕过 Kafka broker 这个 Java 程序。这可以节省一些额外的拷贝,节省一些用户态和内核态的切换。让我们看一个例子。

传统拷贝

如果您的应用程序要从磁盘读取文件并通过网络发送它,则可能会进行一堆不必要的拷贝,以及用户态/内核态的切换。

Kafka 传统拷贝

一些术语:

  • read buffer: 读缓冲区,操作系统的 page cache
  • socket buffer: 套接字缓冲区,OS 用于管理数据包的字节缓冲区
  • NIC buffer: 网卡中的字节缓冲区
  • DMA copy: DMA 是 Direct Memory Access 的缩写,是内存控制器的一个功能,可以避免 CPU 的干预,允许硬件(图形卡、声卡、网卡等)直接访问内存 (RAM) 里的某些数据

在这个例子中,我们有 4 次模式切换(用户态和内核态之间的切换)和 4 次数据拷贝。

  • 应用程序(这里指 Kafka)利用 DMA copy 从磁盘 load 数据到 read buffer(用户态->内核态
  • read buffer 到应用程序的缓存区(内核态->用户态
  • 应用程序要发数据到网络上,实际是先写到 socket buffer(用户态->内核态
  • socket buffer 到 NIC buffer(响应数据写完之后,由内核态返回用户态)

零拷贝

Kafka 零拷贝

为了减少拷贝,把数据从磁盘直接发向网络,那 Kafka 在存储数据的时候,就要保证存储的数据格式和将要发出的 response 格式一致。

在传统拷贝模式下,第二步、第三步没啥意义,因为 Kafka 没有对数据做额外处理,只是简单转发。那能否从磁盘直接发向网络呢?答案是肯定的。通过零拷贝技术,磁盘上的数据还是要先进入 read buffer,然后不用再拷贝到应用程序的缓存区,而是直接拷贝到 NIC buffer,图上的步骤 2:Appends just file descriptors,只是把文件描述符交给了 Socket buffer,实际数据并没有拷贝给 Socket buffer。这就是所谓的 scatter-gather 操作(也称为 Vectorized I/O),scatter-gather 是仅将 read buffer 数据指针存储在 socket buffer 中,并让 DMA 直接从内存读取数据的行为。

最终结果如何呢?

  • 4 次模式切换变成了 2 次
  • 2 次 DMA 拷贝,仍然是 2 次
  • 1 次微小的指针拷贝

Kafka 传统拷贝和零拷贝对比

在 Kafka 中

你可能听过 Kafka 因为零拷贝实现了高性能,但是理想很丰满现实很骨感,零拷贝技术在大部分 Kafka 集群中并没有那么大的影响力。

  • CPU 很少成为瓶颈。网络饱和的速度要快得多,因此在大多数情况下,内存中副本的缺失并不会带来多大的影响。
  • 启用加密和 SSL/TLS 已经禁止 Kafka 使用零拷贝

原文:​​​https://2minutestreaming.beehiiv.com/p/apache-kafka-zero-copy-operating-system-optimization​​​
译者:巴辉特,极客时间专栏《运维监控系统实战笔记》作者,Open-Falcon、Nightingale 开源项目发起人,目前创业中,作为 Flashcat 联合创始人,专攻监控/可观测性方向。欢迎和我一起探讨监控/可观测性相关技术和产品。

标签:SRE,buffer,数据,Kafka,read,内核,拷贝,探秘
From: https://www.cnblogs.com/ulricqin/p/18382359

相关文章

  • Kafka的基本概念
    目录1.Kafka的介绍1.1介绍1.2Kafka的概念1.3.Kafka实现的日志聚合1.4简单的收发消息1.5其他消费模式1.5.1指定消费进度1.5.2分组消费1.5.3查看消费者组的偏移量1.6基于Zookeeper的Kafka集群1.6.1使用集群的原因1.6.2Kafka集群架构1.6.3Topic下的Partition分布情况......
  • Kafka的生产者和消费者机制
    目录1.基础的客户端1.1消息发送者的主流程1.2消息消费者主流程2.客户端工作机制2.1消费者分组消费机制2.2生产者拦截器机制2.3消息序列化机制2.4消息分区路由机制2.5生产者消息缓存机制2.6发送应答机制2.7生产者消息幂等性(1)生产者消息幂等性介绍(2)解决方案2.8......
  • 图解Kafka | 16张图讲透生产者交付语义
    交付(传递)语义交付语义是在分布式消息系统(如Kafka)中,用来描述消息从生产者到达消息系统并最终被消费者消费时的可靠性保证。它主要涉及到消息是否能正确地被投递,及在什么情况下可能会出现消息丢失或重复的问题。根据Kafkabroker和生产者的配置,支持“最多一次”、“至少一......
  • 图解Kafka | 28张图彻底搞懂消费者
    消费者消费者角色Kafka消费者与生产者一样,是优化Kafka数据处理的重要角色。消费者的主要任务是与Kafka集群建立连接,并基于配置的消费者属性从相应的Kafkabroker读取记录。多应用消费多个应用程序可以从同一个Kafka主题中消费记录,每个应用程序都会获取该数据的......
  • 利用kafka和kafka connect插件debezium实现oracle表同步
    1.kafka安装1.1.java安装openjdk下载,建议使用17,至少应该高于版本11#进入家目录,解压下载的java包,配置环境变量tarvxfopenjdk-20.0.1_linux-x64_bin.tar.gz-C/usr/local/vi.bash_profile#注意要把JAVA的目录放到$PATH之前exportJAVA_HOME=/usr/local/jdk-20exportP......
  • 异源数据同步 → DataX 为什么要支持 kafka?
    开心一刻昨天发了一条朋友圈:酒吧有什么好去的,上个月在酒吧当服务员兼职,一位大姐看上了我,说一个月给我10万,要我陪她去上海,我没同意朋友评论道:你没同意,为什么在上海?我回复到:上个月没同意前情回顾关于DataX,官网有很详细的介绍,鄙人不才,也写过几篇文章异构数据源同步之数据......
  • linux下试验中间件canal的example示例-binlog日志的实时获取显示以及阿里巴巴中间件ca
    一、linux下试验中间件canal的example示例-binlog日志的实时获取显示    今天重装mysql后,进行了canal的再次试验,原来用的mysql5.7,今天重装直接换了5.6算了。反正测试服务器的mysql也不常用。canal启动后日志显示examplepreparetofindstartpositionjustshowmaste......
  • rocketmq 是参考了 kafka架构, 为什么rocketmq吞吐量是10万/秒, kafka吞吐量是17万/秒
    我们都知道,为了防止消息在服务器丢失,一般都是进行持久化(保存在磁盘),在发送消失时那就涉及到从磁盘拷贝到内核空间,从内核空间到用户态,再从用户态到socket缓存区,从socket缓存区到网卡四次拷贝。kafka使用的是零拷贝-sendfile,把内核态数据发送到网卡,减少两次拷......
  • 《探秘神经网络:人工智能的强大引擎》
    在当今科技飞速发展的时代,人工智能已经成为了热门话题,而神经网络作为人工智能的重要组成部分,正发挥着越来越关键的作用。那么,什么是神经网络呢?它在人工智能中又有哪些令人瞩目的应用呢?一、什么是神经网络神经网络,也被称为人工神经网络,是一种模仿生物神经网络结构和功能的......
  • kafka
    消息队列的流派MQ是什么MessageQueue(MQ)是一种消息队列中间件。MQ的主要作用是通过分离消息的发送和接收来实现应用程序的异步和解耦。然而,MQ的核心目的是通信:它屏蔽了底层复杂的通信协议,并定义了一套更简单的应用层通信协议。在分布式系统中,模块间通信通常使用HTTP......