Zore copy(翻译《Efficient data transfer through zero copy》)

简介: 原文:https://www.ibm.com/developerworks/library/j-zerocopy/   《Efficient data transfer through zero copy》 本文描述通过一种叫做Zore Copy的技术来提升运行在Linux和UNIX上的Java程序的IO性能。

原文:https://www.ibm.com/developerworks/library/j-zerocopy/

 

《Efficient data transfer through zero copy

本文描述通过一种叫做Zore Copy的技术来提升运行在Linux和UNIX上的Java程序的IO性能。

Zero copy避免冗余的数据拷贝并减少用户态和内核态之间的上下文切换。

 

很多WEB应用都服务大量的静态文件,这些静态文件大多从磁盘读取并返回到socket中。这些操作需要相对较少的CPU,但是比较低效:kernel读取磁盘数据并通过用户态返回给应用,之后应用通过用户态把数据写到socket。事实上,应用作为一个低消的中间介质将数据从磁盘读取并返回给socket。

 

每一次通过用户态的数据传输,数据都必须要被复制,并且消耗CPU核内存带宽。幸运的是可以通过zore copy来减少拷贝次数。使用zore copy要求内核直接从磁盘复制数据并写入socket,而不通过应用程序。Zero copy减少用户态和内核态的上下文切换,减少拷贝次数来提升性能。

 

Java类库通过Linux和UNIX系统的tranferTo()来支持zore copy。可以通过transferTo()方法直接从一个channel写到目标channel,并不需要数据通过应用程序。本文首先说明用传统方法传输简单文件的过高开销,然后展示如何通过zore copy的transferTo()方法来获得更好的性能。

 

Data transfer: Thre traditional approach

考虑读取一个文件并通过网络传输到另一个程序,其核心的操作如list 1中所示。

 

File.read(fileDesc, buf, len);

Socket.send(socket, buf, len);

 

主要就是读取文件内容到buffer中,之后将buffer数据发送到socket

下图展示整个过程中数据的拷贝:

下图展示整个过程中上下文的切换:

 

过程如下:

  1. read()函数调用导致了一次用户态到内核态的上下文切换。系统内部的sys_read()调用被用于把数据读取出来。第一次复制是以DMA引擎的方式呈现的,DMA把数据读取出来并存入kernel address space buffer
  2. 数据被读取返回后导致了上下文从内核态切换到用户态,现在数据存在user address space buffer中。
  3. send()操作再次把上下文从用户态切换到内核态。并且数据被从用户缓存拷贝到kernel address space buffer中。
  4. send()操作返回,这时又从内核态返回到用户态,并且发生最后一次数据拷贝,数据从kernel buffer拷贝到protocol engine中。

传统的方式一共出现了4次数据拷贝和上下文切换(每一次系统调用都是两次上下文切换:用户态->内核态->用户态)。

 

中间kernel buffer的使用时低效的。kernel buffer预期是用于提升性能的,当数据大小没有达到buffer大小时,kernel buffer作为“预读取”的角色提升性能。在写的时候buffer允许异步完成操作。

不幸的是,如果请求数据比buffer还大,那么这个方式本身就会成为瓶颈。数据需要在磁盘,kernel buffer,user buffer间多次拷贝才能到达应用程序。

Zero Copy通过减少不必要的数据拷贝来提升性能。

 

Data transfer: The zero-copy approach

回顾传统的方式,第二次和第三次复制是不必要的(从buffer到应用程序、从应用程序到buffer),应用程序并没有改变数据内容,只是将其返回到socket buffer中。transferTo实现了数据直接共read buffer到write buffer

 

public void transferTo(long position, long count, WritableByteChannel target);

 

transferTo方法吧数据从file channel传输到

下图展示了通过transferTo()方法中的数据拷贝:

 

下图展示了通过transferTo()方法中间的上下文切换:

 

