一文读懂SPDK用户态hotplug处理

作者简介

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

什么是hotplug?

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

一文读懂SPDK用户态hotplug处理_第1张图片

为什么需要hotplug?

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

  • 改变配置或者修复系统

  • 负载均衡

  • 动态迁移

  • 减少能耗

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

一文读懂SPDK用户态hotplug处理_第2张图片

SPDK和hotplug又有什么关系呢?

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

一文读懂SPDK用户态hotplug处理_第3张图片

图-1 SPDK Architecture

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

  1. 物理设备的热插拔

  2. 通过RPC实现的block device的热插拔。

一文读懂SPDK用户态hotplug处理_第4张图片

图-2 SPDK Hotplug

3.1 SPDK event framework

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

一文读懂SPDK用户态hotplug处理_第5张图片

图-3 SPDK event framework

3.2 物理设备的热插拔

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

  • uio_pci_generic

  • vfio-pci

一文读懂SPDK用户态hotplug处理_第6张图片

图-4 SPDK UIO Hotplug handle

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

一文读懂SPDK用户态hotplug处理_第7张图片

图-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来创建对应的设备和启动服务。

一文读懂SPDK用户态hotplug处理_第8张图片

图-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的应用。

640?wx_fmt=jpeg

 推荐阅读 

640?wx_fmt=jpeg

你可能感兴趣的:(一文读懂SPDK用户态hotplug处理)