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。code

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

和容器網絡的方案使用 vhost_user 做爲後端驅動同樣,要使得 virtio_user 和內核通訊,只需加載內核模塊 vhost.ko,讓它充當的是 virtio_user 的後端通訊驅動便可。blog

因此,咱們能夠看到,其實這兩種方案本質上是同樣,只是換了個後端驅動而已,這也是 virtio 的優點所在,定義一套通用的接口標準,須要什麼類型的通訊方式只需加載相應驅動便可,改動很是少,擴展性很是高。


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

相關文章
相關標籤/搜索