零拷贝技术:减少数据复制和上下文切换,提高网络传输效率(上)

拷贝,技术,减少,数据,复制,上下文,切换,提高,网络,传输,效率 · 浏览次数 : 46

小编点评

**网络传输中的零拷贝技术** 零拷贝技术在网络传输过程中发挥着重要作用,它可以提升性能和效率。 **DMA技术** DMA技术是一种直接内存访问技术,它允许应用程序将数据从内存中 directly写入到网络设备或硬盘中。这可以通过减少用户态与内核态的上下文切换次数和减少内存拷贝次数来提高性能。 **DMA技术在网络传输中的重要性** * **减少用户态与内核态的上下文切换次数:**DMA技术可以将数据读取或写入到内存中,并直接将其传输到网络设备或硬盘中,无需通过内核进行复制。 * **减少内存拷贝次数:**DMA技术可以将数据直接从内存中读取到网络设备或硬盘中,无需在内核中进行复制。 * **提高性能:**DMA技术可以显著提高网络传输的性能,因为它可以避免内核从用户空间和内核空间之间进行数据复制。 **结论** 零拷贝技术在网络传输中发挥着重要作用,可以显著提高性能和效率。通过减少用户态与内核态的上下文切换次数和减少内存拷贝次数,DMA技术可以优化网络传输过程,从而减少系统开销。

正文

零拷贝

当涉及到网络传输中的零拷贝技术时,它在提高性能和效率方面扮演着重要的角色。在之前我们已经讨论了磁盘设备管理中的零拷贝技术,其中涉及到了DMA技术。现在,让我们来深入探讨一下网络传输中零拷贝技术的实现方式以及它的重要性。

为什么要有DMA技术

在没有DMA(直接内存访问)技术之前,I/O(输入/输出)的过程相对较为繁琐。当CPU需要进行数据读取或写入时,它会发送相应的指令给磁盘控制器,然后等待返回。

磁盘控制器接收到指令后,会开始处理,并将相应的数据缓冲填充到自身的缓冲区中。一旦缓冲区被填满,磁盘控制器会产生一个中断信号,通知CPU数据已准备就绪。

CPU接收到中断信号后,会保存当前进程的上下文,并开始处理这个中断。处理中断的过程包括将磁盘控制器缓冲区中的数据取出,并放入内核缓冲区中。一旦所有数据填满内核缓冲区后,CPU会将数据放入用户缓冲区的内存中,使应用程序可以对数据进行操作。

为了更好地理解这个过程,这里有一幅图:

image

可以看到,在整个数据传输过程中,CPU需要亲自参与搬运数据的过程,而且这个过程中CPU无法同时进行其他任务。然而,CPU本应该用来处理运算而不是搬运数据。

简单的搬运几个字符数据那没问题,当我们使用千兆网卡或者硬盘传输大量数据时,如果仍然让CPU来搬运数据,显然CPU会忙不过来。为了解决这个问题,计算机科学家们发明了DMA技术,即直接内存访问(Direct Memory Access)技术。

什么是DMA技术?大家肯定知道了一些,我在简单提一下吧。DMA技术的简单理解就是,在进行IO设备和内存之间的数据搬运时,尽量交给DMA控制器来完成,这样CPU就可以在搬运过程中继续处理其他任务,不再参与与数据搬运相关的工作。通过使用DMA控制器进行数据传输,CPU可以去处理其他事务。

那么,具体来看DMA控制器进行数据传输的过程是怎样的呢?下面我们来详细了解一下。

image

具体过程如下:

  1. 应用程序调用read方法时,发送一个IO请求给操作系统,请求将数据读取到自己的用户缓冲区中,此时进程开始阻塞等待数据。
  2. CPU告诉DMA控制器将数据写入到哪个内存地址,并将请求发送给DMA控制器,此时CPU可以继续进行其他任务。
  3. DMA控制器将请求指令发送给磁盘控制器。
  4. 磁盘控制器接收到指令后进行处理,将数据填充到数据缓冲区中,并发送中断信号给DMA控制器,通知其开始取数据。
  5. DMA控制器开始将磁盘控制器缓冲区中的数据拷贝到内核缓冲区中。在此过程中,CPU并不参与搬运数据的工作,而是忙于处理其他任务。
  6. 当DMA控制器将数据写入到内核缓冲区中足够多时,会发送一个中断信号给CPU,此时CPU才会介入,将数据从内核缓冲区拷贝到用户缓冲区(用户态中)。
  7. 系统调用返回,用户进程等待进行各种算法处理,然后再次被CPU调度。

