前者是实现了vhost-switch的功能,可以为VM提供数据转发的功能;后者则是在DPDK框架中注册一个eth端口,其背后实际是一个vhost-net的设备,以实现像使用DPDK的普通eth设备(port)一样处理virtio的数据和报文---从该eth port发送的报文被放到vritqueue中由vhost-net对应的front-end驱动接收,该
在vhost_net 的方案中,由于 vhost_net 实现在内核中,guest 与 vhost_net 的通信,相较于原生的 virtio 方式性能上有了一定程度的提升,从 guest 到kvm.ko的交互只有一次用户态的切换以及数据拷贝。这个方案对于不同 host 之间的通信,或者 guest 到 host nic 之间的通信是比较好的,但是对于某些用户态进程间的通信...
如果我们对比一下基于内核实现的 vhost-net/virtio-net 架构,vhost-net 被替换成了 vhost-user,virtio-net 被替换成了 virtio-pmd。 借助host 用户态通过共享内存(bypass 掉 host 内核)对物理 NIC 直接访问的能力,并在 guest 用户态通过使用 virtio-pmd(bypass 掉 guest 内核),最终性能可以提升 2 到 4 倍。
一、什么是 vhost vhost 是 virtio 的一种后端实现方案,在 virtio 简介中,我们已经提到 virtio 是一种半虚拟化的实现方案,需要虚拟机端和主机端都提供驱动才能完成通信,通常,virtio 主机端的驱动是实现在用户空间的 qemu 中,而 vhost 是实现在内核中,是内核的一个模块 vhost-net.ko。为什么要实现在内核中,有什...
在vhost_net 的方案中,由于 vhost_net 实现在内核中,guest 与 vhost_net 的通信,相较于原生的 virtio 方式性能上有了一定程度的提升,从 guest 到 kvm.ko 的交互只有一次用户态的切换以及数据拷贝。这个方案对于不同 host 之间的通信,或者 guest 到 host nic 之间的通信是比较好的,但是对于某些用户态进程间的...
在vhost_net 的方案中,由于 vhost_net 实现在内核中,guest 与 vhost_net 的通信,相较于原生的 virtio 方式性能上有了一定程度的提升,从 guest 到 kvm.ko 的交互只有一次用户态的切换以及数据拷贝。这个方案对于不同 host 之间的通信,或者 guest 到 host nic 之间的通信是比较好的,但是对于某些用户态进程间的...
vhost-user库和vhost-net内核驱动程序之间的主要区别是通信通道。vhost-net内核驱动程序使用ioctl实现此通道,vhost-user库定义了通过unix套接字发送的消息结构。 可以将DPDK应用程序配置为提供unix套接字(服务器模式)并使QEMU连接到它(客户端模式),但是相反的情况也是可能的,这允许DPDK重新启动而无需重新启动VM。
vhost进一步优化了virtio-net,内核引入vhost-net.ko模块,使得网络数据可以在内核态处理,只进行一次切换,显著减少了数据传输的延迟,称为vhost-kernel。这使得网络性能得到了显著提升。而vhost-user则是vhost的进一步发展,将部分驱动操作移到用户态,通过snabbswitch(用户空间的网络驱动)直接操控物理网卡,...
在vhost-user库中,QEMU通过执行重要操作配置数据平面卸载:功能协商、内存区域配置、vring配置以及发送通知。Vhost-user库与vhost-net内核模块之间共享内存区,处理数据包,并直接与客户机之间发送和接收通知,无需QEMU介入。QEMU的virtio设备模型实现两个关键任务:模拟一个virtio设备,显示在客户机的特定PCI...
vhost技术对virtio-net进行了优化,在内核中加入了vhost-net.ko模块,使得对网络数据可以在内核态得到处理。 图中描述了vhost的io路径: guest发出中断信号退出kvm,kvm直接和vhost-net.ko通信,然后由vhost-net.ko访问tap设备。 这样网络数据只需要经过从用户态到内核态的一次切换,就可以完成数据的传输。大大提高了虚拟...