支持不同的总线,例如 vhost-vdpa和virtio-vdpa。 `$ vdpa dev add mgmtdev vdpasim_blk name vdpa0# `vdpa0` is attached to the first vDPA bus driver loaded $ driverctl -b vdpa list-devicesvdpa0 virtio_vdpa# change the `vdpa0` bus to `vhost-vdpa` 迁移总线vdpa0 - > vhost-vdpa$ driverctl -b vdpa set-override vdpa0 vhost_vdpa# `vdpa0` is now attached to the `vhost-vdpa 此补丁引入了软件 vDPA 总线,它抽象了 vDPA 设备、vDPA 总线驱动程序的通用属性以及 vDPA 设备抽象和 vDPA 总线驱动程序之间的通信方法 (vdpa_config_ops)。
,配合dpdk中的vpda运行,dpdk再调用厂商开发的用户态vdpa驱动,另一种是vhost-vdpa,通过ioctl调用到内核通用vdpa模拟,通用vdpa模块再调用厂商硬件专有的vdpa驱动。 用dpdk中的vdpa示例程序配置,说明需要把vdpa示例程序集成到ovs-dpdk中,实现vdpa/openflow/vxlan offload,如果用ovs-kernel那么用内核vdpa通用框架即可 VDUSE vdpa可以由硬件实现,intel有自己的硬件驱动,mellanox有自己的硬件驱动,硬件驱动生成一个vdpa_device,挂载到vdpa_bus上。 我理解好处就是硬件支持vdpa用硬件的,硬件不支持用软件实现的vdpa,屏蔽底层差异,软件实现在用户态更简单,很多硬件实现了网络io vdpa加速,但目前没有看到硬件实现存储io vdpa加速,字节跳动提出的 vdpa。
以前提到过vdpa,只有mellanox connectx-5网卡,不支持vdpa,公司最近来了mellanox DPU,也就是bluefield-2,自带connectx-6网卡,硬件支持vdpa,再分析一下看怎么个搞法 ,配合dpdk中的vpda运行,dpdk再调用厂商开发的用户态vdpa驱动,另一种是vhost-vdpa,通过ioctl调用到内核通用vdpa模拟,通用vdpa模块再调用厂商硬件专有的vdpa驱动。 用dpdk中的vdpa示例程序配置,说明需要把vdpa示例程序集成到ovs-dpdk中,实现vdpa/openflow/vxlan offload,如果用ovs-kernel那么用内核vdpa通用框架即可 我理解好处就是硬件支持vdpa用硬件的,硬件不支持用软件实现的vdpa,屏蔽底层差异,软件实现在用户态更简单,很多硬件实现了网络io vdpa加速,但目前没有看到硬件实现存储io vdpa加速,字节跳动提出的 vdpa。
在Redhat提出硬件vDPA架构之前,Mellanox实现了软件vDPA(即VF Relay)。 Qemu支持两种方式的vDPA,一种是vhost-user,配合DPDK中的vDPA运行,DPDK再调用厂商用户态vDPA驱动;另一种方式是vhost-vdpa,通过ioctl调用到内核通用vDPA模块 ,通用vDPA模块再调用厂商硬件专有的vDPA驱动。 2) 硬件vDPA: 硬件vDPA实际上是借助virtio硬件加速,以实现更高性能的通信。由于控制面复杂,所以用硬件难以实现。 厂商自己开发驱动,对接到用户空间DPDK的vDPA和内核vDPA架构上,可以实现硬件vDPA。
不熟悉 vDPA 内核框架,请参阅我们的vDPA 内核框架和用于内核子系统交互的 vDPA 总线驱动程序简介博客,以熟悉vDPA 总线、vDPA 总线驱动程序和vDPA 设备等概念,因为我们假设读者很熟悉以及本博客中的这些主题 内核中的VDUSE模块负责桥接VDUSE守护进程和vDPA框架,以便用户空间vDPA设备可以在vDPA框架下工作,它包含三个功能模块:VDUSE 使用char 设备接口将 vDPA 配置操作和内存映射信息中继到用户空间 vDPA 设备将VDUSE 模块连接到 vDPA 框架,通过将其附加(通过实现通用 vDPA 总线操作)到 vDPA 总线,VDUSE 模块可以接收来自 vDPA 框架的控制消息,然后 VDUSE 模块可以对其进行处理 目前,vDPA 内核框架支持两种类型的 vDPA 总线驱动程序:virtio-vdpa(用于容器)和vhost-vdpa(用于虚拟机, 如QEMU中的GUEST)如果您想通过 VDUSE 为容器工作负载提供接口 ,则 vDPA 设备应与 virtio-vdpa 绑定(如下所示)。
在驱动程序Probe探测期间,将创建一个新容器,使用此容器 vDPA 驱动程序可以使用 VM 的内存区域信息对 DMA 重映射表进行编程。 SW 协助 vDPA 实时迁移。 先决条件 具有 IOMMU 功能的平台。 , ifcvf_vdpa.c -> net/ifcvf:添加 ifcvf vDPA 驱动程序,IFCVF vDPA(vhost 数据路径加速)驱动程序为 Intel FPGA 100G VF(IFCVF 由于 vDPA 驱动程序需要设置 MSI-X 向量来中断客户机,因此目前仅支持 vfio-pci RTE_PMD_REGISTER_PCI(net_ifcvf, rte_ifcvf_vdpa) static ) rte_kvargs_process(kvlist, IFCVF_VDPA_MODE, &open_int, &vdpa_mode) list = rte_zmalloc("ifcvf
其主要差别在于:其一,支持vdpa的设备驱动通过rte_vdpa_register_device函数注册了rte_device和支持的功能接口到vdpa_device_list链表中,如此应用程序可以通过 vdpa” 目录下,该部分代码实现的功能主要通过上述的rte_vdpa_register_device来对vhost 设备呈现并产生关联。 这里以ifc驱动的为例,将其主要机制概述如下: 匹配设备并调用vdpa设备驱动进行初始化; “DPDK/drivers/vdpa/ifc” 目录下为Intel的SmartNIC的对应vdpa 在ifcvf_pci_probe函数中,即会调用rte_vdpa_register_device来注册vdpa设备和函数接口; 2. vhost机制获取注册的vdpa设备并在frond-end建链时关联 DPDK代码中现可跑起来的vdpa的example在 “DPDK/examples/vdpa” 目录下。可以通过编译DPDK时由 “-Dexamples=vdpa” 来指定编译,并参考37.
还有一些补丁集我们之前没有介绍过,其中有一个关于vDPA的 vDPA: API for reporting IOVA range: 这个补丁集导出了一个API,可以向用户态程序报告IOVA范围。 这个补丁比较简单,但我们正好借此机会简单介绍下vDPA (Virtual data path acceleration): vDPA本质上是一种标准化的方法用来设计SRIOV的网卡。 我们在上面的vDPA中提到了控制面,但那个并不是VIRTIO控制面。 而且VIRTIO full offload也会带来产品的同质化,不利于厂商做差异化功能,这样才有了vDPA。 ? vDPA的控制面可以简单看作是一个转换层。 但是vDPA的控制面可以将虚拟机的VIRTIO控制命令,通过vDPA定义的通用控制面接口转换为各个厂商自定义的接口。这只需要在主机端添加vDPA设备厂商提供的vDPA addon驱动即可。
vDPA(vhost Data Path Acceleration)即是让virtio数据平面不需主机干预的解决方案。 总体来看,vDPA的数据平面与SR-IOV设备直通的数据平面非常接近,并且在性能数据上也能达到后者的水准。 更重要的是vDPA框架保有virtio这套标准的接口,使云服务提供商在不改变virtio接口的前提下,得到更高的性能。 需要注意的是,vDPA框架中利用到的硬件必须至少支持virtio ring的标准,否则可想而知,硬件是无法与前端进行正确通信的。另外,原先软件交换机提供的交换功能,也转而在硬件中实现。 ? 图 4 vDPA架构 5.总结 纵观virtio网络的发展,控制平面由最原始的virtio到vhost-net协议,再到vhost-user协议,逐步得到了完善与扩充。
vdpa ? vfio控制iommu的代码,vdpa需要自己开发,内核中没有upstream,控制面利用vhost协议,vhost再调用vhost-vdpa,vhost-vdpa调用硬件厂商提供的接口把控制信息下放到硬件中 这种方法硬件网卡直接把包DMA到guest中了,问题是kick和call还是很麻烦,kick到了kvm,kvm通知vhost-vdpa,vhost-vdpa调用硬件驱动通知硬件。 硬件call时中断给了硬件驱动,硬件驱动通知vhsot-vdpa,vhost-vdpa通知kvm,kvm把中断注入guest,如果guest用dpdk poll mode driver,kick和call vdpa就是zero-copy。
默认是应用层驱动都编译,如果目标机网卡不支持需要将默认编译的驱动去掉比如: meson build -Ddisable_drivers=net/mlx5,crypto/mlx5,compress/mlx5,vdpa true -Dcpu_instruction_set=broadwellmeson build -Ddisable_drivers=net/mlx5,crypto/mlx5,compress/mlx5,vdpa
为了将 virtio 和 VFIO 的优势结合,2020 年,vDPA(Virtio Data Path Acceleration)技术框架被合入 Linux 内核主线。 通过 VDUSE,开发者可以在一个用户进程中实现一个软件定义的 vDPA 设备,并可以通过 vDPA 框架接入 virtio 或者 vhost 子系统,供容器或者虚机使用。 在初始化之后,VDUSE 设备可以通过 VDPA_CMD_DEV_NEW 这条 netlink 消息绑定到 vDPA 总线。
vDPA(硬件) 是virtio的半硬件虚拟化实现。该框架由Redhat提出,实现了virtio数据平面的硬件卸载。 在硬件vDPA架构中,通过OVS转发的流量首包依然由主机上的OVS转发平面处理,对应数据流的后续报文由硬件网卡直接转发。 在性能方面能够接近SR-IOV设备直通的数据平面。 通常情况下,以性能为中心的应用程序利用SR-IOV加速,数据密集程度较低的应用使用virtio接口或者硬件vDPA。
属性的高级功能: • 大数据加速:支持Spark过滤算子下推 • 裸金属:裸金属业务发放、回收、冷迁移;电源状态管理、网络端口热插拔;云盘扩容/热插拔、云盘单盘限速;网络和存储卸载 • 虚机管理:内核态vDPA
1.2 基于硬件加速的virtio-blk方案 基于vDPA架构的virtio-blk硬件卸载 由于virtio机制通过硬件实现加速已经是通用做法,所以利用这个优势,virtio-blk 在2021年KVM论坛会议中,Redhat提出统一软硬件卸载virtio-blk方案,正式将virtio-blk加入vDPA框架,同virtio-net公用相同的框架,来完成硬件卸载控制平面。
pci_vsc_init mlx5_init_one mlx5_init_one_devl_locked -> net/mlx5:轻探测本地 SF 如果用户想要配置 SF,例如:仅使用 vdpa 这些 SF 的 enable_* devlink 参数的默认值设置为 false vdpa: https://www.redhat.com/en/blog/introduction-vdpa-kernel-framework , cx6 vdpa 虚拟io硬件卸载: https://wangzheng422.github.io/docker_env/notes/2021/2021.10.cx6dx.vdpa.offload.html CAP_QOS, MLX5_CAP_DEBUG, MLX5_CAP_DEV_MEM, MLX5_CAP_DEV_EVENT, MLX5_CAP_TLS, MLX5_CAP_VDPA_EMULATION
那么vhost-net/vhost-user/vhost-vdpa时有时怎么处理NetClientState的?
4.7.2节——virtio网络半虚拟化简介 第四章云网络4.7.3节——Vhost-net方案 第四章云网络4.7.4节vhost-user方案——virtio的DPDK卸载方案 第四章云网络4.7.5节vDPA
4.7.2节——virtio网络半虚拟化简介 第四章云网络4.7.3节——Vhost-net方案 第四章云网络4.7.4节vhost-user方案——virtio的DPDK卸载方案 第四章云网络4.7.5节vDPA
腾讯智能网卡采用FPGA+SoC架构,网络加速技术实现方面自研vDPA,支持VIRTIO-net卸载,能够实现虚拟化性能零损耗,数据面直通,软硬结合跟踪脏页的功能。 4.7.2节——virtio网络半虚拟化简介 第四章云网络4.7.3节——Vhost-net方案 第四章云网络4.7.4节vhost-user方案——virtio的DPDK卸载方案 第四章云网络4.7.5节vDPA