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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Memblaze_2011/article/details/79240052

上篇文章《认识和使用热插拔的正确姿势》对热插拔功能的基本概念、原理以及几种操作场景做了介绍。文章最后还对意外热移除操作的注意事项做了重点介绍。这篇文章将热插拔操作需要注意的问题做进一步解读,帮助用户更好的管理PCIe SSD,保障业务连续性。

避免已经mount文件系统

的设备进行热插拔操作

由于 mount 命令不接收系统的热插拔事件消息,所以当设备移除和加载的时候,mount 无法感知。相应的,文件系统(如 xfs)也没有获得设备的状态变化。如果对已经进行 mount 操作的设备进行热插拔,可能会导致操作系统的信息与实际不同步,造成文件系统无法使用、数据丢失或者其他未知错误。

最有效的解决方案就是首先对文件系统进行umount操作。

热插拔需要保持一定的时间间隔

已经mount文件系统的热插拔场景佐证了避免意外热插拔的重要性。此外,这一功能不论插入还是拔出都需要有一定的时间间隔,其中的影响因素较多,主要因素和建议可以从以下三个方面进行说明。

1.插入保持时间

PBlaze5 具有掉电保护功能,在设备拔出时,能够使用设备上的电容存储的电能维持设备工作一段时间。 Firmware 利用这段时间可以处理未完成的 I/O 数据以及SSD设备元数据并保存系统信息。PBlaze5 配置了电源检测芯片,在电源掉电时,能够给 firmware 发送电源掉电信号。由于电容充电需要一定的时间,一般需要至少5s。


另外,PBlaze5 上电后需要进行元数据恢复,初始化过程可能大于 5s(最大不超过 110s),并且初始化完成后才能在/dev 下看到设备,请通过如 lsblk 等命令确认设备已经加载成功再进行拔出操作。


2.热拔出保持时间

大多数情况下对拔出的保持时间没有要求。但是具备电源管理功能的 slot 在热插拔过程中,会关闭或者打开槽位的电源。如果在系统还未处理完热移除操作就插入设备,可能会导致系统对设备的状态判断出错,导致刚插入的盘无法识别。


可以按照如下方法判定SSD拔出事件是否已经完成:

1、打开 slot 卡槽对应的 debug 信息

echo Y > /sys/bus/pci/slots/<slot_num>/module/parameters/pciehp_debug 

slot_num  可以通过如下命获取:

#lspci –s <bus:dev.function> -vvv | grep Slot 


2、当 dmesg 出现 pciehp_green_led_off 信息后,热拔出事件处理结束。

[ 398.971553] pciehp 0000:04:09.0:pcie24: pciehp_green_led_off: SLOTCTRL 80 write cmd 300 


3.针对热插拔时间的限制对操作的建议

由于不同的内核版本和不同的服务器平台对热插拔的支持完善度不一样,实际操作中对上述的时间要求较难把握。请按照下面的准则实施热插拔操作:

拔盘时,条件允许的情况下,提前通知操作系统,操作方法详见上篇文章的谨慎使用意外热移除操作一节。

        

如果对多个盘进行热插拔,必须一次只对一个盘进行操作,并且等待系统处理完插拔事件后再进行下一次操作,具体流程仍然参考之前的章节。需要指出的是,拔盘和插盘的动作要连贯迅速,避免出现抖动和中途停留的情况。

其他注意事项:

热插拔之后设备的 Max Payload Size 值

在系统启动的时候,BIOS 会配置好 PCIe 设备的 MPS 值(即 Max Payload Size,详见 PCIe Capability 地址空间的 Device Control 寄存器,偏移量 0x08)。默认情况下,在热插拔过程中,PCIe 卡槽的 MPS 值一直保持不变,而外接设备的 MPS 值则为default=128Bytes。所以,在热插入设备后,dmesg 会有以下打印:

[85682.065073] pci 0000:05:00.0: Max Payload Size 128, but upstream 0000:00:03.0 set to 256; if necessary, use "pci=pcie_bus_safe" and report a bug


MPS 作为 TLP 的参数,会对传输性能产生一定的影响。Linux Kernel 4.3 将修复这个问题。之前的版本可以参考如下方法:

直接修改 Max Payload Size 值:

在热插拔之前获取设备的 Device Control 寄存器的值(DC_VALUE)


热插入之后,setpci -s 05:00.0 CAP_EXP+0x8.w= DC_VALUE


修改 kernel 启动参数:

在启动参数中加入 pci= pcie_bus_perf ,然后 reboot 系统使之生效。


pcie_bus_perf 将设备的 MPS 设为其上级总线允许的最大MPS,同时将 MRRS(Max Read Request Size)设为能支持的最大值(但不能大于设备或总线所支持的 MPS 值)。


其他注意事项:ASPM 问题

配置 Intel Xeon E3/E5 v3 系列 CPU 的服务器在 PCIe 链路状态进入 L1(非正常工作状态)后,无法响应热插拔事件。为了避免此情况,建议禁用 ASPM 功能(默认设置),该功能由 PCIe 的 Link Control Register 的 bit0 和 bit1 控制,全0表示禁止 ASPM。


可以通过如下方法检查:

查看 BIOS 设置中是否有 PCIe ASPM 选项,关闭此服务。


作为一款企业级PCIe SSD,每一项功能都应建立在大量的测试和充分验证基础上,热插拔就是其中的代表。Memblaze在U.2接口的PBlaze4上就已经实现了热插拔功能,并通过文章《SFF-8639和备受关注的热插拔功能》做了初步的介绍。如今,随着PBlaze4、PBlaze5以及服务器和操作系统的实践,热插拔已经逐渐成熟,只要依照正确的操作流程,系统就可以保障业务连续和数据安全的同时完成硬盘的热插拔操作。





猜你喜欢

转载自blog.csdn.net/Memblaze_2011/article/details/79240052