DPDK編程指南(翻譯)( 二十七)

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_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è)置/清除。
  • 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》。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容