零拷贝

作者: 晚歌歌 | 来源:发表于2021-07-08 10:49 被阅读0次

    定义

    "Zero-copy" describes computer operations in which the CPU does not perform the task of copying data from one memory area to another.

    指计算机操作的过程中,CPU不需要为数据在内存之间的拷贝消耗资源。而它通常是指计算机在网络上发送文件时,不需要将文件内容拷贝到用户空间(User Space)而直接在内核空间(Kernel Space)中传输到网络的方式。

    好处

    • 减少甚至完全避免不必要的CPU拷贝,从而让CPU解脱出来去执行其他的任务
    • 减少内存带宽的占用
    • 通常零拷贝技术还能够减少用户空间和操作系统内核空间之间的上下文切换

    传统IO

    发生了 4 次用户态与内核态的上下文切换、 4 次数据拷贝


    image.png

    要想提高文件传输的性能,就需要减少「用户态与内核态的上下文切换」和「内存拷贝」的次数。

    实现

    零拷贝技术实现的方式通常有 2 种:

    • mmap + write
    • sendfile

    mmap + write

    mmap() 系统调用函数会直接把内核缓冲区里的数据「映射」到用户空间,这样,操作系统内核与用户空间就不需要再进行任何的数据拷贝操作。


    image.png

    通过使用 mmap() 来代替 read(), 可以减少一次数据拷贝的过程。但这还不是最理想的零拷贝,因为仍然需要通过 CPU 把内核缓冲区的数据拷贝到 socket 缓冲区里,而且仍然需要 4 次上下文切换,因为系统调用还是 2 次。

    sendfile

    在 Linux 内核版本 2.1 中,提供了一个专门发送文件的系统调用函数 sendfile(),可以直接把内核缓冲区里的数据拷贝到 socket 缓冲区里,不再拷贝到用户态,这样就只有 2 次上下文切换,和 3 次数据拷贝


    image.png

    但是这还不是真正的零拷贝技术,如果网卡支持 SG-DMA(The Scatter-Gather Direct Memory Access)技术(和普通的 DMA 有所不同),我们可以进一步减少通过 CPU 把内核缓冲区里的数据拷贝到 socket 缓冲区的过程。

    从 Linux 内核 2.4 版本开始起,对于支持网卡支持 SG-DMA 技术的情况下, sendfile() 系统调用的过程发生了点变化,具体过程如下:
    第一步,通过 DMA 将磁盘上的数据拷贝到内核缓冲区里;
    第二步,缓冲区描述符和数据长度传到 socket 缓冲区,这样网卡的 SG-DMA 控制器就可以直接将内核缓存中的数据拷贝到网卡的缓冲区里,此过程不需要将数据从操作系统内核缓冲区拷贝到 socket 缓冲区中,这样就减少了一次数据拷贝;
    所以,这个过程之中,只进行了 2 次数据拷贝,如下图:


    image.png

    这就是所谓的零拷贝(Zero-copy)技术,因为我们没有在内存层面去拷贝数据,也就是说全程没有通过 CPU 来搬运数据,所有的数据都是通过 DMA 来进行传输的。

    零拷贝技术的文件传输方式相比传统文件传输的方式,减少了 2 次上下文切换和数据拷贝次数,只需要 2 次上下文切换和数据拷贝次数,就可以完成文件的传输,而且 2 次的数据拷贝过程,都不需要通过 CPU,2 次都是由 DMA 来搬运。

    所以,总体来看,零拷贝技术可以把文件传输的性能提高至少一倍以上。

    Java零拷贝

    Kafka 这个开源项目,就利用了「零拷贝」技术,从而大幅提升了 I/O 的吞吐率,这也是 Kafka 在处理海量数据为什么这么快的原因之一。追溯 Kafka 文件传输的代码,发现最终它调用了 Java NIO 库里的 transferTo 方法,如果 Linux 系统支持 sendfile() 系统调用,那么 transferTo() 实际上最后就会使用到 sendfile() 系统调用函数。
    Netty同样使用这个函数。
    RocketMQ的消息采用顺序写到commitlog文件,然后利用consume queue文件作为索引;RocketMQ采用零拷贝mmap+write的方式来回应Consumer的请求

    相关文章

      网友评论

          本文标题:零拷贝

          本文链接:https://www.haomeiwen.com/subject/crizultx.html