===== vHost ===== QEMU实现的virtio网络后端带来的网络性能并不如意,究其原因是因为频繁的上下文切换, 低效的数据拷贝、线程间同步等。于是,内核实现了一个新的virtio网络后端驱动,名为 vhost-net。与之而来的是一套新的vhost协议。 vhost-user ---------- 基于vhost协议,DPDK设计了一套新的用户态协议,名为vhost-user协议. .. code-block:: text +-------------------------------------------+ | Qemu process | | | | +---------------------------------+ | | | Guest OS | | | | User | | | | +---------------------------+ | | | | Kernel | | | | +-------------+ | | | | | virtio-net | | | | | +-----+-^-----+ | | | | | | | | | +---------------------------------+ | | | | | | +-----v-+-----+ | | | vhost-user | | | +-------------+ | +-------------------------------------------+ Host User Space +-----------------------------------------------------+ Host Kernel Space vhost-net --------- - better than vhost-user vhost协议可以将允许VMM将virtio的数据面offload到另一个组件上,而这个组件正是 vhost-net。 QEMU会打开并初始化字符设备`/dev/vhost-net`,并调用ioctl来与vhost-net进行控制面 通信。 .. code-block:: text +-------------------------------------------+ | Qemu process | | | | +---------------------------------+ | | | Guest OS | | | | | | | | User | | | | +---------------------------+ | | | | Kernel | | | | +-------------+ | | | | | virtio-net | | | | | +-----+-^-----+ | | | | | | | | | +---------------------------------+ | | | | | +-------------------------------------------+ | | Host User Space | | +-----------------------------------------------------+ Host Kernel Space | | | | +-----v-+-----+ | vhost-net | +-------------+