27. Vhost 庫
Vhost庫實(shí)現(xiàn)了一個(gè)用戶空間virtio網(wǎng)絡(luò)服務(wù)器,允許用戶直接操作virtio。 換句話說,它允許用戶通過VM virtio網(wǎng)絡(luò)設(shè)備獲取/發(fā)送數(shù)據(jù)包。 為了達(dá)到這個(gè)功能,一個(gè)vhost庫需要實(shí)現(xiàn):
訪問guest內(nèi)存:
對于QEMU,這是通過使用 -object memory-backend-file,share=on,... 選項(xiàng)實(shí)現(xiàn)的。 這意味著QEMU將創(chuàng)建一個(gè)文件作為guest RAM。 選項(xiàng) share=on 允許另一個(gè)進(jìn)程映射該文件,這意味著該進(jìn)程可以訪問這個(gè)guest RAM。
知道關(guān)于vring所有必要的信息:諸如可用環(huán)形存儲鏈表的存儲空間。Vhost定義了一些消息(通過Unix套接字傳遞)來告訴后端所有需要知道如何操作vring的信息。
27.1. Vhost API 概述
以下是一些關(guān)鍵的Vhost API函數(shù)概述:
-
rte_vhost_driver_register(path, flags)
此函數(shù)將vhost驅(qū)動(dòng)程序注冊到系統(tǒng)中。path 指定Unix套接字的文件路徑。
當(dāng)前支持的flags包括:- RTE_VHOST_USER_CLIENT
當(dāng)使用該flag時(shí),DPDK vhost-user 作為客戶端。 請參閱以下說明。 - RTE_VHOST_USER_NO_RECONNECT
當(dāng) DPDK vhost-user 作為客戶端時(shí),它將不斷嘗試連接到服務(wù)端(QEMU),知道成功。 這在以下兩個(gè)情況中是非常有用的:- 當(dāng) QEMU 還沒啟動(dòng)時(shí)
- 當(dāng) QEMU 重啟時(shí)(如guset OS 重啟)
這個(gè)重新連接選項(xiàng)是默認(rèn)啟用的,但是,可以通過設(shè)置這個(gè)標(biāo)志來關(guān)閉它。
- RTE_VHOST_USER_DEQUEUE_ZERO_COPY
設(shè)置此flag時(shí)將啟用出隊(duì)了零復(fù)制。默認(rèn)情況下是禁用的。
在設(shè)置此標(biāo)志時(shí),需要知道以下原則:- 零拷貝對于小數(shù)據(jù)包(小于512)是不好的。
- 零拷貝對VM2VM情況比較好。對于兩個(gè)虛擬機(jī)之間的ipref,提升性能可能高達(dá)70%(當(dāng)TSO使能時(shí)).
- 對于VM2NIC情況,nb_tx_desc 必須足夠?。喝绻磫?dòng)virtio間接特性則 <=64,否則 <= 128。
這是因?yàn)?,?dāng)啟用出隊(duì)列零拷貝時(shí),只有當(dāng)相應(yīng)的mbuf被釋放時(shí),客戶端TX使用的vring才會被更新。 因此,nb_tx_desc必須足夠小,以便PMD驅(qū)動(dòng)程序?qū)⒑谋M可用的TX描述符,并及時(shí)釋放mbufs。 否則,guset TX vring將無mbuf使用。 - Guest的內(nèi)存應(yīng)該使用應(yīng)該使用huge page支持以獲得更好的性能。最好使用1G大小的頁面。
當(dāng)啟用出隊(duì)零拷貝時(shí),必須建立guest 物理地址和host物理地址之間的映射。 使用non-huge page則意味著更多的頁面細(xì)分。 為了簡單起見,DPDK vhost對這些段進(jìn)行了線性搜索,因此,段越少,我們得到的映射就越快。 注意:將來我們可能使用樹搜索來提升速度。
- RTE_VHOST_USER_CLIENT
rte_vhost_driver_set_features(path, features)
此函數(shù)設(shè)置vhost-user驅(qū)動(dòng)支持的功能位。 vhost-user驅(qū)動(dòng)可以是vhost-user net,但也可以是其他的,例如vhost-user SCSI。-
rte_vhost_driver_callback_register(path, vhost_device_ops)
此函數(shù)注冊一組回調(diào)函數(shù),以便在發(fā)生某些事件時(shí)讓DPDK應(yīng)用程序采取適當(dāng)?shù)牟僮鳌?目前支持以下事件:- new_device(int vid)
這個(gè)回調(diào)在virtio設(shè)備準(zhǔn)備就緒時(shí)調(diào)用,vid 是虛擬設(shè)備ID。 - destroy_device(int vid)
當(dāng)virtio設(shè)備關(guān)閉時(shí)(或vhost連接中斷),調(diào)用此函數(shù)處理。 - vring_state_changed(int vid, uint16_t queue_id, int enable)
當(dāng)特定隊(duì)列的狀態(tài)發(fā)生改變,如啟用或禁用,將調(diào)用此回調(diào)。 - features_changed(int vid, uint64_t features)
這個(gè)函數(shù)在feature改變時(shí)被調(diào)用。例如,VHOST_F_LOG_ALL 將分別在實(shí)時(shí)遷移的開始/結(jié)束時(shí)設(shè)置/清除。
- new_device(int vid)
rte_vhost_driver_disable/enable_features(path, features))
該函數(shù)禁用或啟用某些功能。例如,可以使用它來禁用可合并的緩沖區(qū)和TSO功能,這兩個(gè)功能默認(rèn)都是啟用的。rte_vhost_driver_start(path)
這個(gè)函數(shù)觸發(fā)vhost-user協(xié)商。它應(yīng)該在初始化一個(gè)vhost-user驅(qū)動(dòng)程序結(jié)束時(shí)被調(diào)用。rte_vhost_enqueue_burst(vid, queue_id, pkts, count)
傳輸(入隊(duì))從host到guest的 count 包。rte_vhost_dequeue_burst(vid, queue_id, mbuf_pool, pkts, count)
接收(出隊(duì))來自guest的 count 包,并將它們存儲在 pkts。
27.2. Vhost-user 實(shí)現(xiàn)
Vhost-user 使用Unix套接字來傳遞消息。這意味著DPDK vhost-user的實(shí)現(xiàn)具有兩種角色:
DPDK vhost-user作為server:
DPDK 將創(chuàng)建一個(gè)Unix套接字服務(wù)器文件,并監(jiān)聽來自前端的連接。
注意,這是默認(rèn)模式,也是DPDK v16.07之前的唯一模式。-
DPDK vhost-user最為client:
與服務(wù)器模式不同,此模式不會創(chuàng)建套接字文件; 它只是試圖連接到服務(wù)器(而不是創(chuàng)建文件的響應(yīng))。當(dāng)DPDK vhost-user應(yīng)用程序重新啟動(dòng)時(shí),DPDK vhost-user將嘗試再次連接到服務(wù)器。這是“重新連接”功能的工作原理。
注意:“重連” 功能需要 QEMU v2.7 及以上的版本。
vhost支持的功能在重新啟動(dòng)之前和之后必須完全相同。例如,如果TSO被禁用,但是重啟之后被啟用了,將導(dǎo)致未定義的錯(cuò)誤。
無論使用哪種模式,建立連接之后,DPDK vhost-user 都將開始接收和處理來自QEMU的vhost消息。
對于帶有文件描述符的消息,文件描述符可以直接在vhost進(jìn)程中使用,因?yàn)樗呀?jīng)被Unix套接字安裝了。
當(dāng)前支持的vhost 消息包括:
- VHOST_SET_MEM_TABLE
- VHOST_SET_VRING_KICK
- VHOST_SET_VRING_CALL
- VHOST_SET_LOG_FD
- VHOST_SET_VRING_ERR
對于 VHOST_SET_MEM_TABLE 消息,QEMU將在消息的輔助數(shù)據(jù)中為每個(gè)存儲區(qū)域及其文件描述符發(fā)送信息。 文件描述符用于映射該區(qū)域。
VHOST_SET_VRING_KICK 用作將vhost設(shè)備放入數(shù)據(jù)面的信號, VHOST_GET_VRING_BASE 用作從數(shù)據(jù)面移除vhost設(shè)備的信號。
當(dāng)套接字連接關(guān)閉,vhost將銷毀設(shè)備。
27.3. 支持Vhost的vSwitch
有關(guān)更多vhost詳細(xì)信息以及如何在vSwitch中支持vhost,請參閱《DPDK Sample Applications Guide》。