VirtIO会牵扯到很多的概念,包括virtio-net
,vhost
,vhost-user
等等,下面简单的对其中一些概念进行记录。
VirtIO
是一个开放的通用接口标准,定义了虚机与设备之间通讯的规范。该规范包含了控制平面与数据平面的规范,控制平面用于数据平面的建立与终止,而数据平面则是真实的数据流通通道。
两个平面间有不少差异,数据平面对于性能的要求非常苛刻,而控制平面则需要良好的可扩展性。
在virtio
规范中,控制平面被实现于qemu
进程中,而数据平面则不是。
将数据平面的实现从qemu
进程中脱离出来,可以在内核态或者用户态实现数据平面的协议。
Virtio-net
是一个虚拟的以太网卡设备,它与宿主机之间通过virtio
协议进行通讯来实现数据交换。
为了提交交换效率,将处理virtio
的ring buffer
模块(也称之为数据平面)从用户态的qemu
进程中移动到内核中,避免过多的用户态和内核态之间的切换。
在这种实现中,一般都会提到前端和后端的概念。
virtio
接口称之为后端virtio
接口称之为前端对照实际的架构,vhost-net
就是运行在宿主机上的后端模块,而virtio-net
则是运行在虚机上的前端模块(虚拟网卡)。我们可以在创建虚机的时候开启多队列模式,让虚拟网卡拥有多队列,让不同的队列分配到不同的CPU核心上进行处理。
进一步提升效率,将内核态中的数据平面在用户态的程序中实现。用户态的程序通常借助dpdk
来获得直接操作网卡的能力。