DPDK virtio-user


本文首發於我的公眾號 Linux雲計算網絡(id: cloud_dev),專注於干貨分享,號內有 10T 書籍和視頻資源,后台回復「1024」即可領取,歡迎大家關注,二維碼文末可以掃。

virtio-user 是 DPDK 針對特定場景提出的一種解決方案,它主要有兩種場景的用途,一種是用於 DPDK 應用容器對 virtio 的支持,這是 DPDK v16.07 開始支持的;另一種是用於和內核通信,這是 DPDK v17.02 推出的。

virtio_user 用於容器網絡

我們知道,對於虛擬機,有 virtio 這套半虛擬化的標准協議來指導虛擬機和宿主機之間的通信,但對於容器的環境,直接沿用 virtio 是不行的,原因是虛擬機是通過 Qemu 來模擬的,Qemu 會將它虛擬出的整個 KVM 虛擬機的信息共享給宿主機,但對於 DPDK 加速的容器化環境來說顯然是不合理的。因為 DPDK 容器與宿主機的通信只用得到虛擬內存中的大頁內存部分,其他都是用不到的,全部共享也沒有任何意義,DPDK 主要基於大頁內存來收發數據包的。

所以,virtio_user 其實就是在 virtio PMD 的基礎上進行了少量修改形成的,簡單來說,就是添加大頁共享的部分邏輯,並精簡了整塊共享內存部分的邏輯。

有興趣可以對照 /driver/net/virtio 中的代碼和 DPDK virtio_user 代碼,其實大部分是相同的。

從 DPDK 的角度看,virtio_user 是作為一個虛擬設備(vdev)來加載的,它充當的是一個 virtio 前端驅動,與之對應的后端通信驅動,是用戶態的 vhost_user,在使用的時候,我們只需要定義好相應的適配接口即可,如下:

vhost 和 vhost_user 本質上是采用共享內存的 IPC 方式,通過在 host 端創建 vhost_user 共享內存文件,然后 virtio_user 啟動的時候指定該文件即可,如:

1)首先創建 vhost_user 共享內存文件
--vdev 'eth_vhost_user0,iface=/tmp/vhost_user0'
2)啟動 virtio_user 指定文件路徑
--vdev=virtio_user0,path=/tmp/vhost_user0

virtio_user 作為 exception path 用於與內核通信

virtio_user 的一個用途就是作為 exception path 用於與內核通信。我們知道,DPDK 是旁路內核的轉包方案,這也是它高性能的原因,但有些時候從 DPDK 收到的包(如控制報文)需要丟到內核網絡協議棧去做進一步的處理,這個路徑在 DPDK 中就被稱為 exception path。

在這之前,已經存在幾種 exception path 的方案,如傳統的 Tun/Tap,KNI(Kernel NIC Interface),AF_Packet 以及基於 SR-IOV 的 Flow Bifurcation。這些方案就不做過多介紹了,感興趣的可看 DPDK 官網,上面都有介紹。

和容器網絡的方案使用 vhost_user 作為后端驅動一樣,要使得 virtio_user 和內核通信,只需加載內核模塊 vhost.ko,讓它充當的是 virtio_user 的后端通信驅動即可。

所以,我們可以看到,其實這兩種方案本質上是一樣,只是換了個后端驅動而已,這也是 virtio 的優勢所在,定義一套通用的接口標准,需要什么類型的通信方式只需加載相應驅動即可,改動非常少,擴展性非常高。


我的公眾號 「Linux雲計算網絡」(id: cloud_dev) ,號內有 10T 書籍和視頻資源,后台回復 「1024」 即可領取,分享的內容包括但不限於 Linux、網絡、雲計算虛擬化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++編程技術等內容,歡迎大家關注。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM