使用DPDK Vhost library加速虚拟化存储IO

作者简介:刘长鹏,Intel高级存储工程师, 主要研究方向为虚拟化,新存储介质应用,负责SPDK开发和社区维护。

文章转载自DPDK与SPDK开源社区

virtio是目前被广泛接受的I/O虚拟化的抽象设备接口,通过对virtqueue以及vring的定义实现了对不同虚拟化PCI设备的支持,目前对块设备的支持包括virtio_blk和virtio_scsi。

市场上使用的SSD设备如NVMe SSD现在基本都能达到几十万的IOPS,如Intel DCP4500 4TB NVMe SSD 在4KiB,队列深度256的随机读场景下性能可以到71万的IOPS。在一台服务器中放置4个高性能NVMe SSD就要消耗大量的CPU资源,而在CSP使用场景中,减少CPU的使用率可以提高VM密度,从而降低客户成本。下面我们就来看下NVMe SSD应用到虚拟化存储场景中的一些软件方案。

01.开源virtio_scsi虚拟化软件方案:

目前开源的virtio_scsi虚拟化方案:

图1 virito_scsi虚拟化方案
Qemu virtio_scsi Target: 这个方案是最早的virtio_scsi后端实现,在Qemu中直接处理来自Guest的I/O请求,Guest提交I/O到共享的virtqueue时触发VM_EXIT,Qemu捕获到异常,提取I/O队列中的request并解析出相应的SCSI命令后提交给后端的块设备;这个方案I/O processing是在Qemu中完成的,Qemu提交I/O到内核驱动时有一次user/kernel空间的切换,在I/O完成时,内核块驱动先要通知到Qemu,这里有一次kernel/user空间的切换,最后由Qemu去注入Guest中断完成I/O。

Vhost kernel Target: 相对于前面的Qemu方案,vhostkernel target方案主要做了2个方面的改进,Qemu virtio scsi target对I/O的处理是通过Qemu提交到具体的块设备的,这里kernel vhost scsi 把I/O processing部分直接移到内核的vhost驱动中完成,vhost直接解析到virtqueue中的SCSI命令,当Guest提交新的命令到virtiqueue时,产生的VM_EXIT会唤醒内核的I/O线程,该线程直接解析SCSI命令提交给LinuxI/O Target进行处理;另一个方面的改进,当I/O完成时,Kernel vhost_scsi方案直接通过KVM进行Guest中断注入,vhost kernel target方案减少了user/kernel间频繁的切换。

SPDK (http://spdk.io)vhost user scsi Taget: vhost user 方案是目前最新的演进方案,通过用户态的polling mode driver可以实现全用户态、端到端的I/O栈,我们知道在虚拟化中VM_EXIT是比较大的开销,vhost user方案可以消除GuestI/O提交时的VM_EXIT开销,并且通过用户态的I/Opolling实现减少CPU上下文切换,当然目前最后IO完成后中断注入跟kernel vhost scsi方案是一样的。

02.SPDK vhost user scsi方案

下面是vhost user方案架构图,Qemu定义了vhost通信协议(Master/Slave,docs/interop/vhost-user.txt)用来实现Qemu Slave和Master之间的消息通信,ioctl是Qemu和Kernel vhost方案的接口,而UNIX domain socket是Qemu和另外的User vhost进程间的通信接口,DPDK vhost library即该Master接口的一个实现,当I/O完成后通过event通知内核KVM注入中断到Guest。

图2:SPDK vhost user scsi方案
DPDK vhost library实现通用的vhost user消息接口,并对后端不同的设备类型如NET/SCSI/BLK/Crypto提供相同的抽象API接口,用户只需要实现具体设备协议如SCSI对vring中descriptors的定义即可,极大的提高了实现类似方案的灵活性。当然,这里提到的Guest基本上内置前端驱动,用来和后端的I/OTarget通信,另一方面,利用virtio已有的框架协议,可以方便的实现container方案,后端的vhost target保持不变,前端的Guest VM可以基于vhost slave创建virtiqueue,利用virtio协议实现I/Orequest的添加以及完成等待,实际上目前DPDK已经提供了NET设备的方案,这块可以继续扩展到其他的设备,如SCSI。

03.SPDK简介

用户可能对SPDK不是特别了解,SPDK(Storage Performance Development Kit, http://spdk.io基于BSD licensed 开源软件模块,提供了一组用于编写高性能,可扩展,用户态存储应用程序的工具和库。SPDK专为优化存储IO路径而设计。SPDK在Intel IA平台上提供了一系列运行在用户态的驱动(诸如用户态NVMe SSD的驱动,IOAT的驱动),这些驱动采用轮询模式运行,从而避免了频繁的内核上下文切换,并消除了中断处理的开销。基于用户态驱动,SPDK提供了一系列用户态的块存储设备(诸如基于NVMe驱动的块设备)和用户态的文件系统(blobfs),从而可以构建高性能的基于用户态的存储应用(例如iSCSI target,NVMe-oF target,vhost scsi/blk target)。

下面列出一组Flash Memory Summit 2017的一组vhostscsi demo数据:

当启动48个VM后,Vhost user scsi方案可以提供到9百万以上的IOPS,而内核vhost方案只能提供到3百万的IOPS。

DPDK同样提供了一个简单基于Memory的vhost user scsi例子可以让用户直接启VM并添加一个scsi块设备,参考doc/guides/sample_app_ug/vhost_scsi.rst和examples/vhost_scsi了解更多信息。

相关链接

https://www.flashmemorysummit.com/English/Collaterals/Proceedings/2017/20170810_FW32_Harris.pdf

http://spdk.io

https://www.dpdk.org


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/21118.html
分享到:
相关文章
条评论

登录后才可以评论

SDNLAB君 发表于18-07-10
0