DPDK vhost庫

原創翻譯,轉載請註明出處。網絡

 

vhost庫實現了一個用戶空間的virtio net server,容許用戶直接處理virtio ring隊列。換句話說,它讓用戶能夠從VM virtio網絡設備讀取或寫入數據包,爲了達到這個目的,vhost庫應該能夠:session

  • 訪問客戶虛擬機內存,對於QEMU,這個是經過設置 -objectmemory-backend-file,share=on,...選項。這意味着QEMU將會在客戶虛擬機的內存裏建立一個文件,share=on 選項容許其餘進程訪問這個文件,也就意味着能訪問客戶虛擬機內存。
  • 知道vring全部必需的信息,如可用的ring存儲在哪裏,vhost定義了一些消息,經過Unix domain socket文件來通知後臺全部的信息,這樣就知道如何去處理這個vring了。


vhost API概述dom


rte_vhost_driver_register(path, flags) 這個函數主要是向系統註冊vhost驅動,path 是指定Unix domain socket文件路徑。
當前支持的flags有:socket

  • RTE_VHOST_USER_CLIENT DPDK 若是設置了這個值,vhost-user將會做爲客戶端,下面會有解釋。
  • RTE_VHOST_USER_NO_RECONNECT 當DPDK vhost-user做爲客戶端的話,它會一直嘗試重連服務端QEMU直到成功。這在下面2種狀況下很是有用:

    當QEMU尚未啓動時
    當QEMU重啓時(好比客戶操做重啓了)
    重連選項默認是開啓的。然而,這個flag會讓它關閉。ide

  • RTE_VHOST_USER_DEQUEUE_ZERO_COPY 如何設置了這個值,出隊零拷貝選項會被開啓。默認是關閉的。這有一些事實(包括限制)你須要知道當你要去設置這個值的時候:

      零拷貝對小數據包是不友好的(典型是報文長度小於512)。
      零拷貝在VM2VM的狀況下是很是好的。好比在2個VM之間運行iperf,在開啓了TSO的狀況下,提高到70%以上。
      對於VM2NIC的狀況,nb_tx_desc必須足夠的小,若是virtio間接特性沒開啓小於等於64,若是開啓了,小於等於128.這是由於當出隊零拷貝若是開啓了的話,客戶TX使用的vring,只有在對應的mbuf釋放了纔會更新。函數

     所以,nb_tx_desc必須是足夠小,只有這樣才能使PMD驅動及時的用完可用的Tx描述符和釋放mbuf。不然,客戶Tx vring會被餓死。
    性能

客戶內存基於巨頁內存會得到更好的性能。1G大小是最好的。當出隊零拷貝開啓了,客戶物理內存地址和主機物理地址的映射必須創建好。使用非巨頁內存意味着很是多的頁分段。ui

爲了簡化處理,DPDK vhost使用了線性查找這些段,所以段越小,就能越快的獲取到這個映射關係。舒適提示:未來會使用樹查找來提速。

rte_vhost_driver_session_start()                                       這個函數啓動vhost會話來輪詢處理vhost消息。這是個無限循環,所以應該放到一個專用線程裏來調用。
rte_vhost_driver_callback_register(virtio_net_device_ops)    這個函數註冊一系列回調函數,使得DPDK應用程序在事件發生的時候調用合適的函數。當前支持以下事件:spa

  • new_device(int vid)

    這個回調是在有一個virtio網絡設備處於就緒的時候調用,vid是這個virtio設備ID。線程

  • destroy_device(int vid)

    這個回調是在有一個virtio網絡設備關閉(或者鏈接斷開)的時候調用,vid是這個virtio設備ID。

  • vring_state_changed(int vid, uint16_t queue_id, int enable)

    這個回調是當指定的隊列狀態變化的時候(好比開啓或中止)調用。

rte_vhost_enqueue_burst(vid, queue_id, pkts, count)                      發送(入隊)count 個數量的數據包從主機到客戶虛擬機。
rte_vhost_dequeue_burst(vid, queue_id, mbuf_pool, pkts, count)     從客戶虛擬機接收(出隊)count個數量的數據包,並存儲在pkts上。
rte_vhost_feature_disable/rte_vhost_feature_enable(feature_mask)  這個函數關閉或開啓一些特性。舉個栗子,它能關閉可合併緩衝區和TSO特性,默認這2個是開啓的。

vhost-user的實現


vhos-user經過Unix domian socket來傳遞消息。這意味着DPDK vhost-user的實現有2個選項:
DPDK vhost-user做爲服務端
DPDK 會建立一個Unix domain socket服務文件並在它上面監聽鏈接。
注意:這是默認模式,在DPDK 16.07以後惟一的模式
DPDK vhost-user做爲客戶端
不像服務端模式,這個模式不建立socket文件,它只是嘗試去鏈接服務端。
當DPDK vhost-user應用程序重啓了,DPDK vhost-user會嘗試從新鏈接服務端。這就是reconnect特性是怎樣工做的。

注意:
    重連特性要求QEMU 2.7版本及以上。
    vhost支持的特性必須在重啓先後都徹底一致。舉個栗子,TSO關閉了而後開啓,不會有任何做用並可能發生未知問題。

無論哪一種模式,一旦鏈接創建了,DPDK vhost-user將會啓動接收並處理來自QEMU的vhost消息。
對於文件描述符的消息,文件描述符能夠直接在vhost進程裏,當它已經經過 Unix domain socket安裝了。
支持以下的vhost消息:

  1. VHOST_SET_MEM_TABLE
  2. VHOST_SET_VRING_KICK
  3. VHOST_SET_VRING_CALL
  4. VHOST_SET_LOG_FD
  5. VHOST_SET_VRING_ERR


對於VHOST_SET_MEM_TABLE消息,QEMU會發送每個內存區域的信息而且它的文件描述符在這個消息的輔助數據裏。這個文件描述就是用來映射這塊內存區域的。

VHOST_SET_VRING_KICK用來做爲信號將vhost設備放入到數據平面,VHOST_GET_VRING_BASE做爲信號去數據平面刪除vhost設備。
當socket鏈接關閉時,vhost會刪除這個設備。

vhost支持vSwitch參考手冊


參考DPDK Sample Application Guide。

相關文章
相關標籤/搜索