可以看到,在整个数据传输过程中,CPU不再参与数据搬运的工作,而是由DMA控制器全程完成。然而,CPU在这个过程中仍然不可或缺,因为它需要告诉DMA控制器传输哪些数据,从何处传输到何处。

在早期的计算机系统中,DMA控制器主要存在于主板上。但是随着技术的发展,I/O设备的数量和种类不断增加,为了满足各种不同的数据传输需求,每个I/O设备中通常都会包含自己的DMA控制器。例如:网卡:例如以太网网卡,它负责将计算机连接到网络。网卡内部通常包含一个DMA控制器,用于将数据从网络传输到内存或从内存传输到网络。硬盘驱动器:硬盘驱动器中的控制器通常包含一个DMA控制器,用于将数据从硬盘传输到内存或从内存传输到硬盘。

传统的文件传输有多糟糕?

如果服务端需要提供文件传输功能,我们可以考虑以下最简单的方式来实现:首先,从磁盘读取文件内容,然后通过网络协议将文件内容发送给客户端。

传统的文件传输方式在性能方面存在一些问题。首先,传统的I/O过程中,数据的读取和写入需要经过用户空间和内核空间之间的复制,这会导致额外的开销和延迟。其次,数据的读取和写入是通过操作系统层面的I/O接口来完成的,这也会增加一定的系统开销。此外,传统的文件传输方式需要进行多次系统调用,包括读取文件内容和写入网络报文,这也会增加系统的负担和延迟。
通常情况下,文件传输功能的代码如下所示,通常会涉及到两个系统调用:

// 伪代码如下:
// 读取文件内容:read(file)
// 将文件内容写入符合要求的报文中:write(socket)

尽管代码只有两行,但是其中发生了许多重要的操作。我们看下:

image

首先,这段代码中发生了4次用户态与内核态的上下文切换。由于涉及两次系统调用(read()和write()),因此每次系统调用都需要从用户态切换到内核态,并在内核完成任务后再切换回用户态。

上下文切换的成本并不小,每次切换需要耗费几十纳秒到几微秒的时间。虽然单个切换时间很短,但在高并发的场景下,这种时间很容易被累积和放大,从而影响系统的性能。

其次,还发生了4次数据拷贝操作。其中两次是通过DMA(直接内存访问)进行的拷贝,另外两次则是通过CPU进行的拷贝。具体过程如下:

  1. DMA将数据从磁盘中拷贝到内核态的数据缓冲区;
  2. CPU接收到DMA控制器的中断信号后,将数据从内核缓冲区拷贝到用户缓冲区;
  3. 用户缓冲区的数据可能会被应用程序操作后直接发送或写入,再次由CPU拷贝到内核的socket缓冲区;
  4. DMA控制器再将socket缓冲区的数据拷贝到网卡上。

我们回过头看这个文件传输的过程,我们只是搬运一份数据,结果却搬运了 4 次,过多的数据拷贝无疑会消耗 CPU 资源,大大降低了系统性能。

我们可以看到,在文件传输的过程中,我们只需要搬运一份数据,但实际却进行了4次数据拷贝。过多的数据拷贝无疑会消耗CPU资源,大大降低系统性能。

这种简单且传统的文件传输方式存在冗余的上下文切换和数据拷贝操作,对于高并发系统而言非常糟糕。这些不必要的开销严重影响系统性能。因此,要提高文件传输的性能,我们需要减少用户态与内核态的上下文切换次数以及内存拷贝次数。

总结

在本次讨论中,我们确实只是提到了DMA技术在文件传输过程中的重要作用,并对零拷贝技术进行了简要介绍。然而,网络传输中存在的问题和优化方法是一个庞大的话题,涉及到诸多方面。因此,我决定将这些问题的详细讨论留到下一篇文章中,以便更全面地探讨网络传输的优化。我希望通过这样的讨论,能够为读者提供有益的信息和思路,感谢大家的阅读和关注,期待在下一篇文章中与大家再次交流和分享关于网络传输的优化问题。

与零拷贝技术:减少数据复制和上下文切换,提高网络传输效率(上)相似的内容:

零拷贝技术:减少数据复制和上下文切换,提高网络传输效率(上)

