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,因此能夠達到高性能。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的拓撲例如如下
相關文章
相關標籤/搜索