调用transferTo方法是发生的步骤如下:

  1. transferTo()调用使文件内容通过DMA的方式被复制到read buffer。然后将数据复制到与输出的socket相关的buffer中。
  2. 第三次复制发生在DMA将数据复制到protocol engine

整个过程相对于传统方式减少了两次上下文切换和一次数据拷贝。

但这还没有达到zero-copy的目标。如果底层网络接口支持,我们可以进一步减少数据拷贝。在Linux内核2.4及之后版本,socket buffer支持了这种方式:

  1. transferTo方法调用使文件内容通过DMA引擎被复制到kernel buffer
  2. 无数据被复制到socket buffer。只是描述了需要被写入的数据的位置和长度。DMA引擎直接把数据从kernel buffer复制到protocol engine

整个过程现在只有两次上下文切换和两次数据拷贝。

 

两种方式的性能对比:

 

 

 

 

 

如果本文对您有帮助,点一下右下角的“推荐”
目录
相关文章
|
7月前
|
算法 C++ 容器
【C++11算法】find_if_not、 copy_if、copy_n
【C++11算法】find_if_not、 copy_if、copy_n
139 0
|
机器学习/深度学习 自然语言处理 算法
ACL 2019 - AMR Parsing as Sequence-to-Graph Transduction
我们提出了一个基于注意力的模型,将AMR解析视为序列到图的转导。与大多数依赖于预训练的对齐器、外部语义资源或数据扩充的AMR解析器不同
156 0
ACL 2019 - AMR Parsing as Sequence-to-Graph Transduction
|
机器学习/深度学习 自然语言处理 搜索推荐
TSAR: A Two-Stream AMR-enhanced Model for Document-level Event Argument Extraction论文解读
以往的研究大多致力于从单个句子中抽取事件,而文档级别的事件抽取仍未得到充分的研究。在本文中,我们专注于从整个文档中抽取事件论元
215 0
|
人工智能 自然语言处理 BI
CLIP-Event: Connecting Text and Images with Event Structures 论文解读
视觉-语言(V+L)预训练模型通过理解图像和文本之间的对齐关系,在支持多媒体应用方面取得了巨大的成功。
141 0
|
机器学习/深度学习 自然语言处理 测试技术
Query and Extract Refining Event Extraction as Type-oriented Binary Decoding 论文解读
事件抽取通常被建模为一个多分类问题,其中事件类型和论元角色被视为原子符号。这些方法通常仅限于一组预定义的类型。
75 0
|
机器学习/深度学习 自然语言处理 数据可视化
M2E2: Cross-media Structured Common Space for Multimedia Event Extraction 论文解读
我们介绍了一个新的任务,多媒体事件抽取(M2E2),旨在从多媒体文档中抽取事件及其参数。我们开发了第一个基准测试
112 0
《Constrained Output Embeddings for End-to-End Code-Switching Speech Recognition with Only Monolingual Data》电子版地址
Constrained Output Embeddings for End-to-End Code-Switching Speech Recognition with Only Monolingual Data
80 0
《Constrained Output Embeddings for End-to-End Code-Switching Speech Recognition with Only Monolingual Data》电子版地址
《Audio Tagging with Compact Feedforward Sequential Memory Network and Audio-to-Audio Ratio Based Data Augmentation》电子版地址
Audio Tagging with Compact Feedforward Sequential Memory Network and Audio-to-Audio Ratio Based Data Augmentation
84 0
《Audio Tagging with Compact Feedforward Sequential Memory Network and Audio-to-Audio Ratio Based Data Augmentation》电子版地址
|
算法 开发者
关于 加载图片"Corrupt JPEG data: premature end of data segment" 的解决方法
关于 加载图片"Corrupt JPEG data: premature end of data segment" 的解决方法
关于 加载图片"Corrupt JPEG data: premature end of data segment" 的解决方法
Data Structures and Algorithms (English) - 7-8 File Transfer(25 分)
Data Structures and Algorithms (English) - 7-8 File Transfer(25 分)
111 0