智汇华云 | 零拷贝原理解析

2022-12-14 0 976

原副标题:智汇华云 | 零复本基本原理导出

什么是零复本

零复本(Zero-Copy)控制技术是指笔记本电脑继续执行操作形式时,CPU不须要参予统计数据的捡拾拷贝。这种控制技术一般来说用作互联网数据传输文档时,节约CPU周期性和缓存频宽。

现代的IO业务流程

晚期的I/O原初操作形式过程是这种的:

CPU收到命令给硬盘驱动器,接着回到;

硬盘驱动器接到命令后,将统计数据拷贝到硬盘的外部头文档,随即对CPU发动IO受阻讯号

CPU接到受阻讯号后,将头文档的读到暂存器中,再将暂存器中的统计数据载入的缓存,载入到缓存前夕CPU是难以继续执行其他各项任务

继续执行操作形式过程总的来看:

智汇华云 | 零拷贝原理解析

整座统计数据捡拾到缓存的操作形式过程中都须要CPU参予排序。假如加进以太网存储电子设备或是硬盘数据传输大批统计数据的这时候,CPU始终处在捡拾拷贝数据的操作形式过程中,将会Vertus的阻抗和客运量造成较为大的影响。

只好发明者了DMA(Direct Memory Acess)控制技术,也是间接缓存出访。单纯认知是,在硬盘和缓存展开统计数据捡拾时,这些工作会由DMA控制器展开,而不是CPU,这种能减低CPU的阻抗。继续执行操作形式过程如下表所示图:

智汇华云 | 零拷贝原理解析

能看见,整座统计数据从硬盘到缓存数据传输的操作形式过程中,CPU无须参予捡拾,全被是DMA驱动器顺利完成。晚期DMA只存有于SSD上,现如今大体上每一I/0电子设备都有自己的DMA驱动器。

假如服务器端须要有文档数据传输的机能,单纯的形式是:初始化控制系统read表达式 将硬盘文档初始化缓存,接着通过初始化控制系统write表达式将缓存统计数据所写FTP栈发送到应用程序。如下表所示图:

智汇华云 | 零拷贝原理解析

首先能看见,读硬盘文档载入到存储电子设备,一共经历了4次的用户态和内核态的切换。原因是:用户线程初始化了控制系统表达式一次read和一次write,每次控制系统初始化都须要先从用户态切换到内核态,等内核态顺利完成各项任务后,再从内核态切换回用户态。

其次,发送了4次统计数据复本,两次复本是由DMA顺利完成的,两次复本是CPU顺利完成的。

由此我们能分析出,捡拾一份统计数据存有冗余的用户态和内核态的切换以及多余的复本。所以想要提高文档数据传输性能,须要减少用户态和内核态的切换和复本次数。

如何实现零复本

能通过初始化sendfile表达式替代前面的read和write控制系统初始化,这种能减少一次控制系统初始化,也就减少了两次次用户态和内核态之间的切换开销。其次,该函数能间接把内核头文档里面的统计数据复本的socket头文档,这种就只有2次上下文切换,和3次统计数据复本。如下表所示图所示:

智汇华云 | 零拷贝原理解析

但是这个还不是真正的零复本控制技术,从内核2.4版本开始,假如存储电子设备支持SG-DMA(The Scatter-Gather Direct Memory Access),能进一步减少CPU把内核头文档里面的统计数据复本到socket头文档的操作形式过程。能通过以下命令查看存储电子设备是否支持scatter-gather特性:

只好,从内核2.4版本开始,对于存储电子设备支持SG-DMA控制技术的情况下,sendfile 控制系统初始化操作形式过程能实现CPU的零复本,整座操作形式过程如下表所示图所示:

智汇华云 | 零拷贝原理解析

这是所谓的零复本(Zero-copy)控制技术,因为我们没有在缓存层面去复本统计数据,也是说全程没有通过cpu来捡拾统计数据,所有的统计数据都是由DMA来展开数据传输的。

零复本控制技术的文档数据传输形式相比现代文档数据传输的形式,减少了两次用户态和内核态的切换和统计数据复本次数。所以总体上看,零复本控制技术能把文档的数据传输性能提高至少一倍以上。

零复本实践总结

Java提供了NIO库中的transferTo方法,go语言中的syscall包中的Sendfile都提供了间接操作形式底层零复本控制技术的能力。较为火热的kafka开源项目,也利用了零复本控制技术,大幅提升I/0客运量,这也是kafka能够处理海量统计数据的原因之一。

参考一些资料上的性能测试统计数据,同一个硬件条件下,现代文档数据传输和零复本文档数据传输性能差异,能看下图的测试统计数据图,使用零复本能缩短65%的时间。

智汇华云 | 零拷贝原理解析

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务