41

一文读懂SPDK用户态hotplug处理

 5 years ago
source link: https://www.sdnlab.com/23270.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

作者简介:喻津, 资深工程师, 主要从事SPDK的软件开发工作。

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

什么是hotplug?

Hotplug即带电插拔,它的功能就是允许用户在不关闭系统,不切断电源的情况下取出和更换设备,最常见的如USB键盘,鼠标。

000.jpg

为什么需要hotplug?

Hotplug已经是现代计算机中不可或缺的特性之一了,它极大的方便了计算机的使用。单纯意义上的hotplug通常指设备的插入和删除,但是它不仅仅局限于此,它还可以应用于以下几个方面:
改变配置或者修复系统

  • 负载均衡
  • 动态迁移
  • 减少能耗

而在云服务领域,关闭系统所带来的经济损失是巨大的。单以存储举例,硬盘是有可能损坏的,而且,存储空间也有可能消耗到一个危险的水平。这些都要求云服务在部署的时候就考虑到了硬盘的hotplug。

001.jpg

SPDK和hotplug又有什么关系呢?

SPDK(Storage Performance Development Kit)是一款专注于存储的用户态开源软件,加速磁盘的读写仅仅是它的一个特点之一,更多的信息可以访问网站https://spdk.io/来发掘SPDK的更多特性。SPDK的整体架构如图(1)所示,我们在bdev (Block Device Abstraction)层提供了hotplug的支持。

002.jpg

图-1 SPDK Architecture

SPDK从两个方向提供了hotplug的支持,这与SPDK的架构和使用有关。SPDK可以通过config 文件在启动时指定要创建的block device或者在启动后通过RPC的方式来创建与删除block device。所以,如图(2)所示,SPDK 对hotplug的支持有两个方向:
1.物理设备的热插拔
2.通过RPC实现的block device的热插拔。

003.jpg

图-2 SPDK Hotplug

3.1 SPDK event framework
在说明SPDK是如何实现hotplug之前,我们需要简单介绍一下SPDK的event framework模型。如图(3)所示,SPDK运行时指定了多少个core,就会起多少个reactor。Core和reactor是一一绑定的,poller是每个reactor上的周期性服务,而message或者event是线程间同步的方法,按需分配,开销很小。

004-.jpg

图-3 SPDK event framework

3.2 物理设备的热插拔
SPDK作为用户态程序,依赖于kernel发送的消息来处理物理设备的hot add or remove。目前SPDK支持两种driver:

  • uio_pci_generic
  • vfio-pci

005.jpg

图-4 SPDK UIO Hotplug handle

设备被移除后,SPDK还是有可能访问设备的空间,这个时候会引起sigbus。所以,我们需要注册了一个sigbus_handler,如图(5)所示,step ②访问已经被移除的SSD-2的BAR空间,此时触发已注册的sigbus_handler,在sigbus_handle中我们对访问设备的虚拟地址做了新的匿名映射,同时把匿名页全置0xff,防止第二次的sigbus的出现。

006.jpg

图-5 SPDK sigbus handler

vfio-pci的hot remove有很大的不同,他不是通过uevent广播,而是通过request notify的方式通知用户,同时需要用户先释放自己的device,vfio-pci才能卸载。对于hot add, vfio-pci没有什么不同也是通过uevent的方式实现。目前SPDK正在实现对vfio-pci hot remove的支持,敬请期待。

3.3 RPC Command
通过RPC实现hotplug就比较直接,它相当于省略了物理设备hotplug处理中,接收和解析uevent的步骤,它的实现流程如图(6)所示。如果,我们仅仅看NVMe bdev的实现,我们就会发现,RPC和物理hotplug最后都调用到了remove_cb()(在bdev_nvme.c中)。SPDK正在逐步放弃使用config文件启动的方式,而是选择在启动后通过RPC来创建对应的设备和启动服务。

007.jpg

图-6 SPDK RPC hotplug

SPDK中如何测试hotplug?

4.1 RPC
通过RPC的方式测试hotplug,就不需要什么准备,启动SPDK event framework即可。所以,nvmf_tgt和bdevperf等都可以做这样的测试。

4.2 物理设备的hotplug
正如上文所说,目前只能用uio_pci_generic的driver来测试hotplug。可以运行example/nvme/hotplug来测试NVMe SSD的热插拔。也可以使用event framework,不过需要在config文件中打开hotplug的支持“HotplugEnable Yes”或者通过RPC Command “rpc.py set_bdev_nvme_hotplug”。需要注意的是,如果用nvmf_tgt或者bdevperf等测试物理设备的hotplug一定要enable hotplug,不然会导致进程无法通过ctrl+c退出。

总结

Hotplug在存储实际使用中扮演着相当重要的角色,而SPDK提供的用户态hotplug解决方案会方便用户的使用与扩展,SPDK也会基于这套方案完善更多的基于hotplug的应用。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK