认识和使用热插拔的正确姿势

news/2024/10/31 3:20:53/

热插拔功能是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在进行热插拔操作时最大限度的规避风险,对主流操作系统以及服务器做了大量的热插拔测试。这篇文章介绍的基本原理以及热插拔操作的流程等内容之外,还有诸如热插拔操作需要保持一定时间间隔等注意事项。这部分内容我们将在后续的文章进行详细的介绍。








http://www.ppmy.cn/news/483436.html

相关文章

【PCI】pcie-switch应用——热拔插(七)

内核热插拔驱动 PCI设备在BIOS启动阶段枚举&#xff0c;之后传给linux内核&#xff0c;由linux内核将每个PCI设备注册到pci_bus_type总线上&#xff0c;进而匹配pci驱动&#xff0c;如下图所示。 PCI桥设备也会匹配pci驱动&#xff0c;这个驱动名称为pcieport&#xff0c;该驱…

HDMI接口之HPD(热拔插)

HDMI (Pin 19)/DVI&#xff08;Pin16&#xff09;的功能是热插拔检测&#xff08;HPD&#xff09;&#xff0c;这个信号将作为HDMI 源端&#xff08;Source&#xff09;是否发起EDID读&#xff0c;是否开始发送TMDS信号的依据。HPD是从HDMI显示器端&#xff08;Sink&#xff09…

USB热拔插事件

前言 USB&#xff08;Universal Serial Bus&#xff09;通用串行总线的缩写&#xff0c;是一个外部总线标准&#xff0c;用于规范主机与外围设备的连接以及通讯&#xff0c;目前使用较多的版本有USB1.1、USB2.0、USB3.0等。USB接口常用在诸如USB串行设备驱动(3G/4G上网卡、蓝牙…

[热拔插] 轻量级Winform插件式框架

写在前面的话 对于大神&#xff0c;Winform这种“古董玩具”&#xff0c;实在没太多“技术性”可言了&#xff0c;然而『好用才是王道』&#xff0c;本文不以技术为卖点&#xff0c;纯属经验之谈&#xff0c;欢迎交流拍砖 朴素版UI 开发初衷 由于本人所在公司不定时需要开发各种…

[嵌入式linux]PCIe 热拔插(rescan)

linux下可通过/sys/bus/pci/devices/0000\:[bus number]\:[device number].[function number]/ 目录下的节点进行热拔插操作。 板子上电前PCIe插槽有一块NVME的固态硬盘 [ 0.198515] pci 0000:00:00.0: [16c3:abcd] type 01 class 0x060400 [ 0.199284] pci 0000:01:00…

几个SQL的高级写法

一、ORDER BY FLELD() 自定义排序逻辑 MySql 中的排序 ORDER BY 除了可以用 ASC 和 DESC&#xff0c;还可以通过 ORDER BY FIELD(str,str1,...) 自定义字符串/数字来实现排序。这里用 order_diy 表举例&#xff0c;结构以及表数据展示&#xff1a; ORDER BY FIELD(str,str1,..…

关于微信小程序生成海报一个简单的办法

废话不多说&#xff0c;直接入题&#xff0c;先上GITHUB地址&#xff0c;这个组件很好用&#xff0c;有图形生成工具&#xff0c;你不用再自己写代码一个个元素对齐了&#xff0c;是不是很爽。 GITHUB&#xff1a;https://github.com/Kujiale-Mobile/Painter 生成painter代码…

TC8:SOMEIPSRV_OPTIONS_12-15

SOMEIPSRV_OPTIONS_12: Reserved field of the IPv4 Multicast Option 目的 IPv4 Multicast Option的Reserved字段应静态设置为0x00 这里指的是第二个Reserved字段 测试步骤 DUT CONFIGURE:启动具有下列信息的服务Service ID:SERVICE-ID-1Instance数量:1Tester:客户端-1发…