【Netty】零拷贝(zero-copy)

小鱼儿 2023-09-29 13:55 28阅读 0赞

目录

    1. 零拷贝技术实现
    1. 传统读取IO流的操作
    • 2.1 读操作
    • 2.2 写操作
    • 2.3 MMAP+write
    • 2.4 Sendfile
    1. 零拷贝应用场景

很多更新的技术在宣传的时候,都会提到速度、性能这个指标,什么提升了10倍,100倍啊,其中有一个技术点叫做zero-copy,也叫做零拷贝。

零拷贝核心优化点:就需要减少「用户态与内核态的上下文切换」和「内存拷贝」的次数。

1. 零拷贝技术实现

1.直接 I/O
2.mmap
3.sendfile

2. 传统读取IO流的操作

2.1 读操作

1、应用程序发起读数据操作,JVM会发起read()系统调用。
2、这时操作系统OS会进行一次上下文切换(把用户空间切换到内核空间)
3、通过磁盘控制器把数据copy到内核缓冲区中,这里的就发生了一次DMA Copy
4、然后内核将数据copy到用户空间的应用缓冲区中,发生了一次CPU Copy
5、read调用返回后,会再进行一次上下文切换(把内核空间切换到用户空间)

读操作发送两次数据拷贝、两次上下文的切换。

2.2 写操作

1、应用发起写操作,OS进行一次上下文切换(从用户空间切换为内核空间)
2、并且把数据copy到内核缓冲区Socket Buffer,做了一次CPU Copy
3、内核空间再把数据copy到磁盘或其他存储(网卡,进行网络传输),进行了DMA Copy
4、写入结束后返回,又从内核空间切换到用户空间
两次上下文切换 两次数据拷贝

也就是说 socket客户端与服务器端通讯可能会发生四次上下文切换 四次数据拷贝。

2.3 MMAP+write

read() 系统调用的过程中会把内核缓冲区的数据拷贝到用户的缓冲区里,于是为了减少这一步开销,我们可以用 mmap() 替换 read() 系统调用函数。
mmap() 系统调用函数会直接把内核缓冲区里的数据「映射」到用户空间,这样,操作系统内核与用户空间就不需要再进行任何的数据拷贝操作。
在这里插入图片描述
可以减少一次 内核空间拷贝数据到用户空间,该方案也不是最理想的零拷贝实现方案。

2.4 Sendfile

Linux内核 在2.1版本:
可以直接把内核缓冲区里的数据拷贝到 socket 缓冲区里,不再拷贝到用户态,这样就只有 2 次上下文切换,和 3 次数据拷贝 但是这还不是真正的零拷贝技术

Linux内核 在2.4版本:
sendfile() 系统调用的过程发生了点变化
MA 控制器就可以直接将内核缓存中的数据拷贝到网卡的缓冲区里,此过程不需要将数据从操作系统内核缓冲区拷贝到 socket 缓冲区中,这样就减少了一次数据拷贝;这就是所谓的零拷贝(Zero-copy)技术

因为我们没有在内存层面去拷贝数据,也就是说全程没有通过 CPU 来搬运数据,所有的数据都是通过 DMA 来进行传输的,总体来看,零拷贝技术可以把文件传输的性能提高至少一倍以上。
在这里插入图片描述

3. 零拷贝应用场景

  1. kafka
  2. Nginx
  3. Spark

发表评论

表情:
评论列表 (有 0 条评论,28人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Netty剖析之拷贝

    什么是零拷贝? 零拷贝是网络编程的关键,很多性能优化都离不开; 零拷贝,是从操作系统的角度来说的。因为内核缓冲区之间,没有数据是重复的(只有 kernel b

    相关 Netty之ByteBuf拷贝

    我们或多或少了解过一些零拷贝的概念,而零拷贝也正是netty能够实现高性能的原因之一,因此我们有必要深入了解netty的零拷贝。但是在深入了解netty的零拷贝之前,让我们先来