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延伸了驱动的功能。负责数据传输(send/receive)(仅仅要传输描写叙述符ring的元数据)。由于做到了zero copy,所以可以达到高性能。
send(read)系统调用步骤例如以下:
netmap send(read)的工作原理例如以下:
VALE原理
Netmap机制是实现VALE(Virtual local ethernet)高性能的核心所在。
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
[3]http://info.iet.unipi.it/~luigi/papers/20121026-vale.pdf
[4]《Unix 网络编程》
VALE作用于vSwitch的拓扑例如以下