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其實就是一個虛擬本地以太網交換機。它給它的每個 用戶(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的拓撲如下
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章