请选择 进入手机版 | 继续访问电脑版

SSD HotPlug功能测试简介

2017-6-3 20:25 1542 0
0
摘要: 随着nvme协议的出现,固态硬盘的性能随之出现了大涨。以前的的固态硬盘普遍使用SAS/AHCI、SATA、AHCI,那么到了如今出现了更适合的NVMe/PCIe组合。现在的固态盘使用的一般为M.2, PCIe, U.2接口,对于企业级硬盘来讲 ...

热插拔介绍

随着nvme协议的出现,固态硬盘的性能随之出现了大涨。以前的的固态硬盘普遍使用SAS/AHCI、SATA/AHCI,那么到了如今出现了更适合的NVMe/PCIe组合。现在的固态盘使用的一般为M.2, PCIe, U.2接口,对于企业级硬盘来讲,相对于PCIe卡式SSD, U.2接口SSD的2.5"外形(SFF-8639),更符合服务器的使用习惯。而作为SFF-8639 SSD不可避免的还有一个优势,就是硬盘的HotPlug。

何为热插拔(HotPlug)?热插拔即“带电插拔”,指可以在系统运作时插上或拔除硬件设备。配合适当的软件,便可以在不用关闭电源的情况下插入或拔除支持热插拔的周边设备,不会导致主机或周边设备烧毁并且能够实时侦测及使用新的设备。这样就可以在服务器不关机的情况下更换设备,对于企业来说这真的是一个非常棒的设计。

Linux PCIe热插拔分为两种:一种是native hotplug,这种热插拔的实现在于linux内核代码的功能;另一种则是ACPI hotplug,这种是基于主板以及bios的功能支持。通常情况下,两种方式是不兼容的,开启一个就不会使用另一个。


一般我们说SSD支持热插拔即指得是native hotplug。根据规范,一个完整的 Native PCI Express 热插拔系统需要几方面的相互配合,分别为硬件元素、固件元素和软件元素。 硬件元素是指主板总线系统的电气特性方面的支持,包括热插拔控制器(Hot-Plug Controller)、卡槽电源切换逻辑(Card Slot Power Switching Logic)、板卡重置逻辑(Card Reset Logic)、电源指示灯(Power Indicator)、提示按钮(Attention Button)和板卡存在检测引脚(Card Present Detect Pins)等等;固件元素是指主板BIOS必须对热插拔提供的支持,要实现Native PCI Express热插拔,固件必须提供OSHP方法或ACPI _OSC方法之一;软件元素是指操作系统操综合使用PCI Express 热插拔所必须提供的功能组件。


硬件元素和固件元素。我们通常判断是否支持是通过主板的PCIe卡槽的支持与否,我们需要先找到nvme SSD对应的卡槽地址,通过PCIe卡槽的Capabilities寄存器信息来判断其支持状态。

软件元素。 PCIe热插拔并不是完全由操作系统处理的,也有可能由BIOS处理,这完全取决于服务器BIOS的设计。当操作系统启动时,会根据ACPI提供的信息来了解到底由谁处理PCIe热插拔。如果由操作系统处理,则会根据PCIe卡槽发送的中断获知热插拔事件。对于Linux系统来说,一般使用pciehp驱动来干这件事情。所以,最简单的判断方法就是看系统中是否注册了热插拔中断服务程序。

测试准备
 综上所述,我们在做hotplug测试之前应该做的事情:

1. 关掉bios hotplug support

2. 确认平台以及操作系统的支持


至于linux系统下的nvme driver,其内核在2.4.16之后就开始支持热插拔。我们在测试的时候应该尽量使用最新的内核去进行测试。与其说驱动的支持,不如说驱动中是否有Bug。Linux内核提供了NVMe驱动,但是在实际的测试中,驱动的处理不当容易导致系统Crash和Hang住。产生这些问题的原因基本上可以归纳为NVMe驱动release设备和pciehp release设备产生竞争,出现空指针;NVMe驱动release设备时,上层调用sync函数导致进程block住。

如果以上这些环节都通过,基本上可以确认当前的系统可以进行热插拔了。

测试内容
讲完了如何去判断一个平台正确支持热插拔,那热插拔设备应该怎样做。

所谓热插拔其实分为两个过程:hot removal和hot insertion。热插拔还应该分为notify hotplug和surprise hotplug,前者是在通知操作系统的前提下hotplug,后者则是在不通知操作系统的情况下进行暴力热插拔。所以在测试SSD hotplug function的时候要确保这些项目都被测试到,包括Hot-Add、Hot-Removal、Hot-Plug、Hot-swap。如果有条件,在模拟真实热插拔的过程,还需要进行快拔和慢拔,以及模拟SSD Pin针在插拔的时候进行信号/power的抖动,这些都可以通过quarch设备进行模拟。

notify hotplug通知OS的方法: 在linux下面,echo 0 > /sys/bus/pci/slots/<相应的slot number文件夹>/power标识power off, echo 0 > /sys/bus/pci/slots/<相应的slot number文件夹>/power标识power on.

                                在windows下面,win8、win10的设备会像U盘一样在桌面右下角可以弹出。

判定条件
说完了如何做,那热插拔设备后怎样才能算是成功的。

1. 保证系统在热插拔过程中没有重启宕机等异常现象。因为PCI设备掉电之后,可能会出现UE/CE进而导致系统重启;

2. 还要保证热插拔没有影响系统下其他硬盘或者组件的正常运转;

3. 设备上电后能主动/被动被识别,并且识别后link speed和link width是期望的值。在设备上电后PCI会进行link Re-training的过程,这个过程要保证link speed和link width,PCIe信号的不稳定可能会导致link speed的变化。比如我就遇到过link speed速度由GEN3 降到 GEN 2;

4. 对固态硬盘来讲,热插拔前后SSD要保证其功能性(比如读写功能),数据一致性(进行/不进行IO情况下hotplug硬盘已有数据不会丢,对于surprise hotplug,相当于rebuild测试)。

注意事项

目前为止,Linux系统和PCIe热插拔驱动存在不少问题,我们在操作中还需要避免出现下面的情况:

避免在一个服务器上短时间内频繁地(或者同时对多个设备)进行热插拔操作

原因:这是pciehp驱动中热插拔处理的bugcentos7都没有解决。

潜在的问题:可能导致pciehp进程block住,之后插入的盘无法识别。

解决办法:当对多个盘操作时,顺序进行热插拔,并打开pciehpdebug功能,通过dmesg获得pciehp热插拔处理进度。

避免对带有I/O的设备进行热插拔(尤其是启用了CacheI/O

原因:这是由于Linux Block层与PCIe热插拔的配合问题导致的。

潜在的问题:可能导致系统某些进程block住,或者系统crash

解决办法:通过设置卡槽的power值,在拔盘之前通知操作系统先移除设备。

避免对已经mount文件系统的设备进行热插拔

原因:mount无法感知热插拔事件。

潜在的问题:文件系统无法使用,数据丢失。

解决办法:提前umount文件系统。

按照上面的方法,能够避免绝大多数问题。但是还是可能出现错误,尤其在一些新的服务器厂商的产品中,由于兼容性问题导致NVMe设备无法识别。那么我们可以通过卡槽的Capabilities寄存器信息判断。如果设备没有被PCIe系统正确识别,那么就需要咨询厂商了。


 





鲜花

握手

雷人

路过

鸡蛋
分享到

最新评论

    gaozh

    管理员
    这个人很懒什么都没写!
    • 3

    • 文章
    • 0

    • 收听
    • 0

    • 听众

    热门文章

    SSD社区微信公众号

    SSD社区微信公众号

    扫我关注
    返回顶部