Netmap to VALE—— 从高性能网络框架到高性能虚拟网络交换机

我在上一篇文章也提到过,对于全虚拟化和半虚拟化,需要分配给虚拟机一个虚拟网络接口,这些就需要一个虚拟交换机vswitch(可以和hypervisor一同使用),从而将虚拟网络接口的数据包从物理接口转发出去。但是在复杂的系统中,这个虚拟交换机的性能往往并不好。开源项目netmap[1]做了一个高性能网络框架,并且同样使用这个原理完成了高性能虚拟网络交换机vale的设计[2],在多种场景下Vale测量的性能[3]也非常好。

 note:由于项目需要,我常常思考一个高性能的虚拟交换机应该怎么做。从netmap和Vale这些设计和论述中我受益匪浅,我把我浅薄的理解记录并分享,希望也能给大家帮助。

Netmap

由于官网上介绍的已经很详细了,我这里简单描述。

Netmap 框架是一个用于网络硬件和应用程序的高性能通信的通道,基于共享内存机制。可以将Netmap和Linux网络编程[4]需要用到的系统调用(read,write)进行对比,他们所要完成的功能是类似的。相对于系统调用,netmap的主要特点在于:buffer分配和数据复制的开销没有了,这是因为使用了共享内存并且提前分配了buffer。

那么问题是程序是怎么使用netmap机制的呢?通过在程序里面打开一个特殊的文件/dev/netmap,获得一个文件描述符,并且使用ioctl()系统调用选择一个设备,然后应该可以获取一块region,然后使用mmap()将文件描述符对应的文件对应到那个region。

netmap是作为内核模块来实施的,主要包括两部分。一是功能,实现了那些open,close,ioctl,poll/select等基本功能。另外一个是与设备相关的部分,netmap延伸了驱动的功能,负责传输数据(只要传输描述符ring的元数据)。因为做到了zero copy,所以能够达到高性能。

VALE原理

Netmap机制是实现VALE(Virtual local ethernet)高性能的核心所在。

VALE其实就是一个虚拟本地以太网交换机。它给它的每个用户(hypervisor或者process)提供一个虚拟的网络接口(可以通过netmap的api来访问)。核心工作还是在netmap backend端,需要在后端增加交换机的逻辑,比如转发学习逻辑。然后进一步优化。

到现在为止Netmap已经列入了FreeBSD的内核,但是在linux下面使用还是需要编译这个模块并加载。

参考资料

[1]http://info.iet.unipi.it/~luigi/netmap/

[2]http://info.iet.unipi.it/~luigi/vale/

[3]http://info.iet.unipi.it/~luigi/papers/20121026-vale.pdf

[4]《Unix 网络编程》

p.s.因为只看过Vale的那篇论文,然后稍微浏览了下网页,认识不深刻,写的过于简单。想进一步了解的去官网应该可以学到很多~~

时间: 2024-10-07 05:21:17

Netmap to VALE—— 从高性能网络框架到高性能虚拟网络交换机的相关文章

Voovan 是一个高性能异步网络框架和 HTTP(Java)

Voovan 是一个高性能异步网络框架和 HTTP 服务器框架,同时支持 HTTP 客户端抓取.动态编译支持.数据库访问封装以及 DateTime.String.Log.反射.对象工具.流操作.文件操作.异步双向通道等功能.旨在提供可靠.方便.可单元测试的代码.它是一个无任何依赖的独立工具包,希望能够方便广大开发者快速的实现应用. 作者:@愚民日记 地址:http://git.oschina.net/helyho/Voovan http://www.oschina.net/news/80909/

【服务器】构建高性能Linux网络服务器

关键 高性能网络服务器的关键在于并发,如何高效的使用多核心的服务器,让多个线程并发处理程序. 并发方式 基于时间的并行 基于空间的并行, 其他提法, 在计算机内部,最本质的是时间(CPU)和空间(内存)这两种资源,各种并行的界限并没有那么明显.所谓基于时间的并行,有两只猫,共同看守一个大仓库,但一个工作,另一个睡觉,两者不同时工作.所谓基于空间的并行,将仓库分为两个部分,这样两只猫可以分别看守不同的部分,两只猫在工作不紧张的时候就可以睡觉. 网络并发程序优化 对于网络并发程序,可以从各个角度进行

