searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

vfio-user和vhost-user对比

2023-06-19 04:20:14
391
0

一、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

0条评论
0 / 1000
l****n
3文章数
0粉丝数
l****n
3 文章 | 0 粉丝
l****n
3文章数
0粉丝数
l****n
3 文章 | 0 粉丝
原创

vfio-user和vhost-user对比

2023-06-19 04:20:14
391
0

一、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

文章来自个人专栏
块存储前端
3 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0