`

传统io&mmap&直接io&sendfile零拷贝 对比

阅读更多

 

解释

1、问题叙述:程序请求硬盘上的系统文件的时候,一般请求文件会在’系统缓存’和‘应用缓存’各存储一份,然后再由cpu操作应用缓存展示给用户。所以一般用户请求系统硬盘的文件时,文件在内存中可占了双份,而且系统和应用之间上下文存在多次切换,所以内存跟性能之间存在优化的空间。

2、dma技术解释Direct Memory Access):dma技术未出现之前通过cpu操作磁盘io是非常占用cpu资源的;目前大多数的硬件设备,包括磁盘控制器、网卡、显卡以及声卡等都支持 DMA 技术,该技术解除了cpu在磁盘io方面的负载;

 

  • 传统io

步骤:硬盘(dma)》内核缓冲(cpu)》用户缓冲(cpu)》socket缓冲(dma)》协议层

 

1、四次上下文切换。

 

2、四次copy

 

 

 

  • Mmap(内存映射):

步骤:硬盘(dma)》内核缓冲(share用户缓冲)(cpu)》socket缓冲(dma)》协议层

 

优点

较缓存io,因为系统内核缓存和用户缓存共享,通过mmap访问硬盘数据减少了一次系统缓存至应用缓存之间的copy,提升了性能。

实现用户区域与系统内核之间的高效交互。

提供进程间共享内存间的相互通信方式。(如k8s的共享内存就要到这种方式)

可用于实现高效的大规模数据传输。(因为mmap的内存可大于物理内存,采取淘汰算法,将需要淘汰的内存页换成新的内存页)

缺点

文件很小,小于4096,因为mmap是页为单位,因此连续小文件会浪费内存。

对变长文件不适合,文件无法扩展;mmap到内存,所能操作的访问就确认了。

更新文件操作很多的情况不适合,因为会产生大量脏页回写,引发随机io。

 

 

 rocketmq使用了mmap,java也能实现mmap

 

  • 直接io

步骤:硬盘(dma?)》用户内存》协议层。

 

少了内核缓存这步骤,直接操作硬盘。

 

优点

不用经过内核缓冲,节省了内存,某种场景下算是加快了速度,nginx支持直接io;

 

数据库采用这种方式就很好,实时修改文件,及时响应修改。

 

缺点

没有内核缓冲,意味着每次访问文件都从硬盘访问,多线程同时访问同一文件的时候性能会比较差。

 

一般跟aio异步线程一起使用。

 

 

 

 

 

 

 

  • sendFile (零拷贝)

 

步骤:

 

2.1内核:硬盘(dma)》内核缓冲(cpu)》socket缓存(dma)》协议层。(不经过用户层)

 

2.4内核以上:硬盘(dma)》内核缓冲(cpu)》des描述文件进入socket缓冲(dma)》协议层。(不经过用户层,文件不经过socket缓冲,只是描述文件进入socket缓冲)

 

2.1三次上下文切换,三次copy。

 

2.4三次上下文切换,两次copy,文件直接内核缓存传输到协议层。

 

 

 

 

 

优点

1、节省内存空间,只在内核缓冲存储了一份数据,减少内存拷贝(2-3次),上线文切换(3次)

 

2、充分利用了dma,减少cpu的负担。

 

 

 

缺点

1、数据不经过用户系统,都是在操作系统内核中传输,用户系统编写的对传输内容操作不了?

 

2、貌似传输文件大于2g会出问题。

 

暂未发现太多。。

 

kafka、nginx都支持零拷贝,用于加速外部请求;java也能实现零拷贝

 

分享到:
评论

相关推荐

    零拷贝源代码

    2. **sendfile()系统调用**:这是另一个实现零拷贝的关键技术。sendfile()允许内核直接将文件数据从文件描述符传递到网络发送缓冲区,无需经过用户空间。数据仅在内核空间内部进行一次拷贝,极大地提高了I/O性能。 ...

    spring-boot-protocol:springboot功能扩展-netty动态协议,可以支持各种网络协议的动态切换(单端口支持多个网络协议)。支持mmap,sendfile零拷贝,http请求批量聚合

    用Netty实现的Spring-boot-protocol将springboot的WebServer更改为NettyTcpServer,为用户扩展了网络编程的能力。...sendFile, mmap. 示例:com.github.netty.http.example.HttpZeroCopyController.java4.HttpServlet

    Linux零拷贝原理.pdf

    mmap和sendfile的使用可以大幅度减少数据拷贝的次数。例如,使用mmap系统调用时,文件内容首先被DMA引擎读取到内核缓冲区,然后mmap将内核缓冲区映射到用户空间,这样就避免了第二次拷贝到用户缓冲区。当执行write...

    程序员面试之零拷贝技术解析.pdf,这是一份不错的文件

    零拷贝技术的实现方式有很多,例如 sendfile、mmap、splice、Direct I/O 等。 sendfile 是一种零拷贝技术的实现方式,它可以代替 read 和 write 系统调用,通过使用 DMA 技术以及传递文件描述符,实现了零拷贝。...

    《学习资料》--springboot支持各种网络协议的动态切换.支持mmap,sendfile零拷贝.zip

    个人花大量时间整理出的实战资料,内容丰富,文档也很详细。无论做毕业设计还是用于学习技能,或工作中当做参考资料,都能发挥重要作用 亲们下载我任何一个付费资源后,即可私信联系我免费下载其他相关资源哦~ ...

    NIO与零拷贝_javanio_nio和零拷贝_

    - **Sendfile系统调用**:在Linux系统中,sendfile()调用可以从一个文件描述符直接将数据发送到另一个文件描述符,例如从磁盘到网络,避免了CPU参与的数据拷贝。 3. **零拷贝的优势** - **减少CPU负载**:由于...

    Linux 中的零拷贝技术,第 2 部分1

    在Linux系统中,有两种主要的零拷贝技术:mmap()和sendfile()。 1. **mmap()技术**: - **工作原理**:mmap()是内存映射文件的系统调用,允许应用程序直接访问文件在内核缓冲区中的内容,减少了数据在用户空间和...

    NIO与零拷贝1

    尽管sendFile仍然有2次拷贝,但因为它避免了用户空间的参与,所以被认为是零拷贝的一种实现。 5. **零拷贝的优势**: - **性能提升**:减少CPU的使用,因为它减少了不必要的数据复制操作。 - **减少上下文切换**...

    Linux中的零拷贝技术

    sendfile()将文件描述符和socket描述符作为参数,使得数据从内核缓冲区直接到网络栈,减少了一次拷贝。但在某些场景下,如需要处理数据时,sendfile()可能不够灵活。 3. **splice()和vmsplice()**:splice()和...

    14. Linux零拷贝1

    为了解决这个问题,Linux引入了`sendfile()`系统调用,它允许直接将磁盘文件内容传输到套接字,避免了数据在用户空间和内核空间之间的多次拷贝,极大地提高了文件传输的效率。`sendfile()`的工作原理是在内核内部...

    零拷贝技术

    在Linux系统中,零拷贝技术的一种实现是使用mmap()函数,它可以将内核空间的内存区域映射到用户空间,使得用户可以直接访问内核的缓冲区,从而避免了数据的复制。另一种方式是利用kio buffet,它允许在用户空间建立...

    linux zero copy mmap

    在Linux系统中,mmap机制作为一种典型的零拷贝实现方式,在网络数据包处理方面表现出了极大的优势。本文将详细探讨Linux下的零拷贝mmap技术,包括其工作原理、应用场景以及如何利用这项技术来提升网络数据包捕获和...

    零拷贝原理1

    sendfile系统调用就是一种零拷贝实现,它避免了数据从内核空间到用户空间再到内核空间的两次拷贝。在sendfile中,数据从磁盘通过DMA拷贝到内核缓冲区,然后直接通过DMA拷贝到协议引擎,减少了CPU参与的数据复制。从...

    mmap的使用说明

    当网络设备接收到数据包时,这些数据包会被拷贝到预先在内核空间分配的缓冲区中,而用户空间的程序则可以通过mmap映射的地址直接访问这些数据包。这一过程显著减少了数据包处理的延迟,提高了数据包捕获的效率。 ##...

    Linux环境下普适性零拷贝平台的研究与实现.pdf

    1. **Mmap()**:允许用户进程直接映射到内核空间的数据,如文件系统的缓冲区,避免了数据在用户空间和内核空间之间的拷贝。当数据需要在网络上传输时,可以直接将映射的内存区域传递给网络接口,减少了拷贝步骤。 2...

    Linux - 零拷贝技术.pdf

    零拷贝技术主要包含两种实现方式:mmap + write和sendfile。mmap允许用户进程映射文件到其地址空间,这样在写入时可以直接将数据写入文件,避免了数据在用户空间和内核空间之间的拷贝。sendfile则允许操作系统直接将...

    linux零拷贝技术细节

    ### Linux零拷贝技术细节 #### 一、零拷贝技术概述 零拷贝技术是一种减少数据在不同存储空间间复制的技术,目的是提高系统效率,尤其是对于网络数据处理而言尤为重要。传统的数据处理过程中,数据从网络设备到达...

    Linux 中的零拷贝技术,第 1 部分1

    当数据需要发送到网络时,可以通过sendfile()系统调用直接从文件映射区域传输到网络,避免了用户空间到内核空间的拷贝。 2. **sendfile()**:此系统调用允许内核直接将文件内容传输到网络,绕过用户空间。数据从...

    利用mmap实现文件拷贝功能

    mmap是一种 memory-mapped file 机制,允许程序直接访问磁盘文件,而不需要使用标准的文件I/O操作。这种机制可以提高文件拷贝的速度,特别是在处理大文件时。 在 Linux 系统中,mmap系统调用可以将文件映射到进程的...

Global site tag (gtag.js) - Google Analytics