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

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

相关实践学习
自建数据库迁移到云数据库
本场景将引导您将网站的自建数据库平滑迁移至云数据库RDS。通过使用RDS,您可以获得稳定、可靠和安全的企业级数据库服务,可以更加专注于发展核心业务,无需过多担心数据库的管理和维护。
Sqoop 企业级大数据迁移方案实战
Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
相关文章
|
4月前
|
监控 Linux 测试技术
C++零拷贝网络编程实战:从理论到生产环境的性能优化之路
🌟 蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕C++与零拷贝网络编程,从sendfile到DPDK,实战优化服务器性能,毫秒级响应、CPU降60%。分享架构思维,共探代码星辰大海!
|
4月前
|
机器学习/深度学习 人工智能 监控
上海拔俗AI软件定制:让技术真正为你所用,拔俗网络这样做
在上海,企业正通过AI软件定制破解通用化难题。该模式以业务场景为核心,量身打造智能解决方案,涵盖场景化模型开发、模块化架构设计与数据闭环优化三大技术维度,推动技术与业务深度融合,助力企业实现高效、可持续的数字化转型。
152 0
|
5月前
|
监控 前端开发 安全
Netty 高性能网络编程框架技术详解与实践指南
本文档全面介绍 Netty 高性能网络编程框架的核心概念、架构设计和实践应用。作为 Java 领域最优秀的 NIO 框架之一,Netty 提供了异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。本文将深入探讨其 Reactor 模型、ChannelPipeline、编解码器、内存管理等核心机制,帮助开发者构建高性能的网络应用系统。
355 0
|
边缘计算 容灾 网络性能优化
算力流动的基石:边缘网络产品技术升级与实践探索
本文介绍了边缘网络产品技术的升级与实践探索,由阿里云专家分享。内容涵盖三大方面:1) 云编一体的混合组网方案,通过边缘节点实现广泛覆盖和高效连接;2) 基于边缘基础设施特点构建一网多态的边缘网络平台,提供多种业务形态的统一技术支持;3) 以软硬一体的边缘网关技术实现多类型业务网络平面统一,确保不同网络间的互联互通。边缘网络已实现全球覆盖、差异化连接及云边互联,支持即开即用和云网一体,满足各行业需求。
477 4
|
负载均衡 网络协议 网络性能优化
动态IP代理技术详解及网络性能优化
动态IP代理技术通过灵活更换IP地址,广泛应用于数据采集、网络安全测试等领域。本文详细解析其工作原理,涵盖HTTP、SOCKS代理及代理池的实现方法,并提供代码示例。同时探讨配置动态代理IP后如何通过智能调度、负载均衡、优化协议选择等方式提升网络性能,确保高效稳定的网络访问。
1325 2
|
7月前
|
监控 算法 安全
基于 C# 基数树算法的网络屏幕监控敏感词检测技术研究
随着数字化办公和网络交互迅猛发展,网络屏幕监控成为信息安全的关键。基数树(Trie Tree)凭借高效的字符串处理能力,在敏感词检测中表现出色。结合C#语言,可构建高时效、高准确率的敏感词识别模块,提升网络安全防护能力。
179 2
|
9月前
|
机器学习/深度学习 算法 PyTorch
Perforated Backpropagation:神经网络优化的创新技术及PyTorch使用指南
深度学习近年来在多个领域取得了显著进展,但其核心组件——人工神经元和反向传播算法自提出以来鲜有根本性突破。穿孔反向传播(Perforated Backpropagation)技术通过引入“树突”机制,模仿生物神经元的计算能力,实现了对传统神经元的增强。该技术利用基于协方差的损失函数训练树突节点,使其能够识别神经元分类中的异常模式,从而提升整体网络性能。实验表明,该方法不仅可提高模型精度(如BERT模型准确率提升3%-17%),还能实现高效模型压缩(参数减少44%而无性能损失)。这一革新为深度学习的基础构建模块带来了新的可能性,尤其适用于边缘设备和大规模模型优化场景。
399 16
Perforated Backpropagation:神经网络优化的创新技术及PyTorch使用指南
|
9月前
|
调度 Python
探索Python高级并发与网络编程技术。
可以看出,Python的高级并发和网络编程极具挑战,却也饱含乐趣。探索这些技术,你将会发现:它们好比是Python世界的海洋,有穿越风暴的波涛,也有寂静深海的奇妙。开始旅途,探索无尽可能吧!
232 15
|
9月前
|
监控 算法 JavaScript
基于 JavaScript 图算法的局域网网络访问控制模型构建及局域网禁止上网软件的技术实现路径研究
本文探讨局域网网络访问控制软件的技术框架,将其核心功能映射为图论模型,通过节点与边表示终端设备及访问关系。以JavaScript实现DFS算法,模拟访问权限判断,优化动态策略更新与多层级访问控制。结合流量监控数据,提升网络安全响应能力,为企业自主研发提供理论支持,推动智能化演进,助力数字化管理。
222 4

热门文章

最新文章