零拷贝技术及其运用
- 格式:doc
- 大小:66.00 KB
- 文档页数:9
⼀⽂彻底弄懂零拷贝原理以及java实现⽬录零拷贝传统I/O操作存在的性能问题零拷贝技术原理虚拟内存mmap/write ⽅式sendfile ⽅式带有 scatter/gather 的 sendfile⽅式splice ⽅式总结零拷贝零拷贝(Zero-Copy)是⼀种 I/O 操作优化技术,可以快速⾼效地将数据从⽂件系统移动到⽹络接⼝,⽽不需要将其从内核空间复制到⽤户空间。
其在 FTP 或者 HTTP 等协议中可以显著地提升性能。
但是需要注意的是,并不是所有的操作系统都⽀持这⼀特性,⽬前只有在使⽤ NIO 和 Epoll 传输时才可使⽤该特性。
需要注意,它不能⽤于实现了数据加密或者压缩的⽂件系统上,只有传输⽂件的原始内容。
这类原始内容也包括加密了的⽂件内容。
传统I/O操作存在的性能问题如果服务端要提供⽂件传输的功能,我们能想到的最简单的⽅式是:将磁盘上的⽂件读取出来,然后通过⽹络协议发送给客户端。
传统 I/O 的⼯作⽅式是,数据读取和写⼊是从⽤户空间到内核空间来回复制,⽽内核空间的数据是通过操作系统层⾯的 I/O 接⼝从磁盘读取或写⼊。
代码通常如下,⼀般会需要两个系统调⽤:read(file, tmp_buf, len);write(socket, tmp_buf, len);代码很简单,虽然就两⾏代码,但是这⾥⾯发⽣了不少的事情。
⾸先,期间共发⽣了 4 次⽤户态与内核态的上下⽂切换,因为发⽣了两次系统调⽤,⼀次是 read() ,⼀次是 write(),每次系统调⽤都得先从⽤户态切换到内核态,等内核完成任务后,再从内核态切换回⽤户态。
上下⽂切换到成本并不⼩,⼀次切换需要耗时⼏⼗纳秒到⼏微秒,虽然时间看上去很短,但是在⾼并发的场景下,这类时间容易被累积和放⼤,从⽽影响系统的性能。
其次,还发⽣了 4 次数据拷贝,其中两次是 DMA 的拷贝,另外两次则是通过 CPU 拷贝的,下⾯说⼀下这个过程:第⼀次拷贝,把磁盘上的数据拷贝到操作系统内核的缓冲区⾥,这个拷贝的过程是通过 DMA 搬运的。
Linux 中的零拷贝技术概述黄晓晨, 软件工程师, IBM黄晓晨,IBM system Z 自动化技术支持软件工程师。
冯瑞, 软件工程师, IBM简介:本系列由两篇文章组成,介绍了当前用于Linux 操作系统上的几种零拷贝技术,简单描述了各种零拷贝技术的实现,以及它们的特点和适用场景。
本文是本系列文章的第一部分,主要是介绍一些零拷贝技术的相关背景知识,简要概述了Linux 为什么需要零拷贝技术以及Linux 中都有哪几种零拷贝技术。
引言传统的Linux 操作系统的标准I/O 接口是基于数据拷贝操作的,即I/O 操作会导致数据在操作系统内核地址空间的缓冲区和应用程序地址空间定义的缓冲区之间进行传输。
这样做最大的好处是可以减少磁盘I/O 的操作,因为如果所请求的数据已经存放在操作系统的高速缓冲存储器中,那么就不需要再进行实际的物理磁盘I/O 操作。
但是数据传输过程中的数据拷贝操作却导致了极大的CPU 开销,限制了操作系统有效进行数据传输操作的能力。
零拷贝(zero-copy )这种技术可以有效地改善数据传输的性能,在内核驱动程序(比如网络堆栈或者磁盘存储驱动程序)处理I/O 数据的时候,零拷贝技术可以在某种程度上减少甚至完全避免不必要CPU 数据拷贝操作。
现代的CPU 和存储体系结构提供了很多特征可以有效地实现零拷贝技术,但是因为存储体系结构非常复杂,而且网络协议栈有时需要对数据进行必要的处理,所以零拷贝技术有可能会产生很多负面的影响,甚至会导致零拷贝技术自身的优点完全丧失。
为什么需要零拷贝技术如今,很多网络服务器都是基于客户端- 服务器这一模型的。
在这种模型中,客户端向服务器端请求数据或者服务;服务器端则需要响应客户端发出的请求,并为客户端提供它所需要的数据。
随着网络服务的逐渐普及,video 这类应用程序发展迅速。
当今的计算机系统已经具备足够的能力去处理video 这类应用程序对客户端所造成的重负荷,但是对于服务器端来说,它应付由video 这类应用程序引起的网络通信量就显得捉襟见肘了。
Linux 中的直接I/O如果应用程序可以直接访问网络接口存储,那么在应用程序访问数据之前存储总线就不需要被遍历,数据传输所引起的开销将会是最小的。
应用程序或者运行在用户模式下的库函数可以直接访问硬件设备的存储,操作系统内核除了进行必要的虚拟存储配置工作之外,不参与数据传输过程中的其它任何事情。
直接I/O 使得数据可以直接在应用程序和外围设备之间进行传输,完全不需要操作系统内核页缓存的支持。
关于直接I/O 技术的具体实现细节可以参看developerWorks 上的另一篇文章”Linux 中直接I/O 机制的介绍” ,本文不做过多描述。
图 1. 使用直接I/O 的数据传输针对数据传输不需要经过应用程序地址空间的零拷贝技术利用mmap()在Linux 中,减少拷贝次数的一种方法是调用mmap() 来代替调用read,比如:首先,应用程序调用了mmap() 之后,数据会先通过DMA 拷贝到操作系统内核的缓冲区中去。
接着,应用程序跟操作系统共享这个缓冲区,这样,操作系统内核和应用程序存储空间就不需要再进行任何的数据拷贝操作。
应用程序调用了write() 之后,操作系统内核将数据从原来的内核缓冲区中拷贝到与socket 相关的内核缓冲区中。
接下来,数据从内核socket 缓冲区拷贝到协议引擎中去,这是第三次数据拷贝操作。
图 2. 利用mmap() 代替read()通过使用mmap() 来代替read(), 已经可以减半操作系统需要进行数据拷贝的次数。
当大量数据需要传输的时候,这样做就会有一个比较好的效率。
但是,这种改进也是需要代价的,使用mma()p 其实是存在潜在的问题的。
当对文件进行了内存映射,然后调用write() 系统调用,如果此时其他的进程截断了这个文件,那么write() 系统调用将会被总线错误信号SIGBUS 中断,因为此时正在执行的是一个错误的存储访问。
这个信号将会导致进程被杀死,解决这个问题可以通过以下这两种方法:1.为SIGBUS 安装一个新的信号处理器,这样,write() 系统调用在它被中断之前就返回已经写入的字节数目,errno 会被设置成success。
高性能IO背后原理-零拷贝(zerocopy)技术概述预备知识关于I/O内存映射。
设备通过控制总线,数据总线,状态总线与CPU相连。
控制总数传送控制信号。
在传统的操作中,都是通过读写设备寄存器的值来实现。
但是这样耗费了CPU时钟。
而且每取一次值都要读取设备寄存器,造成了效率的低下。
在现代操作系统中。
引用了I/O内存映射。
即把寄存器的值映身到主存。
对设备寄存器的操作,转换为对主存的操作,这样极大的提高了效率。
关于DMA传统的处理方法为:当设备接收到数据,向CPU报告中断。
CPU处理中断,CPU把数据从设备的寄存器数据读到内存。
在现代操作系统中引入的DMA设备,设备接收到数据时,把数据放至DMA内存,再向CPU产生中断。
这样节省了大量的CPU时间什么是零拷贝?零拷贝描述的是CPU不执行拷贝数据从一个存储区域到另一个存储区域的任务,这通常用于通过网络传输一个文件时以减少CPU周期和内存带宽。
避免数据拷贝避免操作系统内核缓冲区之间进行数据拷贝操作。
避免操作系统内核和用户应用程序地址空间这两者之间进行数据拷贝操作。
用户应用程序可以避开操作系统直接访问硬件存储。
零拷贝给我们带来的好处减少甚至完全避免不必要的CPU拷贝,从而让CPU解脱出来去执行其他的任务减少内存带宽的占用通常零拷贝技术还能够减少用户空间和操作系统内核空间之间的上下文切换零拷贝完全依赖于操作系统。
操作系统支持通过sendfile实现的零拷贝I/Osendfile(socket, file, len);//file可以是文件句柄,也可以是socket句柄把文件数据通过网络发送出去,减少了上下文的切换,内核的缓存数据到直接网卡数据也不用CPU去复制,由DMA完成第1步发出sendfile系统调用,导致用户空间到内核空间的上下文切换(第一次上下文切换)。
第2步通过DMA将磁盘文件中的内容拷贝到内核空间缓冲区中(第一次拷贝: hard driver ——>kernel buffer)。
程序员面试之零拷贝技术解析Hey guys,这里是程序员cxuan,欢迎你收看我最新一期的文章,这篇文章给大家分享一篇非常优质的文章-零拷贝技术,零拷贝技术也是面试常考的一个点,比较重要,而这篇文章恰好的解决了所有的疑惑,推荐给你。
1.数据的四次拷贝与四次上下文切换很多应用程序在面临客户端请求时,可以等价为进行如下的系统调用:1.File.read(file,buf,len);2.Socket.send(socket,buf,len);例如消息中间件Kafka就是这个应用场景,从磁盘中读取一批消息后原封不动地写入网卡(NIC,Network interface controller)进行发送。
在没有任何优化技术使用的背景下,操作系统为此会进行4次数据拷贝,以及4次上下文切换,如下图所示:如果没有优化,读取磁盘数据,再通过网卡传输的场景性能比较差:4次copy:1.CPU负责将数据从磁盘搬运到内核空间的Page Cache中;2.CPU负责将数据从内核空间的Socket缓冲区搬运到的网络中;3.CPU负责将数据从内核空间的Page Cache搬运到用户空间的缓冲区;4.CPU负责将数据从用户空间的缓冲区搬运到内核空间的Socket缓冲区中;4次上下文切换:1.read系统调用时:用户态切换到内核态;2.read系统调用完毕:内核态切换回用户态;3.write系统调用时:用户态切换到内核态;4.write系统调用完毕:内核态切换回用户态;我们不免发出抱怨:1.CPU全程负责内存内的数据拷贝还可以接受,因为效率还算可以接受,但是如果要全程负责内存与磁盘、网络的数据拷贝,这将难以接受,因为磁盘、网卡的速度远小于内存,内存又远远小于CPU;2.4次copy太多了,4次上下文切换也太频繁了;2.DMA参与下的数据四次拷贝DMA技术很容易理解,本质上,DMA技术就是我们在主板上放一块独立的芯片。
在进行内存和I/O设备的数据传输的时候,我们不再通过CPU 来控制数据传输,而直接通过DMA控制器(DMA Controller,简称DMAC)。
14622010,31(7)计算机工程与设计Computer Engineering and Design0引言由于网络开始充斥着生活的每一个角落,越来越多的网络业务也开始层出不穷的出现在人们面前,在线电视,网上聊天,电子商务等,对于电信运营商来说与日俱增的带宽压力是目前最需要解决的问题,而在可利用的带宽资源里面,又有很大的一部分被BT ,电驴等P2P 业务大量吞噬,在这种网络环境下面,网络行为管理系统应运而生。
网络行为分析系统架设在互联网出口,对网内所有计算机的网络行为进行分析、调整和管理。
它要对所有流经系统的IP 数据包进行分析,在千兆乃至万兆的网络环境里面,这个工作量是相当繁重的。
因此,如何对高速数据流进行处理是提升网络行为分析系统性能的关键点之一。
本文中的网络行为分析系统设计时采用Linux 操作系统,因为操作系统对内存的保护,用户程序无法直接读写处于内核空间的数据,如果无法高效的解决这个问题,必然会影响到网络行为管理系统的吞吐量和时延等性能。
本文从千兆网络环境下网络行为分析系统的性能瓶颈出发,分析了现有的解决方案,在与现有技术比较的基础上采用一种改进型的零拷贝技术,实现网络行为分析系统性能上的优化。
1网络行为分析系统的介绍我们设计的网络行为分析系统采用freescale 公司的MPC8572E 网络处理器,该处理器带有TLU (查找表单元)和PME (模式匹配引擎)两个硬件模块,适用于高速网络环境下网络协议的分析处理[1],操作系统采用Linux 。
系统采用DPI 即深度包检测技术,该技术深入到数据包的应用层来进行协议的识别、分析。
系统软件可以分为数据平面和识别平面两部分。
数据平面负责捕获网络数据包,在对网络数据包进行解包、会话流跟踪、统计后有选择的将网络数据包送往识别模块的PME 处理,选择的依据是判断该会话流是否已经被识别,如无则发送到PME 模块,同时数据平面也要负责转发网络数据包;识别平面主要是对网络数据进行业务、协议的识别等,在本文中不为讨论重点。
多源零拷贝技术在数据存储中起到了怎样的作用? 在互联网、云计算、AI、大数据等新智能应用驱动的新数据时代下,数据存储作为一切其他数据行为的基础,扮演着越来越重要的角色。
浪潮软件定义存储AS13000通过模块化定义的方式,基于多源零拷贝技术实现多应用高效共享一套存储系统,提高数据应用效率。
云计算、大数据、AI、物联网等各种新智能应用不断涌现,带来数据需求的改变。
文件、对象等数据类型需求增多。
一方面,传统的文件系统存储服务正被企业广泛应用;另一方面,有着鲜明的互联网、大数据时代特点对象存储,也越来越受到互联网用户青睐。
每一种存储分别对应不同的访问协议,文件存储主要操作对象是文件和文件夹,例如NFS协议;对象存储协议则主要为S3、Swift。
浪潮软件定义存储AS13000的优势即在于,通过模块化定义的方式,实现了在同一存储系统中可以同时支持文件、对象等多种存储协议,让用户通过一套存储系统即可支持企业各种应用访问存储数据,大大节省TCO。
1什幺是对象存储? 对象存储是一种新的采用扁平数据的组织形式,并提供基于HTTP协议的RESTful接口访问的分布式存储系统。
它适用于一次写入,多次读取的非结构化数据存储的需求场景,例如文档、图像、视频等网络媒体文件。
在云计算与大数据时代,对象存储发展迅猛。
不过,目前业界的同类存储产品,每种存储系统只能提供1种或2种存储协议。
对于新增对象存储需求的用户,这就要求在多应用环境中必须部署2套或2套以上的存储系统,无疑增加了用户的初始投资,且增大了后期维护和管理的难度。
浪潮软件定义存储AS13000则通过所提供的多源零拷贝技术,实现了在线存储和大数据分析存储的统一融合。
企业的各种应用在存取数据时,无需在存储集群间进行数据拷贝,而是通过文件系统方便地访问对象存储的数据,同时还可以高效实现大数据的分析和挖掘。
2对象存储:通过多源零拷贝技术,共享一套存储 多源零拷贝技术,是通过对NFS协议、HDFS文件协议和S3/Swift对象协议多种存储协议的融合,来实现多应用存取数据共享一套存储系统的先进技术。
rocketmq零拷贝原理一、零拷贝技术概述零拷贝技术是一种高效且可靠的数据传输方式。
通过减少不必要的数据拷贝操作,降低了CPU负载和内存使用,从而提升了传输效率与吞吐率。
在消息系统中,传输效率和吞吐率都是关键指标,因此零拷贝技术被广泛应用于消息传输领域。
而RocketMQ作为一款优秀的消息队列软件,在实现高效传输的过程中也运用了零拷贝技术。
二、RocketMQ零拷贝原理在消息队列中,数据往往需要从生产者发送到消费者。
在传输过程中,如果每次都需要先将数据从内存中拷贝至操作系统内核空间,再从内核空间拷贝至接收缓冲区,最后再拷贝至用户空间,这种数据复制机制就会导致CPU的负载增加,同时也会占用大量内存。
而利用零拷贝技术,可以减少或者避免这种数据拷贝过程,从而提高传输效率。
RocketMQ的零拷贝原理是基于操作系统中的mmap技术实现的。
mmap是内核提供的一种在用户空间和内核空间之间共享内存的技术,可以将文件映射至内存中,从而实现文件与内存之间的数据交互。
在RocketMQ中,生产者和消费者都会利用mmap技术将消息内容映射到内存中。
具体过程如下:1. 生产者将待发送的消息写入内存中的writeBuffer,该buffer是基于堆内存的,即基于JVM内存的。
2. 生产者将writeBuffer中的待发送消息拷贝至直接内存中的sendBuffer。
这里直接内存指的是通过JVM提供的ByteBuffer.allocateDirect()方法所分配的内存区域,这种内存区域不受JVM垃圾回收机制的影响。
直接内存的好处在于可以减少数据拷贝的次数和内存使用量,从而提高了发送效率和性能。
3. 生产者将sendBuffer中的数据通过网络协议发送至RocketMQ服务器。
4. 服务器接收到消息后,将消息存储于磁盘上,并返回持久化消息的物理存储位置。
此时,生产者的sendBuffer中的消息实际上在内存中没有被删除,还可以供其他消息消费者使用。
零拷贝技术及其运用Zero-Copy Technique and its Usage李星辰夏浩茗廖山河Li Xingchen,Xia Haoming and Liao Shanhe摘要:零拷贝(zero-copy)是实现主机或路由器等设备高速网络接口的主要技术。
零拷贝技术通过减少或消除关键通信路径影响速度的操作,降低数据传输的操作系统开销和协议处理开销,从而有效提高通信性能,实现高速数据传输。
Abstract: Zero-copy is an important technology to realize high-speed network interfacing forhosts and routers. It achieves high-speed data transfer through decreasing the overhead ofdata transm issioncaused by the operating system and transm ission protocols. Itsmain idea is to reduce orelim inate somemanipulations that affect speed in the critical transm ission path.关键词: 零拷贝; 高速网络接口; 操作系统; 协议; 网络处理器; RAID;Keywords: zero-copy; high-speed network interfacing; OS; protocol;network conductor;RAID1引言新的应用需求如多媒体、VOD以及WEB服务等加重了通信负载,要求网络具有更多的带宽和更短的传输延迟。
高速网络链路技术(SDH、光互连等)的发展提供了高带宽的网络。
信息传输更加关注数据从主机或其他设备到网络接口的有效移动。
零拷贝技术可以减少数据拷贝和共享总线操作的次数,消除通信数据在存储器之间不必要的中间拷贝过程,有效地提高通信效率,是设计高速接口通道、实现高速服务器和路由器的关键技术之一。
零拷贝(zero-copy)原理详解前置概念⽤户空间与内核空间CPU 将指令分为特权指令和⾮特权指令,对于危险指令,只允许操作系统及其相关模块使⽤,普通应⽤程序只能使⽤那些不会造成灾难的指令。
⽐如 Intel 的 CPU 将特权等级分为4 个级别:Ring0~Ring3。
其实 Linux 系统只使⽤了 Ring0 和 Ring3 两个运⾏级别(Windows 系统也是⼀样的)。
当进程运⾏在 Ring3 级别时被称为运⾏在⽤户态,⽽运⾏在 Ring0 级别时被称为运⾏在内核态。
简单来说:内核空间和⽤户空间本质上是要提⾼操作系统的稳定性及可⽤性,当进程运⾏在内核空间时就处于内核态,当进程运⾏在⽤户空间时就处于⽤户态。
DMA(直接存储器访问)DMA 即Direct Memory Access ,直接存储器访问。
DMA 控制⽅式是以存储器为中⼼,在主存和I/O设备之间建⽴⼀条直接通路,在DMA 控制器的控制下进⾏设备和主存之间的数据交换。
这种⽅式只在传输开始和传输结束时才需要CPU的⼲预。
它⾮常适⽤于⾼速设备与主存之间的成批数据传输。
传统I/O下⾯通过⼀个Java ⾮常常见的应⽤场景:将系统中的⽂件发送到远端(磁盘⽂件 -> 内存(字节数组) -> 传输给⽤户/⽹络)来详细展开I/O操作。
如下图所⽰:JVM 发出read() 系统调⽤,上下⽂从⽤户态切换到内核态(第⼀次上下⽂切换)。
通过DMA(Direct Memory Access,直接存储器访问)引擎将⽂件中的数据从磁盘上读取到内核空间缓冲区(第⼀次拷贝: hard drive -> kernel buffer)。
将内核空间缓冲区的数据拷贝到⽤户空间缓冲区(第⼆次拷贝:kernel buffer -> user buffer),然后read系统调⽤返回。
⽽系统调⽤的返回⼜会导致⼀次内核态到⽤户态的上下⽂切换(第⼆次上下⽂切换)。
零拷贝技术应用场景随着计算机和网络技术的不断发展,数据传输和存储的需求也日益增长。
然而,在数据传输和存储过程中,传统的拷贝操作会导致性能损耗和资源浪费。
为了解决这个问题,零拷贝技术应运而生。
零拷贝技术是指在数据传输和存储过程中,避免数据在用户态和内核态之间的拷贝操作,从而减少了系统的开销和资源占用。
下面将介绍零拷贝技术在不同应用场景下的具体应用。
1. 网络数据传输在网络数据传输中,零拷贝技术可以提高数据传输的效率。
传统的网络数据传输过程中,数据需要从应用层拷贝到内核缓冲区,然后再从内核缓冲区拷贝到网络协议栈中,最后再发送出去。
而使用零拷贝技术,数据可以直接从应用层发送到网络协议栈,避免了多次的数据拷贝操作,提高了数据传输的速度和效率。
2. 磁盘读写在磁盘读写过程中,零拷贝技术可以有效减少磁盘访问的开销。
传统的磁盘读写过程中,数据需要从应用层拷贝到内核缓冲区,然后再从内核缓冲区拷贝到磁盘中。
而使用零拷贝技术,数据可以直接从应用层写入到磁盘中,或者直接从磁盘读取到应用层,避免了多次的数据拷贝操作,提高了磁盘读写的效率。
3. 多媒体处理在多媒体处理中,零拷贝技术可以提高多媒体数据的处理效率。
传统的多媒体处理过程中,数据需要从应用层拷贝到内核缓冲区,然后再从内核缓冲区拷贝到多媒体处理模块中。
而使用零拷贝技术,多媒体数据可以直接从应用层传输到多媒体处理模块,避免了多次的数据拷贝操作,提高了多媒体数据的处理速度和效率。
4. 数据库管理在数据库管理中,零拷贝技术可以提高数据库的读写性能。
传统的数据库读写过程中,数据需要从应用层拷贝到内核缓冲区,然后再从内核缓冲区拷贝到数据库管理系统中。
而使用零拷贝技术,数据可以直接从应用层传输到数据库管理系统,避免了多次的数据拷贝操作,提高了数据库的读写性能。
5. 文件传输在文件传输过程中,零拷贝技术可以提高文件传输的速度和效率。
传统的文件传输过程中,数据需要从应用层拷贝到内核缓冲区,然后再从内核缓冲区拷贝到目标文件中。
零拷贝(Zero-Copy)概述考虑这样⼀种常⽤的情形:你需要将静态内容(类似图⽚、⽂件)展⽰给⽤户。
那么这个情形就意味着你需要先将静态内容从磁盘中拷贝出来放到⼀个内存buf中,然后将这个buf通过socket传输给⽤户,进⽽⽤户或者静态内容的展⽰。
这看起来再正常不过了,但是实际上这是很低效的流程,我们把上⾯的这种情形抽象成下⾯的过程:read(file, tmp_buf, len);write(socket, tmp_buf, len);⾸先调⽤read将静态内容,这⾥假设为⽂件A,读取到tmp_buf, 然后调⽤write将tmp_buf写⼊到socket中,如图:在这个过程中⽂件A的经历了4次copy的过程:1. ⾸先,调⽤read时,⽂件A拷贝到了kernel模式;2. 之后,CPU控制将kernel模式数据copy到user模式下;3. 调⽤write时,先将user模式下的内容copy到kernel模式下的socket的buffer中;4. 最后将kernel模式下的socket buffer的数据copy到⽹卡设备中传送;从上⾯的过程可以看出,数据⽩⽩从kernel模式到user模式⾛了⼀圈,浪费了2次copy(第⼀次,从kernel模式拷贝到user模式;第⼆次从user模式再拷贝回kernel模式,即上⾯4次过程的第2和3步骤。
)。
⽽且上⾯的过程中kernel和user模式的上下⽂的切换也是4次。
幸运的是,你可以⽤⼀种叫做Zero-Copy的技术来去掉这些⽆谓的copy。
应⽤程序⽤Zero-Copy来请求kernel直接把disk的data传输给socket,⽽不是通过应⽤程序传输。
Zero-Copy⼤⼤提⾼了应⽤程序的性能,并且减少了kernel和user模式上下⽂的切换。
详述Zero-Copy技术省去了将操作系统的read buffer拷贝到程序的buffer,以及从程序buffer拷贝到socket buffer的步骤,直接将read buffer拷贝到socket buffer. Java NIO中的FileChannal.transferTo()⽅法就是这样的实现,这个实现是依赖于操作系统底层的sendFile()实现的。
零拷贝的原理
零拷贝技术(Zero-copy),源于计算机科学,它是一种复制数据
的方法,可以更高效地传输数据,从而提高系统处理能力。
这一技术可以用来在不同的内存空间之间复制数据,而不必将数据实际复制到另一个存储位置。
零拷贝技术为系统开发人员提供了一种新的方法,以有效地传输数据,更有效地使用系统内存,提高系统效率。
零拷贝技术的工作原理是当数据需要从一个内存空间传输到另
一个内存空间时,两个空间不会发生实际的数据复制,而是通过一个过程,使系统看起来像是在不同的内存空间之间复制数据一样。
通过这样的复制技术可以有效地减少数据传输的时间,减少系统繁重的读写操作。
在零拷贝技术中,数据复制的过程不会发生实际的数据复制,而是利用一个数据传输控制器,将数据从一个内存空间拷贝到另一个内存空间。
该控制器可以把数据的复制过程“看”成一个连续的流,在复制的过程中,将数据从一个内存空间传输到另一个内存空间,而不需要进行实际的数据复制。
现代计算机系统里,越来越多的操作系统都支持零拷贝技术,这一技术已经成为提高系统性能的重要方法。
它可以减少数据传输时间,降低系统中内存间传输数据造成的开销,从而提高系统的运行效率。
零拷贝技术可以被用于不同的软件或硬件,用以实现不同的系统功能。
它可以被用于网络传输,文件传输,数据库管理,虚拟内存管理和图形图像处理等多种应用领域。
总而言之,零拷贝技术是系统开发的一项新技术,它能够更高效地传输数据,提高系统效率,降低系统中计算成本,从而有效节约内存空间,更好地利用计算机系统资源,为更高效的系统开发提供了更有效的方式。
Kafka是如何利⽤零拷贝提⾼性能的Kafka 在执⾏消息的写⼊和读取这么快的原因,其中的⼀个原因是零拷贝(Zero-copy)技术,下⾯我们来了解⼀下这么⾼效的原因。
传统的⽂件读写传统的⽂件读写或者⽹络传输,通常需要将数据从内核态转换为⽤户态。
应⽤程序读取⽤户态内存数据,写⼊⽂件 / Socket之前,需要从⽤户态转换为内核态之后才可以写⼊⽂件或者⽹卡当中。
数据⾸先从磁盘读取到内核缓冲区,这⾥⾯的内核缓冲区就是页缓存(PageCache)。
然后从内核缓冲区中复制到应⽤程序缓冲区(⽤户态),输出到输出设备时,⼜会将⽤户态数据转换为内核态数据。
DMA在介绍零拷贝之前,我们先来看⼀个技术名词DMA(Direct Memory Access 直接内存访问)。
它是现代电脑的重要特征之⼀,允许不同速度的硬件之间直接交互,⽽不需要占⽤CPU的中断负载。
DMA传输将⼀个地址空间复制到另⼀个地址空间,当CPU 初始化这个传输之后,实际的数据传输是有DMA设备之间完成,这样可以⼤⼤的减少CPU的消耗。
我们常见的硬件设备都⽀持DMA,如下图所⽰:零拷贝对于常见的零拷贝,我们下⾯主要介绍⼀下mmap 和 sendfile 两种⽅式。
下⾯的介绍我们基于磁盘⽂件拷贝的⽅式去讲解。
mmapmmap 就是在⽤户态直接引⽤⽂件句柄,也就是⽤户态和内核态共享内核态的数据缓冲区,此时数据不需要复制到⽤户态空间。
当应⽤程序往 mmap 输出数据时,此时就直接输出到了内核态数据,如果此时输出设备是磁盘的话,会直接写盘(flush间隔是30秒)。
上⾯的图⽚我们可以这样去理解,⽐如我们需要从 src.data ⽂件复制数据到 dest.data ⽂件中。
此时我们不需要更改 src.data ⾥⾯的数据,但是对于 dest.data 需要追加⼀些数据。
此时src.data ⾥⾯的数据可以直接通过DMA 设备传输,⽽应⽤程序还需要对 dest.data 做⼀些数据追加,此时应⽤对 dest.data 做 mmap 映射,直接对内核态数据进⾏修改。
收稿日期:2017-07-07 修回日期:2017-11-15 网络出版时间:2018-02-24基金项目:陕西省重大科技创新专项资助项目(2010ZKC 02-08)作者简介:赵成青(1990-),男,硕士研究生,研究方向为嵌入式系统开发与设计;李宥谋,教授,研究方向为集成电路设计㊁嵌入式系统开发与设计㊂网络出版地址:http :// /kcms /detail /61.1450.TP.20180224.1521.066.htmlLWIP 中零拷贝技术的研究与应用赵成青,李宥谋,刘永斌,王 涛(西安邮电大学,陕西西安710000)摘 要:LWIP 是一种轻量级的TCP /IP 协议栈㊂在运行过程中占用少量的资源,主要应用在低端的嵌入式系统㊂文中从物理层到应用层,分三个层次分析了LWIP 协议栈的数据传递过程㊂分别是物理层到协议栈内部的数据传递过程㊁协议栈内部本身的数据传递过程㊁协议栈和外部应用程序数据的传递过程㊂而数据在协议栈内部传递时,通过pbuf 缓冲包在各层之间传递数据包的地址指针已经实现了数据在协议栈内部各层之间的零拷贝传递㊂提出了在物理网卡和LWIP 协议栈传递数据㊁外部应用程序和LWIP 协议栈传递数据时的改进方法,避免了数据的两次拷贝,从而实现了数据从物理层直达应用层,提高了系统的传输效率和并发性能㊂测试结果表明,数据传输速率从未优化的2.04MB /s 提升到9.8MB /s,已接近网卡性能极限㊂关键词:分层;内存映射;指针传递;零拷贝;IPC 方式中图分类号:TP216 文献标识码:A 文章编号:1673-629X (2018)07-0182-05doi:10.3969/j.issn.1673-629X.2018.07.039Research and Application of Zero Copy Technology in LWIPZHAO Cheng -qing ,LI You -mou ,LIU Yong -bin ,WANG Tao(Xi ’an University of Posts and Telecommunications ,Xi ’an 710000,China )Abstract :LWIP ,a lightweight TCP /IP stack ,occupies a small amount of resources during the operation and is mainly used in low -end embedded systems.From the physical layer to the application layer ,the data transfer process of the LWIP protocol stack is analyzed in three levels which are the data transfer process from the physical layer to the protocol stack ,the data transfer process inside the protocol stack ,and the data transfer between the protocol stack and the external application program.When the data is passed inside the protocol stack ,the address pointer of the data packet is transmitted between the layers through the pbuf buffer packet ,and the data has been trans⁃mitted by zero copy between the layers of the protocol stack.We propose an improved method to transfer data between the physical net⁃work card and the LWIP protocol stack ,the external application program and the LWIP protocol stack ,so as to avoid the two copy of the data.The system realizes the direct application of data from the physical layer to the application layer ,and improves the transmission effi⁃ciency and the concurrent performance of the system.Test shows that the rate of data transmission has been optimized from 2.04MB /s to 9.8MB /s ,which is close to the network card performance limit.Key words :layered ;memory mapping ;pointer passing ;zero copy ;IPC mode0 引 言LWIP 是瑞典计算机科学院(SICS )的AdamDunkels 开发的用于嵌入式系统的开源TCP /IP 协议栈[1]㊂LWIP 的含义是轻量级的TCP /IP 协议,专注于减少资源消耗㊂嵌入式网络传输系统由于成本资源的限制,往往采用简化的TCP /IP 协议㊂文中通过研究㊁分析常用的嵌入式网络协议栈LWIP 的结构,在物理层和应用层提出了提高系统传输效率的改进方法㊂在小型嵌入式系统中,LWIP 的实现基于上层协议已明确知道下层协议所使用的数据结构的特点[2]㊂它会假设各层间的部分数据结构和实现原理在其他层是可见的㊂在数据包递交过程中,各层协议可以通过指针直接指向数据包中其他层次的字段㊂所以上层可直接使用取地址计算得到下层中的数据,这不仅使整个协议栈对数据包的操作更加灵活,而且避免了LWIP 协议栈内部数据递交时的复制㊂但是,这仅仅第28卷 第7期2018年7月 计算机技术与发展COMPUTER TECHNOLOGY AND DEVELOPMENT Vol.28 No.7July 2018是在LWIP协议栈内部实现数据的零拷贝㊂在物理网卡向协议栈传递数据时和协议栈向应用程序传递数据时,还是存在两次消耗较大的数据拷贝过程㊂所以,文中提出在网卡接收数据时让LWIP内核存储区指针直接指向物理网卡的寄存器地址的方法,避免了物理网卡数据到LWIP协议栈缓冲区数据的拷贝[3]㊂在应用层,提出了利用μcos操作系统的邮箱机制,避免了多个外部应用程序和协议栈内核交互时的数据拷贝[4],从而实现了从物理层到应用层真正的数据零拷贝,并且提高了系统的并发性㊂1 物理网卡到LWIP协议栈数据的传递在嵌入式系统中应用比较广泛的是MicroChip公司的ENC28J60网卡㊂在网卡驱动函数接收数据包时,网卡驱动函数首先向网卡发送数据包传送指令,此时网卡会把BNRY(边界寄存器)处的一个网卡格式的数据包数据一次性全部发送到DMA端口,此时网卡驱动函数会在DMA端口读取所有字节数据后,网卡会自动将BNRY(边界寄存器)值调整为下一个数据包地址,以准备下一次读取所有字节数据㊂然后将接收到的数据封装成LWIP熟悉的格式并且写到缓冲区中,这个过程涉及到数据到拷贝[5]㊂在ENC28J60网卡中接收缓冲器由一个硬件管理的循环FIFO构成㊂ERXST表示接收缓冲区起始地址,ERXNDH表示接收缓冲区结束地址[6]㊂如图1所示,通过把网卡相关的寄存器映射到LWIP内核内存空间,就可以直接对网卡寄存器进行操作,避免了物理网卡到LWIP 内核空间的数据拷贝㊂然后封装成LWIP内核能够识别的pbuf类型的数据包结构,在LWIP内核中由low_ level_input()函数完成这个功能㊂通过ehternetif_in⁃put()函数解析该数据包的类型,然后将该数据包指针递交给相应的上层㊂图1 网卡内部寄存器指针映射2 LWIP协议层间数据传递在网卡接收数据时,需要申请一个数据包,然后将网卡中的数据填入数据包中㊂发送数据包时,协议栈的某层中会申请一个pbuf,并将相应的数据装入到数据区域,同时相关的协议首部信息也会被填写到pbuf 的预留数据区域中[7]㊂数据包申请函数有两个重要参数,一个是想申请的数据包pbuf类型,另一个重要参数是该数据包是在协议栈中哪一层被申请的,分配函数会根据这个层次的不同,在pbuf数据区域前为相应的协议预留出首部空间,这就是offset值㊂总的来说, LWIP定义了四个层次,当数据包申请时,所处的层次不同,会导致预留空间的offset值不同[8]㊂层次定义时通过一个枚举类型pbuf_layer:Typedef enum{PBUF_TRANSPORT,//传输层PBUF_IP,//网络层PBUF_LINK,//链路层PBUF_RAW,//原始层}pbuf_layer;上面的结构体中除了定义枚举类型pbuf_layer来表示各个网络协议层的名称外,还定义了两个宏: PBUF_TRANSPORT_HLEN和PBUF_IP_HLEN㊂前者是典型的TCP报文首部长度,而后者是典型的不带任何选项字段的IP首部长度㊂代码如下所示:Switch(layer){Case PBUF_TRANSPORT:Offset=PBUF_LINK_HLEN+PBUF_IP_HLEN+PBUF_ TRASNSPORT_HLEN;Case PBUF_IP:Offset=PBUF_LINK_HLEN+PBUF_IP_HLEN;Case PBUF_LINK:Offset=PBUF_LINK_HLEN;Case PBUF_LINK:Offset=0;在LWIP的数据包管理函数pbuf.c中,首先根据数据包申请时传入的协议层参数,计算需要在pbuf数据区签预留的长度offset值,然后根据pbuf的类型进行实际申请㊂Pbuf_pooll类型申请最复杂[9],因为可能需要几个pool连接在一起,以此来满足用户的空间需求㊂限于篇幅,对LWIP内存分配机制不做深入研究; pbuf_ref和pbuf_rom类型申请最简单,它们只是在内存MEMEP_PBUF中分配一个pbuf结构空间,然后初始化相关字段,注意这两种类型的payload指针需要用户自行设置,通常在调用完函数pbuf_alloc后,调用者需要将payload指向某个数据区㊂在原始层以太网驱动中:P=pbuf_alloc(PBUF_RAW,recvlen,PBUF_RAM);这个调用语句申请了一个PBUF_RAM类型的pbuf,且其申请的协议层为PBUF_RAW,所以pbuf_al⁃loc函数不会在数据区前预留出任何首部空间;通过使用p->payload,就可以实现对pbuf中数据区的读取或㊃381㊃ 第7期 赵成青等:LWIP中零拷贝技术的研究与应用者写入操作了㊂在传输层TCP层: P=pbuf_alloc(PBUF_RAW,recvlen,PBUF_RAM);它告诉数据包分配函数使用PBUF_RAM类型的pbuf,且数据前应该预留一部分的首部空间㊂由于这里是PBUF_TRANSPORT层,所以预留空间将有54个字节,即TCP首部长度的20个字节㊁IP数据包首部长度的20个字节以及以太网帧首部长度的14字节㊂当数据包往下层递交,各层协议就直接操作这些预留空间的数据,以实现数据首部的填写,这样就避免了数据的拷贝㊂3 LWIP软件与用户程序间的数据传递3.1 用户缓冲数据结构协议栈API实现时,也为用户提供了数据包管理函数,可以完成数据包内存申请㊁释放㊁数据拷贝等任务㊂无论是UDP还是TCP连接,当协议栈接收到数据包后,会将数据封装在一个netbuf中,并递交给应用程序[10]㊂在发送数据时,不同类型的连接将导致不同的数据处理方式㊂对于TCP连接,内核会根据用户提供待发送数据的起始数据和长度,自动将数据封装在合适的数据包中,然后放入发送队列;对于UDP,用户需要手动将数据封装在netbuf中,通过调用发送函数,内核直接发送数据包中的数据段㊂应用程序使用netbuf结构来描述㊁组装数据包,该结构只是对内核pbuf的简单封装,是用户应用程序和协议栈共享的㊂外部应用程序可以使用该结构来管理发送数据㊁接收数据的缓冲区㊂netbuf是基于pbuf实现的,其结构如以下代码所示:Struct netbuf{Struct pbuf*p,*ptr;Ip_addr_t*addr;U16_t port;}其中,netbuf相当于一个数据首部,保存数据的字段是p,它指向pbuf链表首部,ptr指向链表中的其他位置,addr表示IP地址,port表示端口号㊂netbuf是应用程序描述待发送数据和已接收数据的基本结构,引入netbuf结构看似会让应用程序更加繁杂,但实际上内核为应用程序提供了API,通过共享一个netbuf结构(如图2所示),两部分API就能实现对数据包的共同处理,避免了数据拷贝㊂图2 用户缓冲区结构3.2 操作数据缓冲区指针与BSD相同,LWIP协议栈API也对网络连接进行了抽象㊂但它们之间的抽象存在一定的差别:BSD 实现了更高级别的抽象,用户可以像操作文件那样来操作一个网络连接;LWIP中,API只能实现较低级别的抽象,用户操作的仅仅是一个网络连接,而不是文件㊂在BSD中,应用程序处理的网络数据都处于一片连续的存储区域中,可以使用户对数据的处理更加方便㊂在LWIP中,若API使用上述数据存储机制可能会导致很大的缺陷,因为LWIP中网络数据都存储在pbuf中,如果要实现存储在连续的存储区的话,需要将所有pbuf数据拷贝到这个连续的存储中,这将造成数据的拷贝㊂为了避免数据拷贝以后再递交给用户,需要直接操作pbuf的一些方法,而LWIP中恰恰提供了这些方法㊂比如通过netbuf_next()可以修改数据指针指向下一个数据段,如果返回值为0,表示netbuf 中还存在数据段,大于0说明指针已经指向netbuf中的最后一个数据段了,小于0表明netbuf中已经没有数据段了㊂当用户未调用netbuf_next()函数的情况下,ptr和p都默认指向第一个pbuf㊂通过netbuf_next()对协议栈和应用程序共同缓冲区指针的调整和读取,避免了应用程序和数据以及内核栈的拷贝㊂4 应对多个外部应用程序的指针传递在单独运行LWIP时,用户应用程序和协议栈内核处于同一进程中,用户程序通过回调的方式进行㊂这样,用户程序和协议栈内核出现了相互制约的关系,因为用户程序执行的时候,内核一直处于等待状态,内核需要等待用户函数返回一个处理结果再继续执行㊂如果用户执行计算量很大,执行时间很长,则协议栈代码就一直得不到执行,协议栈接收,处理数据包效率会受到直接的影响㊂最严重的结果是,如果发送方速度很快,则协议栈会因为来不及处理而出现丢包的情况㊂为了设计多进程外部应用程序,将LWIP移植到㊃481㊃ 计算机技术与发展 第28卷μcos操作系统下,让LWIP内核作为操作系统的一个任务运行[11]㊂LWIP协议栈设计时,提供了协议栈与操作系统之间函数的接口㊂协议栈API由两部分组成㊂一部分提供给应用程序,一部分提供给协议栈内核㊂应用程序和协议栈内核通过进程间通信机制进行通信和同步[12]㊂使用到的进程通信机制包括了以下三种[13]:(1)邮箱,例如内核邮箱mbox㊁连接上接收数据的邮箱recvmbox;(2)信号量,例如op_completed,用于两部分API 同步;(3)共享内存,例如内核消息结构tcp_msg㊁API 消息内容api_msg等[14]㊂两部分API间的关系如图3所示㊂API设计的主要思想是让应用程序成为一个单独的进程;而协议栈也成为一个单独的进程㊂用户进程只负责数据的计算等其他工作,协议栈进程仅仅负责通信工作㊂两部分进程之间使用三种IPC方式中的邮箱和信号量集,内核进程可以直接将数据递交到应用程序邮箱中,然后继续执行,不必阻塞等待,邮箱对于应用程序来说就像一个输入队列,提高了系统的实时性[15]㊂图3 两部分独立进程间的通信 全局邮箱mbox在协议栈初始化时建立,用于内核进程tcpip_thread接收消息㊂内核进程通过共享内存的方式与协议栈的其他各个模块进行通信,它从邮箱中获得的是一个指向消息结构的指针㊂函数tcp_ input在内存池中为系统消息结构申请空间,并根据消息类型初始化结构中的相关字段,把内核消息封装在tcp_msg结构中,最后将消息投递到系统邮箱中等待内核进程tcpip_thread处理㊂tcpip_thread使用从邮箱中获得的指针指定到对应内存地址处读取消息内容,从而避免了两个进程间通信的数据的拷贝㊂5摇性能测试对比及其应用在局域网内,对ARM开发板STM32F103VET6-EV上基于无操作系统和移植了μcos操作系统的LWIP两种方法编写的UDP服务器进行数据吞吐能力的测试,以此来估算网卡及整个板子的网络处理性能及对比无操作系统模拟层和在操作系统模拟层下编写的UDP服务器性能的差别㊂在Windows主机上运行iperf软件来测试服务器的数据吞吐能力㊂如图4(a)所示,在软件上选择UDP 协议,设置好服务器IP地址(192.168.1.230)和端口号(5000)后,单击start iperf,软件开始对服务器性能进行测试㊂从图4(a)可以看出,服务器的上下行带宽都可以维持在9800kb/s左右,很接近ENC28J60网卡的处理值上线10M/s㊂在操作系统模拟层下基于LWIP零拷贝技术编写的UDP服务器,板子的网络处理性能达到最优㊂从图4(b)可以看出,基于无操作系统模拟层下编程的服务器在客户端连续发送大量数据图4 UDP性能测试㊃581㊃ 第7期 赵成青等:LWIP中零拷贝技术的研究与应用时导致丢包情况,严重情况下甚至出现死机的情况㊂6摇结束语综上所述,在应对多个外部应用程序的情况下,无操作系统模拟层的UDP 服务器编程,虽然避免了数据的拷贝,但是无法应对多个外部应用程序㊂所以将LWIP 移植到μcos 操作系统下,不仅减少了内存开销,而且能够应对多个外部应用程序㊂文中的研究成果已经成功应用于嵌入式网管系统项目并实际运行,不仅提高了基于STM 32平台μcos 操作系统下测量仪器代理模块的传输效率,提高了系统的实时性,而且节约了内存开销㊂参考文献:[1] CAROFIGLIO G ,MUSCARIELLO L.On the impact of TCPand per -flow scheduling on internet performance [J ].IEEE /ACM Transactions on Networking ,2012,20(2):52-56.[2] SHERWANI S A ,KHIYAL M S H.Real -time scheduler fortransport protocols [J ].Information Technology Journal ,2007,6(3):376-379.[3] LI Jinlei ,ZHENG Wengang ,SHEN Changjun ,et al.Applica⁃tion of modbus protocol based on μC /TCPIP in water savingirrigation in facility agricultural [C ]//International confer⁃ence on computer and computing technologies in agriculture.[s.l.]:[s.n.],2014.[4] SCHIEPEK G ,AICHHORN W.Real -time monitoring ofpsychotherapeutic change processes [J ].Psychotherapie ,Psy⁃chosomatik ,Medizinische Psychologie ,2013,63(1):39-47.[5] 陈 实,武 杰.一种基于以太网的嵌入式数据传输速率优化方法研究[J ].微型机与应用,2015,34(4):64-66.[6] 张庆辉,马延立.STM 32F 103VET 6和ENC 28J 60的嵌入式以太网接口设计[J ].单片机与嵌入式系统应用,2012(9):23-25.[7] 张 齐,劳炽元.轻量级协议栈LWIP 的分析与改进[J ].计算机工程与设计,2010,31(10):2169-2171.[8] 蔡雄飞,王新华,郭淑琴.嵌入式TCP /IP 协议LWIP 的内存管理机制研究[J ].杭州电子科技大学学报,2012,32(4):118-121.[9] 付晓军,夏应清,何 轩.嵌入式LWIP 协议栈的内存管理[J ].电子技术应用,2006,32(3):56-58.[10]李茂正.嵌入式系统中实现网络协议[D ].南京:南京大学,2011.[11]苏勇辉.基于ARM 微处理器TCP /IP 协议栈LwIP 实现[J ].国外电子测量技术,2009,28(10):76-78.[12]MOLAY B.Unix /Linux 编程实践教程[M ].杨宗源,黄海涛,译.北京:清华大学出版社,2004:464-475.[13]LABROSSE J J.嵌入式实时操作系统μC /OS -II [M ].邵贝贝,译.北京:航空航天大学出版社,2012:143-150.[14]STEINKE R C ,NUTT G J.A unified theory of shared mem⁃ory consistency [J ].Journal of the ACM ,2004,51(5):800-849.[15]任 哲.嵌入式实时操作系统μC /OS -II 原理及应用[M ].北京:航空航天大学出版社,2005:133-139.(上接第181页) 网络性能比较[J ].中国卫生统计,2013,30(2):173-176.[4] 卢辉斌,李丹丹,孙海艳.PSO 优化BP 神经网络的混沌时间序列预测[J ].计算机工程与应用,2015,51(2):224-229.[5] 游丹丹,陈福集.基于改进粒子群和BP 神经网络的网络舆情预测研究[J ].情报杂志,2016,35(8):156-161.[6] 张宝堃,张宝一.基于BP 神经网络的非线性函数拟合[J ].电脑知识与技术,2012,8(27):6579-6583.[7] BUSCEMA M.Back propagation neural networks [J ].Sub⁃stance Use &Misuse ,1998,33(2):233-270.[8] 范广坡,余学飞,卢广文,等.改进PSO -BP 算法的压力导丝温度及非线性补偿研究[J ].自动化仪表,2016,37(6):16-20.[9] 崔东文.多隐层BP 神经网络模型在径流预测中的应用[J ].水文,2013,33(1):68-73.[10]JIAN Huajiang ,BU Yunsheng ,LI Xionggong ,et al.PSO al⁃gorithm based task allocation in dynamic virtual enterprise [J ].Advanced Materials Research ,2011,189-193:2572-2576.[11]朱小明,张慧斌.PSO 算法的稳定性分析及算法改进[J ].计算机科学,2013,40(3):275-278.[12]涂娟娟.PSO 优化神经网络算法的研究及其应用[D ].镇江:江苏大学,2013.[13]LIU Lilan ,HU Rongsong ,HU Xiangping ,et al.A hybridPSO -GA algorithm for job shop scheduling in machine tool production [J ].International Journal of Production Research ,2015,53(19):5755-5781.[14]梅金平,张士兵,王海莲.基于PSO -GA 算法的多用户OFDM 系统资源分配[J ].电视技术,2014,38(1):115-119.[15]崔宝才.基于GA 改进BP 神经网络网络异常检测方法[J ].现代电子技术,2016,39(3):90-93.[16]马福祥,马秀娟.一种基于二次变异策略的改进型遗传算法[J ].计算机工程与应用,2014,50(13):62-65.[17]SRINIVAS M ,PATNAIK L M.Adaptive probabilities ofcrossover and mutation in genetic algorithms [J ].IEEE Transactions on Systems ,Man ,and Cybernetics ,1994,24(4):656-667.㊃681㊃ 计算机技术与发展 第28卷。
2文章提交:firstdot (firstdot_at_)零拷贝技术研究与实现作者:梁健(firstdot)E-MAIL:firstdot@感谢王超、史晓龙的共同研究与大力帮助一.基本概念零拷贝(zero-copy)基本思想是:数据报从网络设备到用户程序空间传递的过程中,减少数据拷贝次数,减少系统调用,实现CPU的零参与,彻底消除CPU在这方面的负载。
实现零拷贝用到的最主要技术是DMA数据传输技术和内存区域映射技术。
如图1所示,传统的网络数据报处理,需要经过网络设备到操作系统内存空间,系统内存空间到用户应用程序空间这两次拷贝,同时还需要经历用户向系统发出的系统调用。
而零拷贝技术则首先利用DMA技术将网络数据报直接传递到系统内核预先分配的地址空间中,避免CPU的参与;同时,将系统内核中存储数据报的内存区域映射到检测程序的应用程序空间(还有一种方式是在用户空间建立一缓存,并将其映射到内核空间,类似于linux系统下的kiobuf技术),检测程序直接对这块内存进行访问,从而减少了系统内核向用户空间的内存拷贝,同时减少了系统调用的开销,实现了真正的“零拷贝”。
图1 传统数据处理与零拷贝技术之比较二.实现在redhat7.3上通过修改其内核源码中附带的8139too.c完成零拷贝的试验,主要想法是:在8139too网卡驱动模块启动时申请一内核缓存,并建立一数据结构对其进行管理,然后试验性的向该缓存写入多个字符串数据,最后通过proc文件系统将该缓存的地址传给用户进程;用户进程通过读proc 文件系统取得缓存地址并对该缓存进行地址映射,从而可以从其中读取数据。
哈哈,为了偷懒,本文只是对零拷贝思想中的地址映射部分进行试验,而没有实现DMA数据传输(太麻烦了,还得了解硬件),本试验并不是一个IDS产品中抓包模块的一部分,要想真正在IDS中实现零拷贝,除了DMA外,还有一些问题需考虑,详见本文第三节的分析。
以下为实现零拷贝的主要步骤,详细代码见附录。
零拷贝技术及其运用Zero-Copy Technique and its Usage李星辰夏浩茗廖山河Li Xingchen,Xia Haoming and Liao Shanhe摘要:零拷贝(zero-copy)是实现主机或路由器等设备高速网络接口的主要技术。
零拷贝技术通过减少或消除关键通信路径影响速度的操作,降低数据传输的操作系统开销和协议处理开销,从而有效提高通信性能,实现高速数据传输。
Abstract: Zero-copy is an important technology to realize high-speed network interfacing forhosts and routers. It achieves high-speed data transfer through decreasing the overhead ofdata transm issioncaused by the operating system and transm ission protocols. Itsmain idea is to reduce orelim inate somemanipulations that affect speed in the critical transm ission path.关键词: 零拷贝; 高速网络接口; 操作系统; 协议; 网络处理器; RAID;Keywords: zero-copy; high-speed network interfacing; OS; protocol;network conductor;RAID1引言新的应用需求如多媒体、VOD以及WEB服务等加重了通信负载,要求网络具有更多的带宽和更短的传输延迟。
高速网络链路技术(SDH、光互连等)的发展提供了高带宽的网络。
信息传输更加关注数据从主机或其他设备到网络接口的有效移动。
零拷贝技术可以减少数据拷贝和共享总线操作的次数,消除通信数据在存储器之间不必要的中间拷贝过程,有效地提高通信效率,是设计高速接口通道、实现高速服务器和路由器的关键技术之一。
数据拷贝受制于传统的操作系统或通信协议,限制了通信性能。
采用零拷贝技术,通过减少数据拷贝次数,简化协议处理的层次,在应用和网络间提供更快的数据通路,可以有效地降低通信延迟,增加网络吞吐率。
零拷贝技术的主要研究涉及到数据的传输途径、传输控制、缓冲区管理机制、地址变换和地址空间的保护机制等设计问题,并且需要考虑与操作系统或协议的结合关系。
目前零拷贝技术的主要实现是用户级的高速网络通信接口。
2零拷贝的主要技术研究零拷贝技术的研究主要针对以下两个方面:(1)创建有效的用户级通信接口,即应用程序直接将数据从通信接口发送出去或接收进来,消除系统内核中不必要的拷贝过程; (2)路由器的入端到出端的直接数据传输,即接收的报文只经过一次存储器缓冲,而缓冲队列中的报文经过必要的控制信息处理后,直接传送到输出端口发送出去,实现报文快速转发。
用户级网络接口的设计和实现的关键在于应用和网络间的接口,为此需要考虑以下一些关键问题。
2.1数据传输机制通常,协议优化的数据传输过程至少涉及到三次传送。
每一个发送或接收数据的应用,其传输缓冲区在网络接口都有对应的传输描述块(发送或接收环中),它包含传输报文的目标地址、缓冲区起始地址和缓冲区大小等信息。
进一步优化则无需经过网络接口的存储,应用程序直接将数据从自己的缓冲区通过网络接口发送出去,不在NIC的存储器中停留;而接收端将收到的报文直接传送给应用处理,如图1所示。
主机至接口的数据传输机制可使用DMA或可编程I/O(PIO)方法。
PIO方式通常一次传送1~2个字,涉及到许多总线操作。
而DMA使用专门的DMA引擎突发性地传送整个报文,并可与主机并行操作。
用户进程和网络接口都可以启动DMA而无需操作系统的干预。
由于DMA 是异步完成的,操作系统在进行页交换时,可能会把正在进行DMA传输的信息交换出去,从而使部分传送的目标信息受到损坏。
解决这一问题的方法之一是让应用程序将用于数据传送的页帧固定于其地址空间,从而避开页交换。
接口至接口传输机制使用接口的DMA引擎或PIO发送和接收网络数据,采用DMA传输较快。
在流控方面,如果接收方没有取走数据,则发送方暂停网络接口数据的发送。
为了防止死锁,暂停有一个时间限制,如果接收方在该时间限制内没有取走所有阻塞的网络数据,则网络接口就会复位,放弃阻塞的报文。
为避免复位,接收方拷贝应足够快。
接收方网络接口至主机的传输同样可以使用DMA或PIO。
大多数协议都使用DMA,也有少数协议使用主机PIO接收小信息,而用DMA传送大块数据。
2.2地址变换技术集成应用和网络接口间的缓冲区管理带来了另外的问题,因为应用使用的是缓冲区的虚拟地址,而网络接口的DMA引擎则需要用物理存储器地址进行传输。
因此,必须有一个可信任的实体将虚拟地址变换为物理地址,再交给网络接口。
此外,操作系统必须跟踪接口用来进行DMA传输的内存页,以便保持映射的进行。
地址变换可采用: (1)由应用管理虚拟地址到物理地址的变换。
用户从操作系统取得内存区的映射,并使用其作为缓冲区,其优点是将所有映射装在网络接口后,即可使用简单查找实现变换,但应用必须小心而理智地管理其内存区。
(2)由网络接口完成虚拟地址到物理地址的变换。
用户可将其缓冲区设在其虚拟地址空间的任何地方,网络接口包含一个TLB,负责将<进程ID,虚拟地址>映射为物理页帧和读/写访问权。
(3)编制一个简单的内核附加模块实现虚拟地址到物理地址的变换。
用户负责固定其页帧并从该模块取得物理地址,该方法的缺点是网络接口无法检查其接收的物理地址的合法性。
解决方法之一是让网络接口与该内核模块协同以便跟踪有效的地址变换。
网络接口可以缓存部分有效地址变换,以便快速引用页帧。
当网络接口在其缓存中发现用户指定的地址变换时,就可以使用DMA直接访问。
当网络接口无法变换一个地址时,则产生一个中断,内核模块接收该中断,在页表中查找该地址,固定该页,并将变换信息传给网络接口。
2.3保护机制当初始化发送描述块时,如果多个应用共享网络接口,某个应用可能会破坏另一个应用的发送描述块。
可使用一部分网络接口存储器作为高速缓存,存放活跃的通信端点,将非活跃的端点存放于主机内存。
当一个进程想通过非活跃端点发送信息时,网络接口和操作系统协作激活该端点,将其状态移到网络接口存储器中。
另一种方法是将通信建立和数据传输分开。
在建立期间,操作系统介入完成保护检查以确保应用彼此不会相互干扰。
在数据传输期间,网络接口旁路操作系统并进行简单检查以加强保护。
2.4传输控制传输控制一般采用中断或轮询方式。
中断方式通常开销比较大,故需要结合一定形式的轮询。
轮询是一种快速而开销低的机制,能够及时检查到达信息。
方法之一:让网络接口在其存储器中设置标志,并让主机检测之。
由于I/O总线存在开销,这一方法是低效的。
方法之二:当信息到达时,网络接口将标志写入主机内存,主机就地进行轮询,减少I/O总线传输开销。
由于标志通常驻留于Cache中,这样,频繁执行轮询时,不成功的轮询就不会产生访存。
可以综合使用中断和轮询:在网络接口中设置一个轮询守护机制,当报文到达时,启动一个定时器,定时器计时到零时,如果主机还没有发出轮询,则产生一个中断。
2.5可靠性基于可靠网络假设的可靠性处理较简单,不需要重发和超时机制,罕见的错误可交由高层软件处理或者只设应答重发机制而不设超时机制。
对于信息量大的通信,系统可采用主机级信用卡机制实现流控:信用卡代表接收方的报文缓冲区量,必须执有接收方的信用卡,才能发送报文。
一旦发送方用完信用卡,则必须阻塞以等待新的信用卡。
基于网络不可靠的系统则在主机或网络接口中实现重发机制,设置定时器和应答处理。
2.6多播实现考虑可以将所有多播目的地址传送到网络接口,然后在网络接口将同一报文发往每一个多播目的。
这一方法在网络接口形成串行发送的瓶颈。
通过在网络接口转发多播报文,可有效地实现基于生成树的协议,当它与中断驱动的报文传递方式相结合时,则更加有效,因为它消除了转发路径上的中断处理代价。
3网络设备中零拷贝技术的实现3.1用户级网络接口设计实现3. 1. 1U-NetU-Net由美国康耐尔大学研制,是基于信息的用户级网络接口,它定义了一个很薄的软件层而对网络硬件呈现出一致的接口。
U-Νet描述硬件操作,直接提供给应用一个标准硬件接口。
在U-Net中,端节点作为应用进入网络的句柄,包含三个环形队列,分别保存各自的信息缓冲区描述块:发送队列、可接收信息的空闲队列和已接收信息的接收队列。
网络接口读取描述块,验证应用的目的地址,将虚拟缓冲区地址变换为物理地址,并使用DMA传送数据。
每一个端节点的队列只映射到对应进程的地址空间。
3. 1. 2VMMC-2和AM-Ⅱ由美国普林斯顿大学实现的VMMC-2和由伯克利大学实现的AM-Ⅱ(ActiveMessage)均使用通信原语与虚拟共享存储器结合的方法,消除了接收端的一次拷贝:将接收信息放入缓冲区并使应用程序可访问之,应用将其数据拷贝到最终目的以释放缓冲区。
AM-Ⅱ使用通信原语put将本地内存块传送给远端地址, get读取远端块。
只要发送者和接收者预先协调好远端内存地址,则无需接收方干预,即可将数据移动到最终位置。
VMMC-2使用了一个用户TLB (UTLB)进行存储管理,要求通信过程使用的内存必须先进行注册登记(固定)以避开内核的页交换。
3. 1. 3VIA虚拟接口体系结构VIA是用户级网络接口的工业标准。
在VIA中,进程首先打开VI(到网络的句柄),每一个VI有两个队列:发送和接收信息描述块链表,每一个描述块指向一个和多个缓存区。
信息发送后,VIA置描述块中的完成位,从而应用可最终释放描述块。
VIA也提供本地内存与远端内存间的直接传输,即远端DMA(RDMA)读和写。
VIA的地址变换机制位于网络接口,所有用于通信的内存(队列、描述块和缓冲区)在使用前必须进行注册。
注册一个内存区返回一个句柄,句柄和虚拟地址共同描述通信的区域。
3.2主机式路由器中的零拷贝实现基于主机的路由器采用商品化的主机平台和网络接口,它比专用路由器产品更为便宜,其安全性、可配置性和可编程性更好,常常作为路由测试床以及动态可重编程的路由器。
主机式路由器的主要缺点是缺乏高带宽接口的支持。
主机式路由器由主机和至少两块网络接口卡(NIC)组成。
每一块NIC都有一个DMA控制器和一些存储器。
DMA控制器管理从NIC RAM直接到主机RAM的数据传输,无需主机CPU 的干预。
在传统的基于主机的转发处理中,数据通路是低效的,因为报文必须拷贝两次:一次进入主机存储器,一次从主机存储器中拷贝出来。