SRE 必备知识 - Kafka 探秘之零拷贝技术
如果你了解过 Kafka,那么它用到的一个性能优化技术可能会引起你的注意 -- 操作系统的零拷贝(zero-copy)优化。
零拷贝操作可以避免对数据的非必要拷贝,当然,并非是说完全没有拷贝。
在 Kafka 的场景下,操作系统可以从 page cache 拷贝数据到 socket buffer,直接绕过 Kafka broker 这个 Java 程序。这可以节省一些额外的拷贝,节省一些用户态和内核态的切换。让我们看一个例子。
传统拷贝
如果您的应用程序要从磁盘读取文件并通过网络发送它,则可能会进行一堆不必要的拷贝,以及用户态/内核态的切换。

一些术语:
- 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 在存储数据的时候,就要保证存储的数据格式和将要发出的 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 集群中并没有那么大的影响力。
- CPU 很少成为瓶颈。网络饱和的速度要快得多,因此在大多数情况下,内存中副本的缺失并不会带来多大的影响。
- 启用加密和 SSL/TLS 已经禁止 Kafka 使用零拷贝
原文:https://2minutestreaming.beehiiv.com/p/apache-kafka-zero-copy-operating-system-optimization
译者:巴辉特,极客时间专栏《运维监控系统实战笔记》作者,Open-Falcon、Nightingale 开源项目发起人,目前创业中,作为 Flashcat 联合创始人,专攻监控/可观测性方向。欢迎和我一起探讨监控/可观测性相关技术和产品。
SRE 必备知识 - Kafka 探秘之零拷贝技术的更多相关文章
- Linux 中的零拷贝技术,第 2 部分
技术实现 本系列由两篇文章组成,介绍了当前用于 Linux 操作系统上的几种零拷贝技术,简单描述了各种零拷贝技术的实现,以及它们的特点和适用场景.第一部分主要介绍了一些零拷贝技术的相关背景知识,简要概 ...
- Linux 中的零拷贝技术,第 1 部分
概述 本系列由两篇文章组成,介绍了当前用于 Linux 操作系统上的几种零拷贝技术,简单描述了各种零拷贝技术的实现,以及它们的特点和适用场景.本文是本系列文章的第一部分,主要是介绍一些零拷贝技术的相关 ...
- Java基础-零拷贝技术应用案例
Java基础-零拷贝技术应用案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 零拷贝技术在Hadoop生态圈中很多组件得到应用,典型的比如kafka组件,它就很成功的应用了零拷贝 ...
- [转帖]Linux 中的零拷贝技术,第 1 部分
Linux 中的零拷贝技术,第 1 部分 https://www.ibm.com/developerworks/cn/linux/l-cn-zerocopy1/index.html 引言 传统的 ...
- 操作系统IO之零拷贝技术
磁盘可以说是计算机系统最慢的硬件之一,读写速度相差内存 10 倍以上,所以针对优化磁盘的技术非常的多,比如零拷贝.直接 I/O.异步 I/O 等等,这些优化的目的就是为了提高系统的吞吐量,另外操作系统 ...
- [软件体系结构/架构]零拷贝技术(Zero-copy)[转发]
0 前言 近期遇到难题:1个大数据集的查询导出API,因从数据库查询后占用内存极大,每次调用将消耗近100MB的JVM内存资源.故现需考虑研究和应用零拷贝技术. 如下全文摘自: 看一遍就理解:零拷贝原 ...
- Linux 零拷贝技术
简介 零拷贝(zero-copy)技术可以减少数据拷贝和共享总线操作的次数,消除通信数据在存储器之间不必要的中间拷贝过程,有效地提高通信效率,是设计高速接口通道.实现高速服务器和路由器的关键技术之一. ...
- Linux中的零拷贝技术
转载:https://www.jianshu.com/p/fad3339e3448 引文## 在写一个服务端程序时(Web Server或者文件服务器),文件下载是一个基本功能.这时候服务端的任务是: ...
- Linux零拷贝技术,看完这篇文章就懂了
本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复 「1024」 即可领取,欢迎大家关注,二维码文末可以扫. 本文讲解 ...
- Linux零拷贝技术 直接 io
Linux零拷贝技术 .https://kknews.cc/code/2yeazxe.html https://zhuanlan.zhihu.com/p/76640160 https://clou ...
随机推荐
- mysql查看用户的过期时间
1. mysql查看用户的过期时间的方法 在MySQL中,用户的过期时间(也称为账户过期日期)是一个可选项,用于确定某个MySQL用户账户何时到期.但是,值得注意的是,并非所有的MySQL安装或版本都 ...
- OpenCV程序练习(二):图像处理基础
一.彩色图像像素处理 代码 import cv2 import numpy as np #----------蓝色通道---------- blue=np.zeros((300,300,3),dtyp ...
- 【ClickHouse】0:clickhouse学习3之时间日期函数
官方文档: https://clickhouse.tech/docs/zh/sql-reference/functions/date-time-functions/ 常用的clickhouse时间函数 ...
- 从Java开发者到.NET Core初级工程师学习路线:C#语言基础
1. C#语言基础 1.1 C#语法概览 欢迎来到C#的世界!对于刚从Java转过来的开发者来说,你会发现C#和Java有很多相似之处,但C#也有其独特的魅力和强大之处.让我们一起来探索C#的基本语法 ...
- SpringBoot异步任务EnableAsync
什么是一部任务和使用场景:适用于处理log.发送邮件.短信...等 下单接口->查库存 1000 余额校验 1500 风控用户 1000 启动类里面使用@EnableAsync注解开启功能,自动 ...
- BigDecimal的精度与刻度
BigDecimal是Java中用于高精度算术运算的类.当您需要精确地处理非常大或非常小的数字时,例如在金融计算中,它特别有用.由于众所周知得原因,Double这种类型在某些情况下会出现丢失精度的问题 ...
- [WUSTCTF2020]朴实无华(命令执行)
请求头问题 去查了一下资料了解了一下没有什莫用 robots.txt 中有东西 假flag 但是请求头里有重要消息 访问页面/fl4g.php <img src="/img.jpg&q ...
- oeasy教您玩转vim - 68 - # 标签页tab
tab选项卡 回忆上次 上次有三种批量替换,分别是 :windo :bufdo :argdo 执行的{cmd}可以用|按顺序增加 分别对应的 windows 窗口 buffers 缓存文件 arg ...
- vue小知识~eventBus
eventBus是指在向全区暴露这个vue对象,此时在任意一个地方都可以使用vue相关的实例 在main.js配置 Vue.prototype.$bus=new Vue() 此时整个应用都可以使用vu ...
- 常回家看看之largebin_attack
常回家看看之largebin_attack 先简单介绍一下什么是largebin largebin 是 glibc 的 malloc 实现中用于管理大块内存的一种数据结构.在 glibc 的内存分配中 ...