Kafka的零拷贝技术Zero-Copy
传统的拷贝过程

流程步骤:
(1)操作系统将数据从磁盘文件中读取到内核空间的页面缓存;
(2)应用程序将数据从内核空间读入用户空间缓冲区;
(3)应用程序将读到数据写回内核空间并放入socket缓冲区;
(4)操作系统将数据从socket缓冲区复制到网卡接口,此时数据才能通过网络发送。
read/write 属于系统调用 syscall,每一次系统调用 ,发生两次上下文切换
此过程涉及到4次上下文切换以及4次数据的复制,但是这些过程中cpu数据完全没有进行变化,仅仅是磁盘数据复制到了网卡的缓冲区,在这种情况下,如果去掉流程2和3,减少用户空间和内核空间之间的切换,虽然减少了数据交换的次数,但是仍然存在数据多次复制的情况。
注:步骤1和4的数据传输是通过DMA引擎进行拷贝的
步骤2和3的数据传输是通过cpu进行拷贝的**
零拷贝技术
在DMA技术的基础上,可以实现绝对的零拷贝,DMA技术为(Direct Memory Access,直接存储器访问),不需要依赖cpu的大量中断负载,数据文件可以直接绕过CPU在各个层之间传输,外围设备可以直接通过DMA控制器访问内存。通过零拷贝技术,可以减去没有必要的数据复制操作,同时也减少了上下文切换的次数。
可以看出,零拷贝技术只需要将数据从硬盘中将磁盘文件数据复制到页面缓存一次,然后直接将数据才从页面缓存直接发送到网络中,避免了重复复制的操作
页面缓存:存储磁盘数据的内核缓存区域,是操作系统内核中的一部分,用于缓存从磁盘读取的数据,以提高文件系统的性能;由物理内存中的页面构成的,每个页面的大小通常为4KB或更大。当内核从磁盘读取数据时,它将数据存储在页面缓存中。如果其他进程需要访问相同的数据,内核可以直接从页面缓存中读取,而无需再次从磁盘读取数据,从而提高了读取性能。在零拷贝技术中,页面缓存是实现数据传输的一部分。当数据需要从磁盘传输到网络或其他设备时,内核可以直接将页面缓存中的数据发送到目标设备,而无需将数据复制到用户空间或其他中间缓冲区。这样可以减少数据复制的次数和数据传输的延迟,提高数据传输的效率。
Java采用的零拷贝技术TransferTo方法底层也是调用sendfile(),Kafka的零拷贝技术可以直接将直接从它被调用的通道上传输到另一个可写字节通道,数据无需流经用户空间的应用程序;在Linux系统中零拷贝是基于sendfile()系统调用实现的,sendfile()实现的是读到内核空间的数据转到socket buffer,最后复制到协议引擎。
点击查看代码
mmap和sendfile都是零拷贝的实现方案,只不过不同的场景使用不同的方案;
mmap其实本质就是物理上磁盘文件的地址和页面缓存的地址进行映射,完成映射后对物理内存的操作会同步到硬盘上,用户通过修改内存就可以修改磁盘文件。Kafka生产的数据持久化到Broker里采用的是**mmap**文件映射的方式,实现顺序的快速写入
sendfile就是将读到内核空间的数据转到Socket Buffer,最后复制到协议引擎,相较于mmap又节省了一次cpu拷贝;
消费者从 broker 读取数据,采用sendfile,将磁盘文件读到内核缓冲区后,直接转到socket buffer进行网络发送