在本次讨论中,我们确实只是提到了DMA技术在文件传输过程中的重要作用,并对零拷贝技术进行了简要介绍。然而,网络传输中存在的问题和优化方法是一个庞大的话题,涉及到诸多方面。因此,我决定将这些问题的详细讨论留到下一篇文章中,以便更全面地探讨网络传输的优化。我希望通过这样的讨论,能够为读者提供有益的信息和思路,感谢大家的阅读和关注,期待在下一篇文章中与大家再次交流和分享关于网络传输的优化问题。

零拷贝技术:减少数据复制和上下文切换,提高网络传输效率(下)

本章节主要讨论了如何通过零拷贝技术来优化文件传输的性能。零拷贝技术主要通过减少用户态和内核态之间的上下文切换次数和数据拷贝次数来提高性能。具体来说,介绍了两种实现零拷贝的方式:mmap + write和sendfile。使用mmap + write可以减少一次数据拷贝过程,而使用sendfile系统调用可以进一步减少系统调用和数据拷贝次数。此外,还介绍了如果网卡支持SG-DMA技术,可以通过DMA将数据直接拷贝到网卡缓冲区,实现真正的零拷贝。通过这些优化方法,可以显著提高文件传输的性能。

零拷贝并非万能解决方案:重新定义数据传输的效率极限

本文讨论了零拷贝在优化数据传输效率方面的局限性。尽管零拷贝技术在减少数据传输过程中的内存拷贝次数方面有很大的优势,但它并非适用于所有情况。文章介绍了一些其他的优化方法,如异步I/O和直接I/O的组合、根据文件大小选择不同的优化方式。至此,我们的计算机基础专栏就结束了,不知道大家有没有发现,操作系统底层提供了丰富的解决方案来支持应用程序的复杂性和可扩展性。对于任何工作中遇到的问题,我们都可以从操作系统的角度寻找解决方法。

[转帖]sendfile“零拷贝”、mmap内存映射、DMA

https://www.jianshu.com/p/7863667d5fa7 KAFKA推送消息用到了sendfile,落盘技术用到了mmap,DMA贯穿其中。 先说说零拷贝 零拷贝并不是不需要拷贝,而是减少不必要的拷贝次数。通常是说在IO读写过程中。 实际上,零拷贝是有广义和狭义之分,目前我们通常

科大讯飞:说说零拷贝技术和多路复用技术?

零拷贝技术和多路复用技术是现代计算机系统和网络编程中两项重要的优化手段,旨在提高数据处理和传输的效率。如高性能框架 Netty 中,即使用了零拷贝技术又使用了多路复用技术,同时来保证 Netty 框架的高性能运行。 1.零拷贝技术 零拷贝(Zero-copy)技术是一种计算机操作系统中用于提高数据传

美团面试:说说Netty的零拷贝技术?

零拷贝技术(Zero-Copy)是一个大家耳熟能详的技术名词了,它主要用于提升 IO(Input & Output)的传输性能。 那么问题来了,为什么零拷贝技术能提升 IO 性能? 1.零拷贝技术和性能 在传统的 IO 操作中,当我们需要读取并传输数据时,我们需要在用户态(用户空间)和内核态(内核空

[转帖]Linux中的零拷贝技术

https://www.jianshu.com/p/a757a93b6e5f 内存映射--mmap 内核和用户空间,共享内存。数据copy到内核区后,只需要把地址共享给应用程序即可,无需再copy一次数据到用户空间。 image.png 优点: 用户程序可以读取和修改共享内存的数据,就像读取用户空间

[转帖]从Linux零拷贝深入了解Linux-I/O

https://aijishu.com/a/1060000000375591 作者:kevineluo,腾讯 CSIG 后台开发工程师 本文将从文件传输场景以及零拷贝技术深究 Linux I/O 的发展过程、优化手段以及实际应用。 前言 存储器是计算机的核心部件之一,在完全理想的状态下,存储器应该要

从Linux零拷贝深入了解I/O

转载&学习文章:从Linux零拷贝深入了解I/O 本文将从文件传输场景以及零拷贝技术深究 Linux I/O 的发展过程、优化手段以及实际应用。 前言 存储器是计算机的核心部件之一,在完全理想的状态下,存储器应该要同时具备以下三种特性: 速度足够快:存储器的存取速度应当快于 CPU 执行一条指令,这

Kafka为什么这么快?

Kafka 是一个基于发布-订阅模式的消息系统,它可以在多个生产者和消费者之间传递大量的数据。Kafka 的一个显著特点是它的高吞吐率,即每秒可以处理百万级别的消息。那么 Kafka 是如何实现这样高得性能呢?本文将从七个方面来分析 Kafka 的速度优势。 - 零拷贝技术 - 仅可追加日志结构 -