基于DPDK的设备虚拟化框架

作者:Xia Chenbo
文章来源: DPDK与SPDK开源社区

基于DPDK的设备虚拟化框架

随着全面上云的时代到来,云计算技术愈发呈现出其重要性。而在云计算技术中,I/O虚拟化技术又是十分重要的一环。I/O虚拟化发展到今天,各种技术的提出一直在提升其性能与灵活性。而谈到I/O虚拟化方案,virtio是现如今最流行的I/O虚拟化方案。

而在本篇文章中,我们提出两个问题:

  • virtio能支持所有的使用场景吗?
  • virtio是理想I/O虚拟化方案的唯一答案吗?

Virtio发展到今天已经具备了许多作为理想I/O虚拟化框架的特点。Virtio具有平台无关性,不需要虚拟机操作系统修改以及接口标准公开等特点。随着vDPA框架[1]的提出,virtio兼容的硬件设备也让其性能问题得以缓解。

但是,对于那些不兼容virtio的硬件设备呢?比如NFV场景下常用的高性能设备,以及一些专用的加速设备。对于此种设备,是否就很难有一个理想的I/O虚拟化方案呢?如果有,又需要解决一些什么问题呢?

当考虑理想I/O虚拟化框架时,我们考虑两个问题,一是性能是否理想,二是否足够云化。对于virtio而言,随着vhost-user的提出,可以让virtio的数据面很大程度地提高性能。而vDPA的提出又使其能够接近普通设备直通的性能(但由于virtio的设计,与高性能设备直通仍有差距)。

而在云化方面,由于virtio本身就是作为一个半虚拟化接口提出,云化的支持是十分完备的。而对于virtio不兼容的设备,通常使用VFIO这个设备直通框架将设备直接分配给虚拟机使用,由于设备直接分配天然地就让设备数据面直通而达到了很高的性能,在性能方面已经满足了要求。而在云化方面,virtio不兼容的设备一直存在许多问题。比如不具有平台无关性以及通常不支持热迁移。

而最近QEMU中提出的VFIO-USER协议使其云化困难的问题得以解决。VFIO-USER是为了支持QEMU进程外模拟设备而被提出,VFIO-USER协议定义了两方,一方是设备的消费者(客户端,比如QEMU),一方是设备的提供者(服务端,比如DPDK应用),消费者与提供者通过Unix Domain Socket上的消息进行通信。

设备的提供者可以根据任意设备标准来定义一个软件设备,而有了这样的软件设备作辅助,virtio不兼容的设备就可以拥有很多云化特性,比如平台无关性与支持热迁移。

当支持一个自定义的软件设备之后,我们定义了一个复合设备(Composed Device)的框架。如下图所示,在没有基于VFIO-USER的设备模拟框架之前,VMM通过VFIO相关的系统调用来消费物理设备。

而有了基于VFIO-USER的设备模拟框架之后,VMM作为VFIO-USER的客户端,通过socket消息与VFIO-USER服务端(DPDK进程)进行通信,来消费DPDK进程模拟的软件设备。这个软件设备将会作为vswitch的一个端口来使用。

有了这两种消费设备的方式后,下图右半部的复合设备框架应运而生,在这个框架下,VMM统一使用VFIO-USER客户端来消费设备,而作为VFIO-USER的服务端,设备提供者进程可以在内部组织一个复合的设备,这个设备具有可配置的数据面,管理员可以选择一个半虚拟化的软件数据面,也可以选择一个直通的硬件数据面。

具体的选择与配置则基于上层应用的需求与系统资源的情况。这个复合设备的框架类似于virtio-vhost/vdpa的框架,对上层提供相同的接口,而下层可根据需求配置不同性能/功能的数据面。

而在具体实现方面,DPDK中设备模拟框架主要由两个库使能,一是rte_vfio_user库,实现了VFIO-USER协议的服务端,二是rte_emudev库。

可以从下图看到,我们把一个DPDK中的模拟设备分为设备模拟和数据面提供者两部分,数据面提供者(对于网卡而言)一般选择DPDK中的ethdev作为其设备抽象,而设备模拟部分则选择emudev作为其设备抽象。

为了在DPDK中实现自己的模拟设备,只需要基于两个核心库实现自己设备的设备模拟部分,再实现自己的数据面驱动即可。关于两个核心库的介绍与如何实现这两个部分,读者可以参考 [2] [3]。

作为一个示例,我们在DPDK的git官网上上传了上述的两个核心库实现以及一个基于Intel Adaptive Virtual Function(IAVF)标准实现的模拟设备[3],并在复合设备框架中使能,使基于IAVF的复合设备能动态选择软件数据面和硬件数据面。

通过DPDK git官网获得源代码的方式如下图所示,通过git clone http://dpdk.org/git/draft/dpdk-draft-emudev 即可下载对应仓库,切换到分支dev-composed-device上即可测试代码。

下图说明了如何使用dpdk-testpmd来测试这个框架。可以参考[5] 中的视频片段,视频中22分50秒至25分13秒详细介绍了如何使用这个demo。

综上所述,上文介绍的DPDK中的设备虚拟化框架能使达到高性能要求的设备保留高性能的同时又具备各种复杂的云化特性,为传统的非云化设备以及未来希望往云化扩展的设备提供了一套理想的I/O虚拟化框架,并且此框架理论上可以做到无缝向云化扩展。

而Intel IAVF作为第一个向云化扩展的例子,在其应用于高性能场景的基础上,增加了更加强大的灵活性。

[1] https://www.redhat.com/en/blog/achieving-network-wirespeed-open-standard-manner-introducing-vdpa

[2] https://dpdkuserspace2020.sched.com/event/e47L/device-virtualization-in-dpdk-xiuchun-lu-chenbo-xia-intel

[3] https://dpdksummitapac2021.sched.com/event/hdLb/an-ideal-network-io-virtualization-solution-in-dpdk

[4]http://git.dpdk.org/draft/dpdk-draft-emudev/

[5]https://www.youtube.com/watch?v=vv28EU8GkLQ&ab_channel=DPDKProject


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

登录后才可以评论

SDNLAB君 发表于21-09-10
0