美文网首页netty个人学习
Netty零拷贝实现原理

Netty零拷贝实现原理

作者: 刘一一同学 | 来源:发表于2020-03-02 09:21 被阅读0次

1. 传统数据传送

传统数据从Socket网络中传送,需要4次数据拷贝和4次上下文切换:

  1. 将磁盘文件,读取到操作系统内核缓冲区;
  2. 将内核缓冲区的数据,拷贝到用户空间的缓冲区;
  3. 数据从用户空间缓冲区拷贝到内核的socket网络发送缓冲区;
  4. 数据从内核的socket网络发送缓冲区拷贝到网卡接口(硬件)的缓冲区,由网卡进行网络传输。

传统方式,读取磁盘文件并进行网络发送,经过的4次数据拷贝和4次上下文切换是非常繁琐的。实际IO读写,需要进行IO中断,需要CPU响应中断(带来上下文切换),尽管后来引入DMA来接管CPU的中断请求,但四次拷贝仍在存在不必要的环节。

2. 零拷贝实现原理

零拷贝的目的是为了减少IO流程中不必要的拷贝,以及减少用户进程地址空间和内核地址空间之间因为上下文切换而带来的开销。由于虚拟机不能直接操作内核,因此它的实现需要操作系统OS的支持,也就是需要kernel内核暴漏API。

2.1 Netty中的零拷贝

  1. Direct Buffers:Netty的接收和发送ByteBuffer采用直接缓冲区(Direct Buffer)实现零拷贝,直接在内存区域分配空间,避免了读写数据的二次内存拷贝,这就实现了读写Socket的零拷贝。

如果使用传统的堆内存缓冲区(Heap Buffer)进行Socket读写,JVM会将堆内存Buffer拷贝到直接内存中,然后才写入Socket中。相比堆外直接内存,消息在发送过程中多了一次缓冲区的内存拷贝。

  1. CompositeByteBuf:它可以将多个ByteBuf封装成ByteBuf,对外提供统一封装后的ByteBuf接口。CompositeByteBuf并没有真正将多个Buffer组合起来,而是保存了它们的引用,从而避免了数据的拷贝,实现了零拷贝。

传统的ByteBuffer,如果需要将两个ByteBuffer中的数据组合到一起,我们需要首先创建一个size=size1+size2大小的新的数组,然后将两个数组中的数据拷贝到新的数组中。但是使用Netty提供的组合ByteBuf,就可以避免这样的操作。

  1. Netty的文件传输类DefaultFileRegion通过调用FileChannel.transferTo()方法实现零拷贝,文件缓冲区的数据会直接发送给目标Channel。底层调用Linux操作系统中的sendfile()实现的,数据从文件由DMA引擎拷贝到内核read缓冲区,;DMA从内核read缓冲区将数据拷贝到网卡接口(硬件)的缓冲区,由网卡进行网络传输。

2.2 Java中零拷贝

  1. 通过Java的FileChannel.transferTo()方法实现零拷贝,底层是调用Linux操作系统中的sendfile()实现的,数据从文件由DMA引擎拷贝到内核read缓冲区;DMA从内核read缓冲区将数据拷贝到网卡接口(硬件)的缓冲区,由网卡进行网络传输。

  2. 通过Java的FileChannel.map()方法实现零拷贝,底层是调用Linux操作系统中的mmap()实现的,将内核缓冲区的内存和用户缓冲区的内存做了一个地址映射,这种方式适合读取大文件,同时也能对文件内容进行更改,但是如果其后要通过SocketChannel发送,还是需要CPU进行数据的拷贝。

相关文章

  • Netty零拷贝实现原理

    1. 传统数据传送 传统数据从Socket网络中传送,需要4次数据拷贝和4次上下文切换: 将磁盘文件,读取到操作系...

  • Netty零拷贝

    Netty零拷贝分别用到了 直接内存 Linux零拷贝 Netty内部CompositeByteBuf 三个技术点...

  • JAVA-每日一面 2022-01-24

    说说Netty 线程模型和 Netty 的零拷贝 Netty 线程模型首先,Netty 使用 EventLoop ...

  • Netty分享之ByteBuf零拷贝

    gris 转载请注明原创出处,谢谢! 我们或多或少了解过一些零拷贝的概念,而零拷贝也正是netty能够实现高性能的...

  • netty如何实现零拷贝

    根据 Wiki 对 Zero-copy 的定义: 即所谓的 Zero-copy, 就是在操作数据时, 不需要将数据...

  • rocketMQ零拷贝、kafka零拷贝、netty零拷贝分析

    1.RocketMQ零拷贝?Netty零拷贝?kafka零拷贝?到底是个什么玩意儿!什么page cache?什么...

  • 76 netty零拷贝原理&netty线程模型原理

    1 什么是零拷贝 zery-copy 2,为什么kafka中使用 zery-copy 3, 零拷贝技术实现方案有哪...

  • 零拷贝实现原理

    [TOC] 内容拷贝过程 场景:从一个文件中读出并将数据传到另一台服务器实现伪代码如下: 注意: 在应用拷贝时会涉...

  • netty 零拷贝

    首先将它与传统的I/O read和write操作作对比,看看有什么不同,首先需要理解一下用户态和内存态的概念 用户...

  • Netty - 零拷贝

    本文主要在对于 Netty ByteBuf 的零拷贝(Zero Copy) 的理解的基础上做修补 根据 Wiki ...

网友评论

    本文标题:Netty零拷贝实现原理

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