DPDK系列之六:qemu-kvm網路後端的加速技術
一、前言
在文章《DPDK系列之五:qemu-kvm網路簡介》中可以看到qemu-kvm為不同需求的虛擬機器提供了不同的網路方案,這些網路方案的效能最終都取決於位於宿主機上的網路backend的實現方式。本文對於不同的backend技術進行分析。
轉載自https://blog.csdn.net/cloudvtech
二、qemu-kvm網路後端加速
2.1 全模擬網絡卡
在最早的qemu的實現中,模擬了一個標準的e1000網絡卡,網路所有的行為都由qemu的服務程序進行模擬;但是虛擬機器在收發包的時候,需要guest進行io和mmio等操作,使得虛擬機器不斷進行ring級別的切換,效能損失嚴重。
2.2 virtio加速技術
為了解決全模擬網絡卡的效能缺陷,virtio技術得以發展,這個準虛擬化技術將前端模擬裝置virtio driver(如virtio-net)和宿主機上的後端服務virtio-backend通過virtqueue進行資料交換:
+---------+------+--------+----------+--+ | +------+ +----------+ | | user | | | | | | space | | | guest | | | | | | | | | +----+ qemu | | +-+------+ | | | | | | | virtio | | | | | | | | driver | | | | +------+ +-+---++---+ | | | | | | | ^ | | | v | v | | | | +-+-----+-----------------+--+-------+--+ | |tap | +------------+ kvm.ko | | | +-----+ +--+-------+ | | kernel | +---------------------------------------+
virtio技術減少了虛擬網絡卡的io操作,一定程度上提升了網路效能。但是從上圖可以看到virtio技術需要進出核心態的兩次切換開銷,效能還有提升空間。
2.3 vhost加速技術
vhost技術對virtio技術進行了進一步優化,引入vhost-backend,即將virtio-backend做成vhost-net.ko模組放置於核心中,有網路io請求的時候,KVM直接和這個核心模組進行通訊,進行一次使用者態到核心態的切換就可以完成資料傳輸,極大提升了虛擬網路效能:
+---------+------+--------+----------+--+ | +------+ +----------+ | | user | | | | | | space | | | guest | | | | | | | | | | qemu | | +-+------+ | | | | | | virtio | | | | | | | driver | | | +------+ +-+---++---+ | | | | | | | | v | | | +-+-----+---+-+----+------+----+--+-----+ | |tap | | vhost-net.ko| | kvm.ko | | +---^-+ +------+----^-+ +----+---+ | |-------| kernel |-----------| | +---------------------------------------+
2.4 vhost-user加速技術
隨著資料面加速技術如DPDK、大頁記憶體、處理器隔離等技術的引入,使用者態的網路資料處理能力得到了很大的提升,所以在vhost技術中又引入了使用者態的vhost-backend叫做vhost-user,這個後端和virtio-backend一樣執行在使用者態。在南北向通訊的時候,收發資料包也需要進出核心兩次,所不同的是vhost-user可以支援如大頁、零拷貝、NUMA local、CPU pin、DPDK眾多資料面優化技術來進一步加速虛擬機器資料包的收發路徑:
+---------------+------+--+----------+--+
| +------+ +----------+ |
| user | | | | |
| space | | | guest | |
| | | | | |
| +-+-------+ | qemu | | +-+------+ |
| | vhost | | | | | virtio | |
| | backend | | | | | driver | |
| +---------+ +------+ +-+---++---+ |
| | |
| ^ | |
| | v |
| | |
+------------------------------+--+-----+
| +-----------------------+ kvm.ko |
| +--+-----+
| kernel |
+---------------------------------------+
而在東西向通訊的時候,如果通訊的虛擬機器在同一個宿主機上,這直接可以通過vhost技術在使用者態進行通訊。
轉載自https://blog.csdn.net/cloudvtech
三、vhost-user使用DPDK加速
OVS可以和vhost-user一起工作,為基於bridge模式的後端提供加速:
而通過使用OVS-DPDK,可以讓虛擬機器網路介面不變的情況下,享受宿主機使用DPDK快速通道帶來的資料面速度提升。
但是更進一步,虛擬機器裡面也可以是執行DPDK,從而建立從虛擬機器應用程式到宿主機網絡卡的基於DPDK的快速資料通路:
但是在宿主機是否開啟OVS-DPDK以及虛擬機器是否開啟DPDK的組合中,效能存在如下組合關係:
而在虛擬機器和容器混合部署的環境下,DPDK與OVS的結合可以提供更加靈活的資料面加速方案。
/root/openvswitch-2.8.1/utilities/ovs-vsctl add-port br0 myportnameone -- set Interface myportnameone type=dpdkvhostuser options:dpdk-devargs=0000:02:06.0
/root/qemu-2.11.0/x86_64-softmmu/qemu-system-x86_64 -m 1024 -smp 1 -hda ./centos.qcow2 -boot c -enable-kvm -no-reboot -net none -nographic \
-chardev socket,id=char1,path=/usr/local/var/run/openvswitch/myportnameone \
-netdev type=vhost-user,id=mynet1,chardev=char1,vhostforce \
-device virtio-net-pci,mac=00:00:00:00:00:01,netdev=mynet1 \
-object memory-backend-file,id=mem,size=1G,mem-path=/dev/hugepages,share=on \
-numa node,memdev=mem -mem-prealloc \
-vnc :1 --enable-kvm \
-netdev tap,id=tapnet,ifname=vnet0,script=no -device rtl8139,netdev=tapnet,mac=52:54:00:12:34:58
轉載自https://blog.csdn.net/cloudvtech