Kafka的零拷贝技术Zero-Copy的更多相关文章
- Linux 中的零拷贝技术,第 1 部分
概述 本系列由两篇文章组成,介绍了当前用于 Linux 操作系统上的几种零拷贝技术,简单描述了各种零拷贝技术的实现,以及它们的特点和适用场景.本文是本系列文章的第一部分,主要是介绍一些零拷贝技术的相关 ...
- Linux中的零拷贝技术
转载:https://www.jianshu.com/p/fad3339e3448 引文## 在写一个服务端程序时(Web Server或者文件服务器),文件下载是一个基本功能.这时候服务端的任务是: ...
- Java基础-零拷贝技术应用案例
Java基础-零拷贝技术应用案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 零拷贝技术在Hadoop生态圈中很多组件得到应用,典型的比如kafka组件,它就很成功的应用了零拷贝 ...
- 【转】浅析Linux中的零拷贝技术
本文探讨Linux中主要的几种零拷贝技术以及零拷贝技术适用的场景.为了迅速建立起零拷贝的概念,我们拿一个常用的场景进行引入: 引文## 在写一个服务端程序时(Web Server或者文件服务器),文件 ...
- [转帖]Linux 中的零拷贝技术,第 2 部分
Linux 中的零拷贝技术,第 2 部分 https://www.ibm.com/developerworks/cn/linux/l-cn-zerocopy2/index.html Linux 中 ...
- [转帖]Linux 中的零拷贝技术,第 1 部分
Linux 中的零拷贝技术,第 1 部分 https://www.ibm.com/developerworks/cn/linux/l-cn-zerocopy1/index.html 引言 传统的 ...
- 操作系统IO之零拷贝技术
磁盘可以说是计算机系统最慢的硬件之一,读写速度相差内存 10 倍以上,所以针对优化磁盘的技术非常的多,比如零拷贝.直接 I/O.异步 I/O 等等,这些优化的目的就是为了提高系统的吞吐量,另外操作系统 ...
- 【Netty技术专题】「原理分析系列」Netty强大特性之ByteBuf零拷贝技术原理分析
零拷贝Zero-Copy 我们先来看下它的定义: "Zero-copy" describes computer operations in which the CPU does n ...
- 【面试普通人VS高手】Kafka的零拷贝原理?
最近一个学员去滴滴面试,在第二面的时候遇到了这个问题: "请你简单说一下Kafka的零拷贝原理" 然后那个学员努力在大脑里检索了很久,没有回答上来. 那么今天,我们基于这个问题来看 ...
- 浅析 Linux 中的零拷贝技术
本文探讨Linux中 主要的几种零拷贝技术 以及零拷贝技术 适用的场景 .为了迅速建立起零拷贝的概念,我们拿一个常用的场景进行引入: 引文 在写一个服务端程序时(Web Server或者文件服务器), ...
随机推荐
- Maven进阶
前言 在项目开发的过程中,我们通常要使用到外部依赖的组件,同时也会使用某些插件来帮助我们管理项目.例如,我们访问数据库的时候需要使用到jdbc组件,我们可以下载对应的jar包去加载到我们的应用中.在我 ...
- Mininet教程
mininet的安装 1.前言 1.本次安装环境为ubuntu20.04. 2.mininet 为 github上的最新版,我已经修改镜像地址并克隆到了gitee,只需要从我的gitee仓库克隆即可. ...
- 从Excel 电子表格中读取数据并插入到数据库的简单方式
using (FileStream fileStreamRead = new FileStream("new.xls" , FileMode.Open )) { //创建工作簿 I ...
- 在Linux环境下通过命令行执行JMeter脚本后查看响应结果的配置
在Linux环境中进行性能测试时,我们可能会遇到一定程度的报错.如果无法打开JMeter的GUI界面,但又需要查看响应结果,可以按照以下步骤进行配置: 1. 打开JMeter的安装目录,在`bin/` ...
- 初识常量变量、字符串、ASCII编码表、转义字符表
一.常量.变量 1.枚举常量(enum) 枚举常量不能更改,枚举常量所创造出的变量可以更改 正确 错误 2.常变量 3.#define定义的标示变量 二.数组 "abc"--'a' ...
- java中Object 类
一. Object类简介 Object类是Java.java.lang包下的核心类,Object类是所有类的父类,任何一个类如果没有明确的继承一个父类的话,那么它就是Object的子类: (使用无需导 ...
- html表格基本标签
1.<table>表签 <table>...</table>标签用于在html文档中后创建表格.它包含表名和表格本身内容的代码. 2.<tr>标签 &l ...
- linux设置信号量系统参数
前言 信号量是IPC(进程间通信)机制的一种,用于协调多个进程或线程对共享数据的读写操作,本质上是一个计数器.类似于锁,主要用于保护共享资源,控制同时访问资源的进程数. 信号量只允许调用者对它进行等待 ...
- [pytest]基础
简介 The pytest framework makes it easy to write small, readable tests, and can scale to support compl ...
- React-Chat移动端聊天实例|react18 hooks仿微信App聊天界面
基于react18+react-vant+zustand仿微信手机端聊天室ReactChat. react18-chat 一款使用最新react18.x hooks.zustand搭配react-va ...