传统的拷贝过程

流程步骤:

(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的更多相关文章

  1. Linux 中的零拷贝技术,第 1 部分

    概述 本系列由两篇文章组成,介绍了当前用于 Linux 操作系统上的几种零拷贝技术,简单描述了各种零拷贝技术的实现,以及它们的特点和适用场景.本文是本系列文章的第一部分,主要是介绍一些零拷贝技术的相关 ...

  2. Linux中的零拷贝技术

    转载:https://www.jianshu.com/p/fad3339e3448 引文## 在写一个服务端程序时(Web Server或者文件服务器),文件下载是一个基本功能.这时候服务端的任务是: ...

  3. Java基础-零拷贝技术应用案例

    Java基础-零拷贝技术应用案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 零拷贝技术在Hadoop生态圈中很多组件得到应用,典型的比如kafka组件,它就很成功的应用了零拷贝 ...

  4. 【转】浅析Linux中的零拷贝技术

    本文探讨Linux中主要的几种零拷贝技术以及零拷贝技术适用的场景.为了迅速建立起零拷贝的概念,我们拿一个常用的场景进行引入: 引文## 在写一个服务端程序时(Web Server或者文件服务器),文件 ...

  5. [转帖]Linux 中的零拷贝技术,第 2 部分

    Linux 中的零拷贝技术,第 2 部分 https://www.ibm.com/developerworks/cn/linux/l-cn-zerocopy2/index.html   Linux 中 ...

  6. [转帖]Linux 中的零拷贝技术,第 1 部分

    Linux 中的零拷贝技术,第 1 部分 https://www.ibm.com/developerworks/cn/linux/l-cn-zerocopy1/index.html   引言 传统的 ...

  7. 操作系统IO之零拷贝技术

    磁盘可以说是计算机系统最慢的硬件之一,读写速度相差内存 10 倍以上,所以针对优化磁盘的技术非常的多,比如零拷贝.直接 I/O.异步 I/O 等等,这些优化的目的就是为了提高系统的吞吐量,另外操作系统 ...

  8. 【Netty技术专题】「原理分析系列」Netty强大特性之ByteBuf零拷贝技术原理分析

    零拷贝Zero-Copy 我们先来看下它的定义: "Zero-copy" describes computer operations in which the CPU does n ...

  9. 【面试普通人VS高手】Kafka的零拷贝原理?

    最近一个学员去滴滴面试,在第二面的时候遇到了这个问题: "请你简单说一下Kafka的零拷贝原理" 然后那个学员努力在大脑里检索了很久,没有回答上来. 那么今天,我们基于这个问题来看 ...

  10. 浅析 Linux 中的零拷贝技术

    本文探讨Linux中 主要的几种零拷贝技术 以及零拷贝技术 适用的场景 .为了迅速建立起零拷贝的概念,我们拿一个常用的场景进行引入: 引文 在写一个服务端程序时(Web Server或者文件服务器), ...

随机推荐

  1. Python运维开发之路《python基础介绍》

    一. python介绍相关 1. Python简介 Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. - Python 的设计具有很强的可读性,相比其他语言经常使用英文关 ...

  2. .net core提示502.5错误

    最近给WindowsServer2012服务器部署.Net Core项目,部署后一直显示502.5错误,具体如下: 网上找了一大堆解决办法都行不通,最后在stackoverflow中找到说是缺少一个补 ...

  3. 十大功能特性,助力开发者玩转API Explorer

    摘要:华为云API Explorer为开发者提供一站式API解决方案统一平台,集成华为云服务所有开放API,支持全量快速检索.可视化调试.帮助文档.代码示例等能力,帮助开发者快速查找.学习API和使用 ...

  4. CS144 LAB5~LAB6

    CS144 lab5~6 最后两个lab了,虽然很多大佬都说剩下的两个lab比起TCP的实现,"简直太简单了",但是我认为做这两个之前需要补充一些额外的网络知识,不然直接上手去做的 ...

  5. 使用Canal同步mysql数据到es

    一.简介 Canal主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费. 当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7 ...

  6. Semantic Kernel Java SDK,为Java应用程序提供AI功能集成

    美国时间 2023 年 7 月 19 日,Semantic Kernel 团队在其官方博客[1]上宣布发布 Java 版Semantic Kernel. Samantic Kernel系列的源代码可在 ...

  7. typedef函数的使用

    typedef int INT; //相当于给int起了一个别名INT typedef struct Student { int sid; char name[100]; char sex; }ST; ...

  8. Angular与AngularJS区别

    简单介绍 目前 Angular 2 到現在 Angular 11 都是十分穩定的改版,不再出現之前 Angular 1.x 到 Angular 2.x 的哀鴻遍野. 因此目前市面上確實同時存在著兩種差 ...

  9. 【Leaflet入门篇】 Leaflet快速入门

    0 前言 Leaflet 是一个开源并且对移动端友好的交互式地图 JavaScript 库. 它大小仅仅只有 42 KB of JS, 并且拥有绝大部分开发者所需要的所有地图特性 .Leaflet 简 ...

  10. Ubuntu20.04 下编译和运行 FreeSWITCH的问题汇总

    1. Ubuntu20.04 下编译和运行 FreeSWITCH的问题汇总 1.1. 环境 Ubuntu20.04.2 LTS (Linux 5.4.0-152-generic x86_64 GNU/ ...