我在上一篇文章也提到過,對於全虛擬化和半虛擬化,需要分配給虛擬機一個虛擬網絡接口,這些就需要一個虛擬交換機vswitch(可以和hypervisor一同使用),從而將虛擬網絡接口的數據包從物理接口轉發出去。但是在複雜的系統中,這個虛擬交換機的性能往往並不好。開源項目netmap[1]做了一個高性能網絡框架,並且同樣使用這個原理完成了高性能虛擬網絡交換機vale的設計[2],在多種場景下Vale測量的性能[3]也非常好。
Netmap
由於官網上介紹的已經很詳細了,我這裏簡單描述。那麼問題是程序是怎麼使用netmap機制的呢?通過在程序裏面打開一個特殊的文件/dev/netmap,獲得一個文件描述符,並且使用ioctl()系統調用選擇一個設備,然後應該可以獲取一塊region,然後使用mmap()將文件描述符對應的文件對應到那個region。
netmap是作爲內核模塊來實施的,主要包括兩部分。一是功能,實現了那些open,close,ioctl,poll/select等基本功能。另外一個是與設備相關的部分,netmap延伸了驅動的功能,負責傳輸數據(send/receive)(只要傳輸描述符ring的元數據)。因爲做到了zero copy,所以能夠達到高性能。
netmap send(read)的工作原理如下:
VALE原理
VALE作用於vSwitch的拓撲如下:
參考資料
[1]http://info.iet.unipi.it/~luigi/netmap/[3]http://info.iet.unipi.it/~luigi/papers/20121026-vale.pdf