首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >虚拟化硬件加速-vdpa

虚拟化硬件加速-vdpa

原创
作者头像
惠伟
修改2021-07-29 10:52:22
5.1K0
修改2021-07-29 10:52:22
举报
文章被收录于专栏:虚拟化笔记虚拟化笔记

惠伟:virtio+ovs转发原理和性能分析​zhuanlan.zhihu.com

惠伟:openstack网络设计-(三)ovs offload​zhuanlan.zhihu.com

以前提到过vdpa,只有mellanox connectx-5网卡,不支持vdpa,公司最近来了mellanox DPU,也就是bluefield-2,自带connectx-6网卡,硬件支持vdpa,再分析一下看怎么个搞法。

需求

虚拟机cpu加速有intel vt-x,memory加速有intel ept技术,剩下就是网络和存储io加速,io路径长,网络io路径是虚拟机virtio-ovs-vxlan-host内核协议栈出物理机,存储io是虚拟机virtio-qemu-host内核存储栈到ceph,io大量占用host上的cpu资源,而且性能低。

vdpa

vdpa是virtio控制面软件模拟,数据面硬件实现,控制面复杂用硬件实现难,数据面简单用硬件实现容易,厂商自己实现自己的驱动,数据是用dma mapping直接从虚拟机内存手动物理硬件上,硬件再vxlan处理或者对接ceph,听起来有点vfio-mdev的感觉,vfio只能处理pci通用结构和流程,vfio-mdev处理那些硬件实现不了sr-iov功能的设备,也就是硬件不能模拟出pci标准结构的哪些硬件,vfio-mdev给虚拟机假象以为自己独占硬件,虚拟机运行硬件驱动使用硬件,其实是在host的严密监视下共享硬件资源,由于硬件不同qemu中多多少少会有一些硬件相关的代码。vdpa基本virtio标准设备,肯定希望虚拟机中只运行中立的virtio驱动,qemu中只有vdpa厂商中立代码,厂商实现的vdpa驱动在技术栈最底层,所以说和vifo-mdev还是不一样。站在另一个角度考虑,vfio没有vhost中关于virtio的ioctl实现,vdpa两者都需要,如果qemu用了viommu,vhost也得支持viommu,vhost迟早得添加地址转换的ioctl,在这个基础上vhost再调用iommu实现硬件dma mapping的功能,所以vdpa复用vhost的ioctl和代码是最佳选择,以前看一些资料上写的vhost-vfio和vhost-mdev等,总之就是为把vhost和vfio ioctl结合在一起用的,都没能成功upstream代码。

vdpa厂商的驱动一种方式是运行在用户态,如dpdk中实现的vdpa驱动,另一方式运行在内核中,如intel的ifcvf和mellanox的mlx5,已经合入upstream内核。

VDPA support for Mellanox ConnectX devices

linux/drivers/vdpa/mlx5 at master · torvalds/linux

http://lkml.iu.edu/hypermail/linux/kernel/2008.1/02434.html

Linux kernel source tree

两种方式都需要qemu支持vdpa,一种是vhost-user,配合dpdk中的vpda运行,dpdk再调用厂商开发的用户态vdpa驱动,另一种是vhost-vdpa,通过ioctl调用到内核通用vdpa模拟,通用vdpa模块再调用厂商硬件专有的vdpa驱动。

  • 热迁移

如果硬件支持停止DMA并且有地方记录DMA写内存的dirty log,那么就可以热迁移,如果硬件不支持需要软件辅助。

[v1] vDPA software assisted live migration

[v4,00/10] support SW assisted VDPA live migration

  • software vdpa

mellanox connect5及以上支持,也叫vf relay,由于需要软件把virtio descriptor ring转换成mellanox dma descriptor ring,只能采用mellanox ovs-dpdk在用户态做转换,转换完了再由硬件offload加速,稍微影响性能。给硬件下offload的ovs可以运行在用户态也可以运行在内核态,但转换关系目前只有用户态的代码。

  • hareware vdpa

connectX 6及以上才支持,硬件支持ring的转换。用dpdk中的vdpa示例程序配置,说明需要把vdpa示例程序集成到ovs-dpdk中,实现vdpa/openflow/vxlan offload,如果用ovs-kernel那么用内核vdpa通用框架即可。

  • VDUSE

vdpa可以由硬件实现,intel有自己的硬件驱动,mellanox有自己的硬件驱动,硬件驱动生成一个vdpa_device,挂载到vdpa_bus上。也可以由软件实现,intel在内核写了一个vdpa_sim,用户态用软件模拟vdpa硬件就是VDUSE,用户态和内核态得建立通道,用户态通过这个通道给内核注册一个vdpa_device,这个device收到vpda控制信息转发给用户态,数据面通过用户态和内核态共享内存实现。我理解好处就是硬件支持vdpa用硬件的,硬件不支持用软件实现的vdpa,屏蔽底层差异,软件实现在用户态更简单,很多硬件实现了网络io vdpa加速,但目前没有看到硬件实现存储io vdpa加速,字节跳动提出的VDUSE借助内核vdpa框架统一了容器和虚拟机的存储,如果哪天硬件实现了存储io vdpa加速,线上切换到硬件方案相对来说比较容易。

Commits · bytedance/qemu

[RFC,v3,00/11] Introduce VDUSE - vDPA Device in Userspace

  • 测试

这两个链接很详细写着如何测试mellanox vdpa。

https://github.com/Mellanox/scalablefunctions/wiki/Upstream-how-to-use-SF-DPDK-vdpa-device

https://github.com/Mellanox/scalablefunctions/wiki/Upstream-how-to-use-SF-kernel-vdpa-device#12-load-vdpa-drivers

vdpa终极方案

更简单的方式就是bluefield2构造出virtio-net和virtio-blk,直接用vfio passthrough给虚拟机,网络和存储io问题都解决了,不知道能不能热迁移?理论上是可以的,virtio-net和virtio-blk是bluefield2模拟出来的,qemu和bluefield2交互肯定有办法读取virtio-net和virtio-blk的所有状态,接口和代码在哪里?已经和vdpa没什么关系了,又回到vfio,好处就是虚拟机加速和裸金属统一了。

总结

device emulation花样百出,新想法层出不穷,例如我的文章中从来没有提起过的vfio-user和muser,总之技术发展太快,刹也刹不住,感觉自己已经赶不上时代的脚步了。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 需求
  • vdpa
  • vdpa终极方案
  • 总结
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档