热插拔功能是PCIe SSD的一项重要功能, 能大大简化设备更换和调试步骤。特别是在服务器厂商推出支持 U.2 接口的产品后,对热插拔的需求更加广泛。热插拔在 PBlaze5 PCIe SSD应用非常成熟。这篇文章旨在为使用 PBlaze5为代表的U.2接口的PCIe SSD进行热插拔操作提供参考。
热插拔(Hot-plug)功能是允许用户在不关闭系统,不切断电源的情况下取出和更换设备,从而提高了系统对灾难的及时恢复能力、增强扩展性和灵活性等。支持热插拔的平台能够保证在热插入(Hot Insertion)的时候,自动检测到设备并将其注册到相应驱动,在热拔出的时候,能够自动检测到设备丢失并从驱动移除,整个过程不需要系统重启。 并且在热插拔操作之后,系统和设备能够正常工作。
热插拔操作看似简单,但是根据设备是否带电、操作系统是否提前得到通知等因素,热插拔有多重操作场景。根据场景的不同,热插拔可以分为以下四类具体的操作:
热插拔类型 | 场景描述 | PBlaze5 支持情况 |
热添加 / 热插入 (Hot Add/Hot Insertion) | 将 PCIe SSD 插入带电、OS 正在运行的系统中,或者同时有上层 软件(RAID)正在管理使用 SSD。 通常该操作是为了扩容或者替换失效的设备。 | 支持 |
正常热移除 (Orderly Hot Removal) | 通知操作系统,提前禁用设备的情况下进行拔出动作。 已知设备失效,停止和设备的通信,或从上层软件中移除。 | 支持 |
热交换 (Hot Swap) | 热拔出动作后又进行了热添加动作。 通常是进行失效设备的替换。 | 支持 |
意外热移除 (Surprise Hot Removal ) | 当系统还在使用 PCIe SSD 时,设备被突然拔出,这时可能还有 IO的通信,这种操作不推荐使用。 通常是操作失误导致,例如移除了错误的设备。PBlaze5 提供定 位功能,通过发送 locate 指令,可以点亮 LED 对需要移除的 SSD 进行定位。 | 支持 (不建议用户使用意外热移除操作,下文将进行具体解释) |
成熟的热插拔技术首先需要保障操作系统不会崩溃或者死机;其次,PCIe SSD 对于已经确认接收的 I/O 数据不会因为热插拔而导致数据丢失;最后在进行热插拔实验后,PCIe SSD设备能够正常工作。
需要指出的是,热插拔操作涉及环节众多,用户需要依照正确的流程进行操作才可以最大限度的避免各类风险,保障业务连续和数据完整性。下面就从热插拔的原理入手介绍这一技术以及相关的注意事项。
热插拔基本原理
从硬件层面讲,卡槽的 PCIe 引脚 PRSNT2#能够随着外接设备的接入和拔出得到不同的电平,从而触发热插拔事件, 如下图。PCIe3.0 协议规定了多个热插拔事件和热插拔支持功能,如 Attention Button,电源控制(Power Control) 等,各类服务器对热插拔的支持也不相同。最基础的,热插拔卡槽需要具备产生 Presence Status Change 事件的能力。
PCIe Capabilities 寄存器提供了热插拔相关配置和状态信息。在 PBlaze5 PCIe SSD接入系统后,可通过 lspci –t 查看 其对应的 PCIe 卡槽信息,下文中<bus:dev.function>均表示的是热插拔测试中与 PBlaze5 对应的 PCIe 卡槽。
需要指出的是,热插拔事件可以由 BIOS(ACPI)处理,也可以由操作系统处理,Memblaze 推荐由操作系统处理的方式,如果 BIOS 中有 ACPI hot-plug 选项,请选择否。此外,相对于 Linux 原生驱动,Memblaze 提供的驱动进一步完善对 hotplug 的支持,推荐使用。
检查 Linux Kernel 是否编译 hotplug driver,确认 linux 内核编译配置文件设置以下项:
CONFIG_HOTPLUG_PCI_PCIE=yCONFIG_HOTPLUG_PCI=yCONFIG_HOTPLUG_PCI_ACPI=y
检查 Memblaze 驱动是否加载成功,使用如下命令查看 NVMe 驱动版本
#cat /sys/module/nvme/version
注:如果不使用 Memblaze 驱动,在 Linux 系统下,需要将内核升级至 3.14 以上保证原生 NVMe 驱动对热插拔的支持。
确认PCIe 槽是否支持热插拔
依照上面介绍的基本原理,在进行热插拔操作之前,用户需要检查对应槽位是否具备热插拔功能,通过以下命令可以得知是否支持热插拔:
#lspci –s <bus:dev.function> -vvv | grep –i hotplugSltCap: AttnBtn+ PwrCtrl+ MRL- AttnInd+ PwrInd+ HotPlug+ Surprise+
如上述命令返回的消息中包含 Hotplug+和 Surprise+信息,则证明该槽位支持热插拔功能。可以看到,该卡槽还配备电源控制等功能。下面则进一步介绍了PCIe 槽热插拔功能的细节:
- 检查对应槽位上是否注册了 Hot-plug service,如下信息(通过 dmesg 命令获取)显示了 slot #8 加载了pciehp driver
[9.137143] pciehp 0000:00:03.1:pcie04: Slot #8 AttnBtn+ AttnInd+ PwrInd+ PwrCtrl+ MRL- Interlock- NoCompl- LLActRep+[10.136681] pciehp 0000:00:03.1:pcie04: service driver pciehp loaded
- 检查对应槽位是否设置了相关寄存器
获取 slot 的 Capabilities 信息,如下命令返回 Hex 值,bit值为1表示具备相应能力。
其中:bit 1(Power Control),bit 5(Hotplug Surprise),bit 6(Hotplug Capable)。
#setpci -s <bus:dev.function>CAP_EXP+0x14.b
获取 Slot 控制寄存器信息,确定 bit3(Presence Detect Changed Enable),bit5(Hotplug Interrupt Enable) 和 bit12(Data Link Layer State Changed Enable)设置为 1.
#setpci -s <bus:dev.function>CAP_EXP+0x18.w
Presence Detect Changed Enable 位控制槽位在检测到外接设备接入或拔出时是否发送中断。
Data Link Layer State Changed Enable 位控制槽位在检测到链路状态发生变化时是否发送中断。
不建议意外热移除是有道理的!谨慎操作永不为过!
意外热移除(Surprise Hot-plug)是一种比较有风险的操作。即使在测试充分和支持良好的平台上,也会有对系统产生负面影响的风险,比如对有 I/O 访问的设备进行拔盘操作,会使得存储在系统缓存中的 I/O 数据丢失,这种操作一方面触发上层应用处理这类错误,另一方面, Linux 自带的 NVMe 驱动会出现 hung 住等问题。
所以拔盘时,建议优先使用正常热移除(Orderly Hot Removal),介绍如下:
停止当前和待移除设备相关的进程(如可能访问设备的数据库等)
Umount 与该设备相关的文件系统
向系统发出移除设备信号:
#echo 0 >/sys/bus/pci/slots/<SSD_SLOT_NUM>/power
SSD_SLOT_NUM 是待移除设备对应的 PCIe 卡槽编号,可通过 lspci 命令获得
等待系统移除设备(可通过 lsblk 等命令查看)后再执行手动拔盘操作
热插拔需要U.2接口PCIe SSD、操作系统、服务器的通力配合,Memblaze为了确保PBlaze5在进行热插拔操作时最大限度的规避风险,对主流操作系统以及服务器做了大量的热插拔测试。这篇文章介绍的基本原理以及热插拔操作的流程等内容之外,还有诸如热插拔操作需要保持一定时间间隔等注意事项。这部分内容我们将在后续的文章进行详细的介绍。