精华内容
下载资源
问答
  • kafka零拷贝原理
    千次阅读
    2022-03-20 21:17:07

    想了解kafka的零拷贝到底是什么,可以看一下Kafka为什么这么快?
    如果看零拷贝和非拷贝之间的区别图可以看Kafka_Kafka中的Zero Copy

    更多相关内容
  • ”请你简单说一下Kafka零拷贝原理“ 然后那个学员努力在大脑里检索了很久,没有回答上来。 那么今天,我们基于这个问题来看看,普通人和高手是如何回答的! 普通人的回答: 零拷贝是一种减少数据拷贝的机制...

    最近一个学员去滴滴面试,在第二面的时候遇到了这个问题:

    “请你简单说一下Kafka的零拷贝原理”

    然后那个学员努力在大脑里检索了很久,没有回答上来。

    那么今天,我们基于这个问题来看看,普通人和高手是如何回答的!

    普通人的回答:

    零拷贝是一种减少数据拷贝的机制,能够有效提升数据的效率。

    高手的回答:

    在实际应用中,如果我们需要把磁盘中的某个文件内容发送到远程服务器上,如图

    那么它必须要经过几个拷贝的过程:

    1. 从磁盘中读取目标文件内容拷贝到内核缓冲区

    2. CPU控制器再把内核缓冲区的数据赋值到用户空间的缓冲区中

    3. 接着在应用程序中,调用write()方法,把用户空间缓冲区中的数据拷贝到内核下的Socket Buffer中。

    4. 最后,把在内核模式下的SocketBuffer中的数据赋值到网卡缓冲区(NIC Buffer)

    5. 网卡缓冲区再把数据传输到目标服务器上。

    在这个过程中我们可以发现,数据从磁盘到最终发送出去,要经历4次拷贝,而在这四次拷贝过程中,有两次拷贝是浪费的,分别是:

    1. 从内核空间赋值到用户空间

    2. 从用户空间再次复制到内核空间

    除此之外,由于用户空间和内核空间的切换会带来CPU的上线文切换,对于CPU性能也会造成性能影响。

    而零拷贝,就是把这两次多于的拷贝省略掉,应用程序可以直接把磁盘中的数据从内核中直接传输给Socket,而不需要再经过应用程序所在的用户空间,如下图所示。

    零拷贝通过DMA(Direct Memory Access)技术把文件内容复制到内核空间中的Read Buffer,接着把包含数据位置和长度信息的文件描述符加载到Socket Buffer中,DMA引擎直接可以把数据从内核空间中传递给网卡设备。

    在这个流程中,数据只经历了两次拷贝就发送到了网卡中,并且减少了2次cpu的上下文切换,对于效率有非常大的提高。

    所以,所谓零拷贝,并不是完全没有数据赋值,只是相对于用户空间来说,不再需要进行数据拷贝。对于前面说的整个流程来说,零拷贝只是减少了不必要的拷贝次数而已。

    在程序中如何实现零拷贝呢?

    • 在Linux中,零拷贝技术依赖于底层的sendfile()方法实现

    • 在Java中,FileChannal.transferTo() 方法的底层实现就是 sendfile() 方法。

    除此之外,还有一个 mmap 的文件映射机制

    它的原理是:将磁盘文件映射到内存, 用户通过修改内存就能修改磁盘文件。使用这种方式可以获取很大的I/O提升,省去了用户空间到内核空间复制的开销。

    以上就是我对于Kafka中零拷贝原理的理解

    总结

    本期的普通人VS高手面试系列就到这里结束了。

    本次的面试题涉及到一些计算机底层的原理,基本上也是业务程序员的知识盲区。

    但我想提醒大家,做开发其实和建房子一样,要想楼层更高更稳,首先地基要打牢固。

    另外,如果你有任何面试相关的疑问,欢迎评论区给我留言。

    我是Mic,一个工作了14年的Java程序员,咱们下篇文章再见。

    展开全文
  • 通俗易懂的Kafka零拷贝机制

    千次阅读 多人点赞 2020-09-11 11:01:00
    Kafka之所以那么快,其中一个很大的原因就是零拷贝(Zero-copy)技术,零拷贝不是kafka的专利,而是操作系统的升级,又比如Netty,也用到了零拷贝。下面我就画图讲解零拷贝,如果对你有帮助请点个赞支持。 传统IO ...

    Kafka之所以那么快,其中一个很大的原因就是零拷贝(Zero-copy)技术,零拷贝不是kafka的专利,而是操作系统的升级,又比如Netty,也用到了零拷贝。下面我就画图讲解零拷贝,如果对你有帮助请点个赞支持。

    传统IO

    kafka的数据是要落入磁盘的,那么必然牵扯到磁盘的IO,传统磁盘IO又叫缓存IO,效率是很低的,那么为什么效率低呢?我们先来粗略讲讲操作系统的知识。

    用户空间以及内核空间的概念:

    我们知道现在操作系统都是采用虚拟存储器。那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操心系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核,保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间(Kernel space),一部分为用户空间(User space)。针对Linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间。每个进程可以通过系统调用进入内核,因此,Linux内核由系统内的所有进程共享。于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟空间。

    传统的文件读写或者网络传输,通常需要将数据从内核态转换为用户态。应用程序读取用户态内存数据,写入文件 / Socket之前,需要从用户态转换为内核态之后才可以写入文件或者网卡当中。我们可以称之为read/write模式,此模式的步骤为:

    1. 首先,调用read时,磁盘文件拷贝到了内核态;
    2. 之后,CPU控制将内核态数据copy到用户态下;
    3. 调用write时,先将用户态下的内容copy到内核态下的socket的buffer中;
    4. 最后将内核态下的socket buffer的数据copy到网卡设备中传送;

     DMA

    DMA(Direct Memory Access,直接存储器访问) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载 。通俗来讲,就是DMA 传输将数据从一个地址空间复制到另外一个地址空间,当CPU 初始化这个传输动作,传输动作本身是由 DMA 控制器来实行和完成,也就是两个硬件之间完成的,而没有CPU的参与,那么CPU就可以释放出来做别的事情,这样极大地提高了效率。我们常见的硬件设备如网卡、磁盘设备、显卡、声卡之类的都支持DMA。

    所以上面所说的read/write模式大概如图所示:

    传统IO有两个很大的缺点导致很慢:

    1. 我们可以清楚的看到共产生了4次copy,从磁盘文件到Kernal的相互读写是支持DMA copy的,但即使是这样,从Kernal到User没有硬件的支持所以不支持DMA,还有两次CPU copy。
    2. Kafka只是把文件存放到磁盘之后通过网络发出去,中间并不需要修改什么数据,那read和write的两次CPU copy的操作完全是多余的。

     零拷贝

    mmap

    mmap是零拷贝的一种,主要就是去掉read write这两次CPU copy以提升性能,调用mmap()来代替read调用:

    buf = mmap(diskfd, len);
    write(sockfd, buf, len);

    此模式步骤为:

    1. 用户程序调用 mmap(),磁盘上的数据会通过 DMA被拷贝的内核缓冲区;
    2. 接着操作系统会把这段内核缓冲区与用户程序共享,这样就不需要把内核缓冲区的内容往用户空间拷贝;
    3. 用户程序再调用 write(),操作系统直接将内核缓冲区的内容拷贝到 socket缓冲区中;
    4. 最后, socket缓冲区再把数据发到网卡去。

    这显然是一个伟大的进步,把上下文的切换次数从4次减少到2次,同时也把数据copy的次数从4次降低到了3次。

    sendfile

    Linux2.1内核开始引入了sendfile函数,用于将文件通过socket传送。开始时跟mmap没什么区别,但是Linux2.4做出了重大优化,将零拷贝推到顶峰。

    优化后的处理过程如下:

    1. 将文件拷贝到kernel buffer中;
    2. 向socket buffer中追加当前要发生的数据在kernel buffer中的位置和偏移量;
    3. 根据socket buffer中的位置和偏移量直接将kernel buffer的数据copy到网卡设备中;

    如图:

    经过上述过程,数据只经过了2次copy就从磁盘传送出去了。这个才是真正的Zero-Copy(这里的零拷贝是针对kernel来讲的,数据在kernel模式下是Zero-Copy)。

    正是Linux2.4的内核做了改进,Java中的TransferTo()实现了Zero-Copy。

    测试

    在Windows10上测试:

    测试结果仅供参考 ,并不是平均数,所以可能偏差较大。

    展开全文
  • =================== 很多人都会在这个看似简单的问题中入坑,一说到数据类型,很多人第一时间想到的就是int、char等类型,但是我们仔细看题就会发现,题中所问的问题是数据类型,而不是基本数据类型。...

    ===================

    很多人都会在这个看似简单的问题中入坑,一说到数据类型,很多人第一时间想到的就是int、char等类型,但是我们仔细看题就会发现,题中所问的问题是数据类型,而不是基本数据类型。

    数据类型有两种,分别是“基本数据类型”和“引用数据类型”

    基本数据类型包括的内容如下表:

    byte

    short

    int

    long

    double

    float

    char

    boolean

    字节大小

    1

    2

    4

    8

    8

    4

    2

    1

    占位大小

    8

    16

    32

    64

    64

    32

    16

    8

    而引用数据类型包括的是三种:类、接口、数组

    那么在Java中为什么会有“基本数据类型”和“引用数据类型”?

    原因是因为引用类型在堆里,基本类型在栈里,

    栈空间小且连续,往往会被放在缓存。引用类型的高速缓存率高且要多一次解引用。

    而且对象还要再多储存一个对象头,对基本数据类型来说空间浪费率太高。

    4、解释一下构造方法

    ==============

    构造方法有哪些规定?

    • 构造方法名必须与类名一致

    • 构造方法不举办任何返回值类型、关键字void也不能加入

    • 任何类都有构造方法,如果没有显示的定义,则系统会为该类定义一个默认的无参构造器

    • 如果显示的定义了构造器,系统就不会创建默认的不含参数的构造器了,

    • 一个类中可以编写多个构造方法,构造方法之间构成重载关系。

    5、如何理解方法的重载和重写?

    ===================

    对于方法的重载和重写,这是两个非常容易混淆的概念,所以在这里做了一个表格的对比:

    重载

    重写

    1. 发生在同一个类中

    2. 方法名必须相同、参数不同,包括类型、个数、顺序,方法返回值和访问修饰符可以不同。

    3. 发生在编译时

    1. 发生在父子类中

    2. 方法名、参数列表必须相同

    3. 返回值范围小于等于父类

    4. 访问修饰符范围大于等于父类

    5. 抛出的异常范围小于等于父类

    以上是几个在Java面试中常见的概念型面试题,接下来再和大家分享几个对比类的面试题

    6、解释this和super关键字

    =====================

    在this和super关键字使用过程中有以下这些注意事项:

    • Super关键字用于从子类访问父类的变量和构造方法,也包含构造方法

    • Super调用父类中的其他构造方法时,调用时要放在构造方法的首行

    • this关键字用于引用类的当前实例,this可以调用当前类的构造方法

    • this调用本类中的其他构造方法时,也要放在首行

    • this和super都不能用在static方法中

    7、解释字符串三剑客(String、StringBuilder、StringBuffer)

    =================================================

    《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

    【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

    .95pt;">

    可变性

    线程安全

    性能

    String

    由final修饰,不可变

    安全的

    进行改变时,重新指向

    StringBuilder

    char[] value 可变

    不安全

    比StringBuffer有10%-15%的提升

    StringBuffer

    char[] value 可变

    加锁、安全的

    8、equals和 == 的区别

    ====================

    这个问题也是我们在开发时常用的两个进行比较的方法,但是这两种方法你真的了解吗?

    ==:判断两个基本数据类型的值是不是相等,或两个引用类型对象的地址是不是相等

    equals():判断是否用一个对象,更加灵活

    接下来我们来看一个经典的面试题实例:

    public static void main(String[] args) {

    Integer x = new Integer(500);

    Integer y = new Integer(500);

    System.out.println(x == y);

    Integer i = 128;

    Integer j = 128;

    System.out.println(i == j);

    Integer a = 127;

    Integer b = 127;

    System.out.println(a == b);

    }

    上面这个实例的运行结果如下:

    第一个是false,原因是因为:x和y是两个新的对象,所以这两个对象的地址是不同的

    **而对于第二个和第三个,为什么第一个是false,而第二个是true呢?**原因是因为integer在常量池中的存储范围是[-128、127],127在这个范围之内,因此直接存储于常量池中,128不在这范围之内,所以会在堆中创建一个新的对象

    9、解释接口和抽象类

    ==============

    接口是对行为的抽象,他是抽象方法的集合

    • 接口不用被实例化,所有成员默认被public static final所修饰

    • 接口中所有的方法,要么是抽象方法、要么是静态方法

    • 抽象类和接口一样不能被实例化

    • 抽象类中可以有一个或多个抽象方法,也可以不含有抽象方法

    • 抽象类是对共有方法实现或者共有成员变量的抽取,主要通过继承的方式用于代码重用

    **在这里需要注意的是:**从Java8开始,接口增加了对default method方法的支持,

    展开全文
  • Kafka零拷贝

    千次阅读 2022-05-17 17:08:29
    Kafka零拷贝 在实际应用中,如果需要把磁盘中的某个文件内容,发送到远程服务器上,那么他必须要经过几个拷贝的过程。 1,从磁盘读取目标文件内容,copy到内核缓冲去; 2, cpu控制器把内核缓冲区的数据, copy到...
  • 在实际应用中,如果我们需要把磁盘中的某个文件内容发送到远程服务器上,它必须要经过几个拷贝的过程,如图所示:1、从磁盘中读取目标文件内容拷贝到内核缓冲区2、CPU控制器再把内核缓冲区的数据赋值到用户空间的...
  • kafka零拷贝技术详解

    2021-03-16 17:55:00
    所谓的零拷贝是指将数据直接从磁盘文件复制到网卡设备中,而不需要经由应用程序之手。零拷贝大大提高了应用程序的性能,减少了内核和用户模式之间的上下文切换。对 Linux 操作系统而言,零拷贝技术依赖于底层的 send...
  • Kafka-零拷贝

    2021-09-10 17:40:30
    Kafka除了具备消息队列MQ的特性和使用场景外,它还有一个重要用途,就是做存储层。 用kafka做存储层,为什么呢?一大堆可以做数据存储的 MySQL、MongoDB、HDFS…… 因为kafka数据是持久化磁盘的,还速度快;还可靠...
  • kafka零拷贝总结

    千次阅读 2022-03-11 00:29:26
    在实际应用中,如果我们需要把磁盘中的内容发送到远程服务器上,那么需要经过一下几个拷贝的过程。 第一个从磁盘中去读取目标文件的内容去拷贝到内核缓冲区,第二个cpu控制器把内核缓冲区的数据拷贝到用户空间的...
  • 【HBZ分享】Kafka高性能之零拷贝原理
  • 3.2 零拷贝(Kafka高性能的原因之一) “零拷贝”通常是指计算机在网络上发送文件时,不需要将文件内容拷贝到用户空间(User Space)而直接在内核空间(Kernel Space)中传输到网络的方式。 Kafka所有数据的写如何读取...
  • 1.什么是零拷贝 WIKI中对其有如下定义: “Zero-copy” describes computer operations in which the CPU does not perform the task of copying data from one memory area to another. 从WIKI的定义中,我们看到...
  • Kafka - 之kafka为什么这么快(页缓存、零拷贝、顺序写磁盘)! kafka为什么这么快,主要是得益于以下几点 页缓存(读) 零拷贝(读写) 顺序写磁盘(写) 用户应用与磁盘之间文件之间的读写可以大致分为以下几层分工 ####...
  • 众所周知,Kafka和RocketMQ高性能除了本身的某些设计之后,最重要的是实现零拷贝技术。通过采用零拷贝大大提供了应用性能,减少了内核和用户模式之间的上下文切换次数。那么什么是零拷贝,如何实现零拷贝呢? 什么...
  • Kafka 零拷贝技术

    2021-04-14 21:20:30
    Kafka除了具备消息队列MQ的特性和使用场景外,它还有一个重要用途,就是做存储层。 用kafka做存储层,为什么呢?一大堆可以做数据存储的 MySQL、MongoDB、HDFS…… 因为kafka数据是持久化磁盘的,还速度快;还可靠...
  • Kafka和RocketMQ底层存储:零拷贝技术

    千次阅读 2020-12-15 20:42:25
    《【转】零拷贝的实现原理》 《【转】零拷贝的实现原理》 《搞懂Linux零拷贝,DMA》 《通过零拷贝进行有效的数据传输(java、c)》 《CUDA零拷贝内存(zerocopy memory)》 IO相关 《Linux文件系统直接IO原理与...
  • Kafka提高性能的方式除了消息顺序追加、页缓存等技术,Kafka 还使用零拷贝技术来进一步提升性能。 先说说零拷贝 零拷贝并不是不需要拷贝,而是减少不必要的拷贝次数。通常是说在IO读写过程中。 实际上,零拷贝是...
  • 本文深入探究零拷贝原理,从操作系统开始层层递进的分析了数据传输的各个相关组件及流程,直观透彻的呈现了零拷贝原理和优点。
  • kafka做存储层,为什么呢?一大堆可以做数据存储的 MySQL、MongoDB、...首先要有个概念,kafka高性能的背后,是多方面协同后、最终的结果,kafka从宏观架构、分布式partition存储、ISR数据同步、以及“无孔不入”
  • 零拷贝原理详解

    2022-05-05 09:45:27
    零拷贝原理 mmap sendfile
  • Kafka为什么快-顺序访问和零拷贝

    千次阅读 2019-12-04 11:20:19
    3、零拷贝 传统读取文件并发送到网络的流程: 使用零拷贝技术 读取文件并发送到网络的流程: 1、页缓存 + 顺序写 首先Kafka每次接收到数据都会往磁盘上去写,如下图所示: 那么在这里我们不禁有一个疑问了,...
  • Java零拷贝 1.MappedByteBuffer java nio提供的FileChannel提供了map()方法,该方法可以在一个打开的文件和MappedByteBuffer之间建立一个虚拟内存映射,MappedByteBuffer继承于ByteBuffer,类似于一个基于内存的...
  • Kafka零拷贝技术

    2020-09-10 15:31:26
    kafka中的消费者在读取服务端的数据时,需要将服务端的磁盘文件通过网络发送到消费者进程,网络发送需要经过几种网络节点。如下图所示: 传统的读取文件数据并发送到网络的步骤如下: (1)操作系统将数据从磁盘...
  • 3分钟理解零拷贝,以及kafka为什么能这么快
  • 因此本文将跟大家一起来学习零拷贝原理。1. 什么是零拷贝2. 传统的IO执行流程3. 零拷贝相关的知识点回顾4. 零拷贝实现的几种方式5. 提供的零拷贝方式零拷贝字面上的意思包括两个,“零”和“拷贝”:“拷贝”:就是...
  • 聊聊RocketMQ(三)RocketMQ零拷贝原理

    千次阅读 2021-01-08 17:01:55
    RocketMQ零拷贝原理零拷贝原理PageCachecache和buffer的区别HeapByteBuffer和DirectByteBuffer缓冲IO和直接IO内存映射文件(Mmap)直接内存读取并发送文件的过程Mmap读取并发送文件的过程Sendfile零拷贝读取并发送...
  • 零拷贝原理

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

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,457
精华内容 2,182
关键字:

kafka零拷贝原理