我在上一篇文章也提到过。对于全虚拟化和半虚拟化。需要分配给虚拟机一个虚拟网络接口,这些就需要一个虚拟交换机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延伸了驱动的功能。负责数据传输(send/receive)(仅仅要传输描写叙述符ring的元数据)。因为作到了zero copy,因此能够达到高性能。linux
send(read)系统调用步骤例如如下:
netmap send(read)的工做原理例如如下:
VALE原理
Netmap机制是实现VALE(Virtual local ethernet)高性能的核心所在。
VALE事实上就是一个虚拟本地以太网交换机。它给它的每个 用户(hypervisor或者process)提供一个虚拟的网络接口(可以经过netmap的api来訪问)。核心工做仍是在netmap backend端。需要在后端添加交换机的逻辑。比方转发学习逻辑。而后进一步优化。
VALE做用于vSwitch的拓扑例如如下:
编程
到现在为止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的那篇论文。而后略微浏览了下网页,认识不深入。写的过于简单。想进一步了解的去官网应该可以学到很是多~~
VALE做用于vSwitch的拓扑例如如下