Android使用Google推荐的联网框架Volley,让连接网络更加简单

大家好,随着技术的进步,科技的发达,很少有应用是单机的了,大部分都需要联网访问服务器,以前我们都用 httpclient和httpurlconnection,感觉是不是非常麻烦,而Google特别为开发者考虑,推出了Volley,从此妈妈再也不担心我的联网问题了,哪里联不上联哪里,Volley让联网更容易和更快,并且Volley请求会异步执行,不阻挡主线程联网请求无非就是Get或者Post,我们很少用到DELETE这个请求方式,说了这么多废话,下面让我们看看Volley到底能干啥.它真的有这么神

工作中接触到的框架记录了解【网络文章翻译】

Backbone.js 优点:强大的社区和大量的势头. Underscore.js也是一个伟大的框架. 缺点:缺乏坚强的抽象和令人不满意.整个框架是出奇的轻巧,导致大量的样板.一个程序越大,这情况就越明显. Knockout.js 是一个MVVM框架,从它的支持者受到的好评很多.它强调声明UI绑定和自动更新用户界面. 优点:绑定的支持.大文件和惊人的导师制. 缺点:尴尬的绑定语法,缺乏坚实的视图组件层次结构.我想能够轻松地重复使用的组件.我也觉得像识别为MVVM框架是有害的.几乎没有这些框架的任

高性能Java网络框架 MINA

Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架.当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序开发.串口通讯程序(只在最新的预览版中提供),MINA 所支持的功能也在进一步的扩展中. http://loftor.com/archives/apache-mina-quick-st

基于Java Netty框架构建高性能的Jt808协议的GPS服务器(转)

原文地址:http://www.jt808.com/?p=971 使用Java语言开发一个高质量和高性能的jt808 协议的GPS通信服务器,并不是一件简单容易的事情,开发出来一段程序和能够承受数十万台车载接入是两码事,除去开发部标jt808协议的固有复杂性和几个月长周期的协议Bug调试,作为大批量794车载终端接入的服务端,需要能够处理网络的闪断.客户端的重连.安全认证和消息的编解码.半包处理等.如果没有足够的网络编程经验积累和深入了解部标jt808协议文档,自研的GPS服务器往往需要半年甚至

基于Spring4+SpringMVC4+Mybatis3+Hibernate4+Junit4框架构建高性能企业级的部标GPS监控平台

开发企业级的部标GPS监控平台,投入的开发力量很大,开发周期也很长,选择主流的开发语言以及成熟的开源技术框架来构建基础平台,是最恰当不过的事情,在设计之初就避免掉了技术选型的风险,避免以后在开发过程中,不断的填坑走弯路,以至于整个团队被坑埋掉.做GPS平台这么多年,以前就了解到一些开发团队过于关注某一种语言的优势,比如过于选用GO,Erlang,python,php等技术,最后团队熟悉这些技术的关键人员离职了,都没人接手,不能不说是个悲剧.所以说平台的技术架构选型要注重的是稳健,均衡而不是偏激,

Volley网络请求框架简析——Android网络请求框架(三)

题记-- 人来到这个世界上,只有两件事情,生与死, 一件事完了,另一件事还急什么? 有缘而来,无缘而去, 识自本心,见自本性 不起妄缘,无心无为 自由自在,动静自如 冷暖自知,则是修行 1.初始化一个消息请求队列以及网络请求工具类对象 /** * Created by androidlongs on 16/7/1. * 网络请求访问框架 */ public class VollyRequestUtils { /** * Volley框架使用工具类对象 */ private static Voll

高性能浏览器网络(High Performance Browser Networking) 第三章

第3章UDP篇 1980年8月,用户数据报协议(UDP)由John Postel添加到到核心网络协议族中,UDP协议起始于TCP/IP协议之后,但和TCP和IP规范被分裂成为两个独立的RFC的时间差不多.这个时机是非常重要的,因为正如我们将看到的,UDP重要的特点不是他带了什么新特性,而是他忽略了的那些特性.UDP(RFC 768)是通俗称为空协议,它描述的操作,基本上可以容纳在一张餐巾纸上. 数据报 一个自包含的,独立的数据实体,其承载了足够的信息,使其可以从源路由到达目标路由,而不依赖于在网