zoukankan      html  css  js  c++  java
  • 转载一篇关于kafka零拷贝(zero-copy)通俗易懂的好文

    原文地址 https://www.cnblogs.com/yizhou35/p/12026263.html

      零拷贝就是一种避免CPU 将数据从一块存储拷贝到另外一块存储的技术。

      DMA技术是Direct Memory Access的缩写。其意思是“存储器直接访问”。它是指一种高速的数据传输操作,允许在外部设备存储器之间直接读写数据,既不通过CPU,也不需要CPU干预。
      DMA是指外部设备不通过CPU而直接与系统内存交换数据的接口技术。要把外设的数据读入内存或把内存的数据传送到外设,一般都要通过CPU控制完成,如CPU程序查询或中断方式。利用中断进行数据传送,可以大大提高CPU的利用率。 但是采用中断传送有它的缺点,对于一个高速I/O设备,以及批量交换数据的情况,只能采用DMA方式,才能解决效率和速度问题。DMA在外设与内存间直接进行数据交换,而不通过CPU,这样数据传送的速度就取决于存储器和外设的工作速度。
     

    原文:

    Kafka之所以那么快的另外一个原因就是零拷贝(zero-copy)技术。本文我们就来了解Kafka中使用的零拷贝技术为什么那么快。

    传统的文件拷贝

    传统的文件拷贝通常需要从用户态去转到核心态,经过read buffer,然后再返回到用户态的应用层buffer,然后再从用户态把数据拷贝到核心态的socket buffer,然后发送到网卡。如下图所示:

    从上图你会发现,传统的数据传输需要多次的用户态和核心态之间的切换,而且还要把数据复制多次,最终才打到网卡。

    如果减少了用户态与核心态之间的切换,是不是就会更快了呢?如下图:

    此时我们会发现用户态“空空如也”。数据没有来到用户态,而是直接在核心态就进行了传输,但这样依然还是有多次复制。首先数据被读取到read buffer中,然后发到socket buffer,最后才发到网卡。虽然减少了用户态和核心态的切换,但依然存在多次数据复制。

    如果可以进一步减少数据复制的次数,甚至没有数据复制是不是就会做到最快呢?

    DMA

    别急,这里我们先介绍一个新的武器:DMA。

    DMA,全称叫Direct Memory Access,一种可让某些硬件子系统去直接访问系统主内存,而不用依赖CPU的计算机系统的功能。听着是不是很厉害,跳过CPU,直接访问主内存。传统的内存访问都需要通过CPU的调度来完成。如下图:

    而DMA,则可以绕过CPU,硬件自己去直接访问系统主内存。如下图:

    很多硬件都支持DMA,这其中就包括网卡。

    零拷贝

    回到本文中的文件传输,有了DMA后,就可以实现绝对的零拷贝了,因为网卡是直接去访问系统主内存的。如下图:

    Java的零拷贝实现

    在Java中的零拷贝实现是在FileChannel中,其中有个方法transferTo(position,fsize,src)。

    传统的文件传输是通过java.io.DataOutputStream,java.io.FileInputStream来实现的,然后通过while循环来读取input,然后写入到output中。

    零拷贝则是通过java.nio.channels.FileChannel中的transferTo方法来实现的。transferTo方法底层是基于操作系统的sendfile这个system call来实现的(不再需要拷贝到用户态了),sendfile负责把数据从某个fd(file descriptor)传输到另一个fd。

    sendfile:

    Java的transferTo:

    传统方式与零拷贝性能对比

    可以看出速度快出至少三倍多。Kafka在文件传输的过程中正是使用了零拷贝技术对文件进行拷贝。建议以后多用FileChannel的transferTo吧。

    回顾

    • 传统的文件传输有多次用户态和内核态之间的切换,而且文件在多个buffer之间要复制多次最终才被发送到网卡。
    • DMA是一种硬件直接访问系统主内存的技术。
    • 多种硬件都已使用了DMA技术,其中就包括网卡(NIC)。
    • DMA技术让CPU得到解放,让CPU可以不用一直守着来完成文件传输。
    • 零拷贝技术减少了用户态与内核态之间的切换,让拷贝次数降到最低,从而实现高性能。
    • Kafka使用零拷贝技术来进行文件的传输。
  • 相关阅读:
    由于取消了脚本支持,无法查看访问统计,也办法放gg广告了,本站更新速度降低.
    关于ASP循环表格的问题之解答
    STL中map用法详解
    vector与list的区别
    mysql联合索引 sql索引使用
    如何让linux/Centos 32位支持大于4G内存
    mysql事务
    Mysql InnoDB中的查询事务模式与锁定select ..for update
    linux 查看系统版本
    如何在64位的Linux中运行32位的应用程序
  • 原文地址:https://www.cnblogs.com/fangjb/p/13271886.html
Copyright © 2011-2022 走看看