DPDK virtio的不同路徑(二十八)

什麼是Vhost/Virtio

Vhost/Virtio是一種半虛擬化的設備抽象接口規範, 在Qemu和KVM中的得到了廣泛的應用,在客戶機操作系統中實現的前端驅動程序一般直接叫Virtio, 在宿主機實現的後端驅動程序稱爲Vhost。與宿主機純軟件模擬I/O相比,virtio可以獲得很好的性能,在數據中心中得到了廣泛的應用。Linux kernel中已經提供了相應的設備驅動,分別是virtio-net,以及vhost-net,DPDK項目爲了提高數據吞吐性能,相對應的,提供了Virtio的用戶態驅動virtio-pmd 和vhost的用戶態實現Vhost-user,下圖是一張典型的Virtio使用場景圖。
在這裏插入圖片描述

Vhost/Virtio 在DPDK中收發路徑配置

在DPDK的vhost/virtio 中,提供不同的Rx、Tx路徑供用戶使用,根據場景的不同,用戶可以根據自己的功能以及性能需求,來挑選合適的路徑。DPDK中,提供3條Tx、Rx路徑。

Mergeable 路徑

選擇 Mergeable接收路徑的優勢在於,vhost可以將available ring中獨立的mbuf組成鏈表來接收體量更大的數據包 。在實際應用中,這是被採用最多的路徑,也是DPDK開發團隊在過去幾個月中,性能優化的重點方向。該路徑採用的收發函數配置如下:

eth_dev->tx_pkt_burst = &virtio_xmit_pkts;
eth_dev->rx_pkt_burst = &virtio_recv_mergeable_pkts;

如想使用該路徑, 需要在Vhost 和Qemu連接協商的過程中,通過VIRTIO_NET_F_MRG_RXBUF功能標誌位來協商啓動。Vhost-user默認支持該功能,Qemu中啓用該功能的命令如下所示:

qemu-system-x86_64 -name vhost-vm1
…… 
-device virtio-net-pci,mac=52:54:00:00:00:01,netdev=mynet1,mrg_rxbuf=on \
……

DPDK 會根據這個功能標誌位,來選擇相應的rx函數:

if (vtpci_with_feature(hw, VIRTIO_NET_F_MRG_RXBUF))
     eth_dev->rx_pkt_burst = &virtio_recv_mergeable_pkts;
else
     eth_dev->rx_pkt_burst = &virtio_recv_pkts;

不同於Vector和No-mergeable路徑,rte_eth_txconf->txq_flags的值在Mergeable打開的情況下,並不會影響tx函數。

Vector

該路徑利用處理器中的SIMD指令集,對數據的收發進行向量化處理,在純IO數據包轉發使用場景中,能夠獲得最高的性能。在DPDK中,該路徑使用的收發函數如下:

eth_dev->tx_pkt_burst = virtio_xmit_pkts_simple;
eth_dev->rx_pkt_burst = virtio_recv_pkts_vec;

如想使用此收發路徑,需要符合以下條件:

  1. 平臺處理器支持相應指令集, X86平臺需要支持SSE3,DPDK中通過rte_cpu_get_flag_enabled(RTE_CPUFLAG_SSE3) 進行檢查,ARM平臺需要支持NEON,DPDK中通過rte_cpu_get_flag_enabled(RTE_CPUFLAG_NEON)檢查。
  2. RX方向的Mergeable需要關閉。DPDK會通過以下函數檢查:
!vtpci_with_feature(hw, VIRTIO_NET_F_MRG_RXBUF)

Qemu中關閉該功能命令如下:

qemu-system-x86_64 -name vhost-vm1
…… 
-device virtio-net-pci,mac=52:54:00:00:00:01,netdev=mynet1,mrg_rxbuf=off \
……
  1. Offload 功能沒有被啓用。包括:VLAN offload, SCTP checksum offload, UDP checksum offload, TCP checksum offload。
  2. rte_eth_txconf->txq_flags 需要設置爲1。 例如,在DPDK提供的testpmd程序中,可以在虛擬機中通過類似如下命令進行配置Virtio設備:
#testpmd -c 0x3 -n 4 -- -i --txqflags=0xf01

從以上條件可以看出,Vector路徑的功能相對有限,因而並沒有成爲DPDK 性能優化的重點方向。

No-mergeable 路徑

No-mergeable路徑在現實中較少使用,其收發路徑如下:

 eth_dev->tx_pkt_burst = &virtio_xmit_pkts;
 eth_dev->rx_pkt_burst = &virtio_recv_pkts

如想使用該路徑,需要符合如下配置:

  1. RX方向Mergeable關閉
!vtpci_with_feature(hw, VIRTIO_NET_F_MRG_RXBUF)
  1. rte_eth_txconf->txq_flags需要設置爲0,例如, 在DPDK提供的testpmd程序中,可以在虛擬機中通過類似如下命令進行配置Virtio 設備:
#testpmd -c 0x3 -n 4 -- -i --txqflags=0xf00

Vhost/Virtio 各路徑PVP性能比較

在這部分,我們將比較一下DPDK 中vhost/virtio各收發路徑 在PVP測試下的表現。PVP測試場景如下圖所示,主要測試的是虛擬化環境中南北向的數據轉發能力。Ixia發包器以10Gbps線速將64B數據包發送給網卡,物理機中的testpmd調用Vhost-User將數據轉發進虛擬機中,虛擬機中的testpmd調用virtio-user將接收到數據轉發回物理機,最終數據包回到IXIA, 數據路徑爲:

IXIA→NIC port1→Vhost-user0→Virtio-user0→NIC port1→IXIA

在這裏插入圖片描述
以DPDK 17.05 爲例,在IO 轉發配置下,不同路徑的轉發性能比較如下(以Mergeable爲基準):
在這裏插入圖片描述
可以看到,在純IO轉發的情況下,Vector具有最好的吞吐量,比Mergeable高出了近15%。
在MAC轉發配置下,不同路徑的轉發性能比較如下(以Mergeable爲基準):
在這裏插入圖片描述
在MAC轉發的情況下,3個收發路徑的性能基本相同,因爲Mergeable路徑可以提供更多的功能,我們推薦在此情況下,使用Mergeable 路徑。

下圖,是在X86平臺上,DPDK16.07以來的各個版本PVP MAC轉發的性能趨勢,可以看到,因爲Mergeable路徑具有更廣泛的應用場景,自16.07以來,DPDK的工程師針對Mergeable 路徑,進行了很多的優化工作,此路徑的PVP性能已經提升了將近20%。

在這裏插入圖片描述
Note:* 在DPDK16.11的性能下降,主要是由於添加新功能帶來的性能開銷,例如Vhost Xstats,Indirect descriptor table等

原文鏈接:https://www.syswift.com/202.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章