一、vfio-user 原理
1. 中断实现
vhost-user和vfio-user同样使用eventfd实现中断。
2. dma
vfio-user可以和vhost-user一样使用unix socket传送memory fd给device进程mmap实现dma,也可以通过unix socket通道消息传递请求。
二、项目发展历程
目前 vfio-user 只支持 nvme,spdk在v21.01(2021/1/28)开始支持,qemu在v7.1.0(2022/8/30)初步支持,backport的工作量大概十几个patch。社区在2020年开始讨论vfio-user的RFC,在2021年和 2022 年开始进入主流社区的mainline,发展不超过3年,可以认为目前处于较早期,想法已经成熟,但是未经过大规模生产环境的验证。
vhost-user-scsi 在spdk v17.03(2017/3/23)、qemu v2.10.0(2017/8/30)引入,vhost-user-blk 在spdk v17.07(2017/7/31)、qemu v2.12.0(2018/4/24)引入。vhost-user 进入社区mainline已经5-6年,已经有大量云厂商在产品中使用,可以认为已经非常成熟。
三、功能完善性
1. 热迁移
1.1 vhost-user
支持
1.2 vfio-user
vfio和vfio-user在qemu mainline代码中有对热迁移的支持,在 qemu v5.2.0(2020/12/8)实现 v1 版本,在qemu v7.3.0(upcoming)实现 v2 版本,目前热迁移功能仍是实现性质,热迁移功能社区主要是nvidia在推动。
cf254988a5 vfio: Make migration support experimental
31bcbbb5be vfio/migration: Implement VFIO migration protocol v2
1.2.1 热迁移原理
源端qemu发起控制请求,让device进入stop-and-copy状态,之后在迁移过程中qemu一直维护着这个状态机,然后源端device进程把设备状态保存到bar9,qemu实现设备的vmstate读取设备状态结构体随虚机以前迁移到目的端,最后由目的端device进程恢复设备状态。
2. device热升级
vhost-user 在 spdk 中提供热升级支持
vfio-user nvme 协议层面支持重连
3. 挂盘数目
nvme spec并未对单个controller挂盘数目作出限制,理论上支持一个 controller(即pci function)挂无限多个namespace,实际使用中取决于资源情况
vhost-user-blk只支持挂32-11=21块盘
vhost-user-scsi 支持挂载26+26^2+26^3=18278块盘(kernel盘符限制,SCSI协议理论上限是256 target * 16384 LUN/target = 4194304),但是性能无法线性扩展。
四、优化和硬件加速实现难度
virtio-1.1 加入了:
packed virtqueue,每个IO请求减少了数次cache miss。virtio-1.0的cache miss较多的原因,主要因为:1. 元数据分散存放在多个地方;2. 描述符链表在内存中并非连续;3. 多个地方有cache contention。
in order completion,可以批量notify,性能更高,逻辑更简单,更利于软件优化。
支持硬件SRIOV和vDPA,结合packed virtqueue和in order completion,利于硬件加速。
五、性能
vhost-user-scsi因为协议限制无法多核线性扩展性能,vfio-user和vhost-user-blk都具有多核性能线性扩展性。
单核性能无优势
六、灵活性
vfio-user 可以运行在另一台虚机里面,非dma方式,损失性能。vfio-user除了使用unix socket作为信道,也可以使用tcp socket和vsock等其他信道,但是都无法dma。
七、其它
virtio为半虚拟化,vfio-user为全虚拟化
OS driver 对比
vhost-user: linux builtin driver,windows没有builtin driver,只能使用社区的第三方驱动。
vfio-user: 主流 OS 都 builtin nvme driver。
八、总结
基于vfio-user的nvme device,相对于vhost-user-scsi有更好的多核性能的扩展性,相对于vhost-user-blk可以给虚机挂载更多的盘,虚机内部有主流OS的内置驱动,具有更好的跨平台兼容性,但项目仍不够成熟,无法简单产品化使用,还需比较多的开发才有可能用在生产环境中。
参考:
https://lore.kernel.org/all/MN2PR02MB62052E54C752229C115EAD898BCF0@MN2PR02MB6205.namprd02.prod.outlook.com
https://www.mail-archive.com/qemu-devel@nongnu.org/msg723794.html
https://lore.kernel.org/all/20220224142024.147653-10-yishaih@nvidia.com/
https://spdk.io/news/2021/05/04/vfio-user
https://github.com/nutanix/libvfio-user
https://github.com/spdk/spdk
https://gitlab.com/qemu-project/qemu
https://www.kernel.org/doc/html/latest/driver-api/vfio.html
https://www.snia.org/sites/default/files/SDC/2021/pdfs/SNIA-SDC21-Walker-High-Performance-NVMe-Virtualization-with-SPDK-and-vfio-user.pdf