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

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

相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
Sqoop 企业级大数据迁移方案实战
Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
相关文章
|
3天前
|
机器学习/深度学习 安全 网络安全
云计算与网络安全:技术融合的未来
本文深入探讨了云计算与网络安全的紧密联系,分析了云服务、网络安全和信息安全等技术领域的现状与挑战。文章首先介绍了云计算的基本概念和服务模型,然后详细讨论了网络安全的重要性以及在云计算环境中面临的安全威胁。接着,文章探讨了信息安全的关键技术和策略,最后展望了技术融合的未来发展趋势。
|
4天前
|
存储 监控 安全
云计算与网络安全:技术挑战与解决方案
【5月更文挑战第31天】本文深入探讨了云计算与网络安全的交叉领域,分析了云服务、网络安全、信息安全等技术领域的关键问题。文章首先介绍了云计算的基本概念和主要服务模型,然后详细讨论了云计算环境下的网络安全威胁和挑战,最后提出了一些有效的解决方案和技术策略。
|
4天前
|
存储 安全 网络安全
云计算与网络安全:技术融合下的挑战与机遇
传统的网络安全在云计算时代面临着新的挑战与机遇。云计算作为一种新型的计算模式,正在深刻改变着我们的生活和工作方式。本文将从云服务、网络安全、信息安全等技术领域探讨云计算与网络安全的融合,分析其中的挑战与机遇,以期为相关行业提供新的思路和解决方案。
11 0
|
4天前
|
存储 安全 网络安全
云计算与网络安全:云服务、网络安全、信息安全等技术领域的探讨
随着云计算技术的不断发展,其在各个领域的应用越来越广泛。然而,随之而来的网络安全问题也日益突出。本文将深入探讨云计算与网络安全之间的关系,重点关注云服务、网络安全和信息安全等技术领域。我们将分析云计算面临的安全挑战,并提出相应的解决方案,以确保云计算在为人们带来便利的同时,也能保障数据的安全性。
|
2天前
|
5G 安全 SDN
【计算巢】网络切片技术:5G 网络的核心创新
【6月更文挑战第2天】5G时代的变革核心技术——网络切片,如同万能钥匙,可根据不同应用场景定制专属网络服务。通过虚拟化逻辑网络,满足各类行业个性化需求,如自动驾驶的低延迟连接或远程手术的安全传输。实现网络切片涉及NFV和SDN等技术,虽面临动态管理、安全隔离等挑战,但其潜力巨大,将推动各行各业的数字化转型,成为社会进步的关键驱动力。
|
4天前
|
存储 安全 网络安全
网络安全与信息安全:保护数据安全的关键技术与意识
在数字化时代,网络安全与信息安全已经成为社会发展和个人生活中不可或缺的重要组成部分。本文探讨了网络安全漏洞、加密技术以及安全意识等方面的知识,并阐述了它们在保护数据安全中的关键作用。通过加强对网络安全与信息安全的认识与应对,我们可以更好地应对日益复杂的网络威胁,保障个人和组织的数据安全。
|
4天前
|
安全 网络安全 Python
【计算巢】防火墙技术:保护网络不受入侵的第一道防线
【5月更文挑战第31天】防火墙是网络安全的核心,防止未经授权的访问和攻击。它通过数据包过滤、状态检测和应用层网关等方式工作,阻止黑客入侵和病毒传播,限制内部网络对外部的不安全访问。然而,防火墙可能面临新型攻击的挑战,并不能完全防御内部威胁。Python 示例展示了数据包过滤规则的实现。有效的防火墙配置和管理至关重要,需随网络环境和安全需求变化而更新。防火墙需与其他安全技术结合,构建全面的网络安全体系。
|
4天前
|
安全 网络安全 区块链
【计算巢】区块链技术在网络安全中的应用与挑战
【5月更文挑战第31天】区块链技术为网络安全带来新机遇,其去中心化、不可篡改和共识机制特性有助于身份验证、数据完整性保护及提高网络抗攻击性。但面临性能、隐私保护和法规监管等挑战。简单Python代码展示了区块链在数据完整性验证的应用。随着技术发展,区块链有望在网络安全领域发挥更大作用,未来可能与其它安全技术融合,为网络安全提供更强保障。
|
4天前
|
网络协议 算法 Java
Java语言网络编程的技术性探索
Java语言网络编程的技术性探索
|
4天前
|
监控 网络协议 Java
Java语言中的网络编程技术
Java语言中的网络编程技术