【深入理解SSD 实践】对NVMe SSD热插拔时,正确做法是怎样的?

声明

主页元存储的博客_CSDN博客

依公开知识及经验整理,如有误请留言。

个人辛苦整理,付费内容,禁止转载


内容摘要

前言

概念

SAS/SATA 和NVMe 区别

热插拔分类

热插拔基本原理

如何确认是否支持热插拔?

热插拔注意事项

不建议意外热移除是有道理的!谨慎操作永不为过!

总结

参考


前言

热插拔是大家每天都有可能做的事情。比如,将一块U盘从PC中拔出,将一个鼠标从一台电脑换到另一台电脑。这些都是再平常不过的事情了。对于数据中心的运维人员来说,更换硬盘也是一件很频繁的事情。

NVMe SSD已经从实验阶段进入到大量业务部署时期,热插拔这个feature变得非常关键。最开始NVMe SSD只是以PCIe接口的形式出现,跟网卡一样放在背板的卡槽上固定,这种形态的NVMe还不适合热插拔。随着U.2接口(如下图)的推出,NVMe SSD可以直接如SATA/SAS硬盘一样放置在前面板,此时的NVMe SSD对热插拔的支持变得理所当然而且必须。

服务器厂商和SSD厂商也都非常支持U.2接口。如Dell的PowerEdge R730xd带有4个U.2盘位,超威甚至发布了24盘位的服务器。SSD方面,PCIe SSD厂商都已经开始推出对应的产品。

当客户采用U.2的SSD前,会对其热插拔功能做评估。在实施过程中,由于测试人员对NVMe SSD不了解导致系统崩溃的事情时有发生;或者对如何测试NVMe SSD热插拔无从下手。那么这篇文章,就跟大家分享在NVMe SSD热插拔过程中需要注意的问题(Linux环境下)。


概念

热插拔(Hot-plug)功能是允许用户在不关闭系统,不切断电源的情况下取出和更换设备,从而提高了系统对灾难的及时恢复能力、增强扩展性和灵活性等。支持热插拔的平台能够保证在热插入(Hot Insertion)的时候,自动检测到设备并将其注册到相应驱动,在热拔出的时候,能够自动检测到设备丢失并从驱动移除,整个过程不需要系统重启。 并且在热插拔操作之后,系统和设备能够正常工作。

SAS/SATA 和NVMe 区别

我们先来了解下SAS/SATA 和NVMe在硬件上的差别。对SAS和SATA比较熟悉的人知道,SAS和SATA设备通过控制器接入系统(如下图的SATA)。SAS和SATA设备的热插拔是由其控制器管理的。对于SAS来说,以常用的MegaRAID为例,其定义了一个热插拔event,当设备插入或者设备拔出时,MegaRAID会产生一个event并交由MegaRAID驱动处理。对于SATA而言,AHCI协议规定了控制器对热插拔的处理流程,并确定控制器必须在热插拔产生时触发一个中断,这样内核的AHCI驱动就可以在中断中处理热插拔事件。


NVMe SSD是不需要控制器的,NVMe直接连接到通用的PCIe Bus上(如下图),跟SAS/SATA控制器一个级别。NVMe SSD热插拔完全依赖于Host的PCIe处理机制。


因而,对于使用控制器的SAS和SATA硬盘来说,可以由控制器厂家进行测试并保证热插拔功能。但是NVMe SSD却依赖于Host端的PCIe的配合,PCIe由于其通用性,在支持NVMe SSD上没有SAS/SATA控制器那么完美。对于用户来说,需要认识到SAS/SATA和NVMe在这方面的不同之处。省去了控制器的NVMe比SAS/SATA的热插拔要复杂的多。

热插拔分类

热插拔操作看似简单,但是根据设备是否带电、操作系统是否提前得到通知等因素,热插拔有多重操作场景。根据场景的不同,热插拔可以分为以下四类具体的操作:

成熟的热插拔技术首先需要保障操作系统不会崩溃或者死机;其次,PCIe SSD 对于已经确认接收的 I/O 数据不会因为热插拔而导致数据丢失;最后在进行热插拔实验后,PCIe SSD设备能够正常工作。

需要指出的是,热插拔操作涉及环节众多,用户需要依照正确的流程进行操作才可以最大限度的避免各类风险,保障业务连续和数据完整性。下面就从热插拔的原理入手介绍这一技术以及相关的注意事项。 

热插拔基本原理


从硬件层面讲,卡槽的 PCIe 引脚 PRSNT2#能够随着外接设备的接入和拔出得到不同的电平,从而触发热插拔事件, 如下图。PCIe3.0 协议规定了多个热插拔事件和热插拔支持功能,如 Attention Button,电源控制(Power Control) 等,各类服务器对热插拔的支持也不相同。最基础的,热插拔卡槽需要具备产生 Presence Status Change 事件的能力。

PCIe Capabilities 寄存器提供了热插拔相关配置和状态信息。

如何确认是否支持热插拔?

在进行热插拔测试之前,第一步就是要确认当前的系统是否支持热插拔。

1,确认SSD的支持
对于SSD,热插拔需要保证在插盘的过程中不会产生电流波峰而损坏器件;拔盘的时候,不会因为突然掉电而丢失数据。这个可以向SSD供应商确定或者查看产品规格书。

2,确认PCIe卡槽的支持
上面提到,NVMe是直接连接到PCIe Bus上的,U.2接口也是直接跟PCIe相连(当判断插入的设备为NVMe SSD时)。某些U.2接口内部连接的PCIe卡槽并不支持热插拔。PCIe Spec规定了热插拔寄存器。下图(通过lspci -vvv获取)显示了一个PCIe卡槽的Capabilities寄存器信息。其中LnkSta,SltCap,SltCtl和SltSta 4个部分在热插拔过程中比较有用(具体意义请参考PCIe Spec)。HotPlug和Surprise是最基础的判断热插拔的标志位。SltSta中有一个PresDet位指示当前是否有PCIe设备插入卡槽。


我们可以通过下面的方法判断NVMe设备连接的PCIe卡槽是否支持热插拔。

找到NVMe SSD(如nvme0n1)对应卡槽的地址(如0000:04:06.0);通过lspci获得卡槽的热插拔寄存器信息(如果显示为hotplug+,Surprise+则支持热插拔)


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

 


对于Linux的NVMe热插拔支持将会单独用一篇文章讲解,此处不再多说。

4,确认NVMe驱动的支持
与其说驱动的支持,不如说驱动中是否有Bug。Linux内核提供了NVMe驱动,但是在实际的测试中,驱动的处理不当容易导致系统Crash和Hang住。产生这些问题的原因基本上可以归纳为NVMe驱动release设备和pciehp release设备产生竞争,出现空指针;NVMe驱动release设备时,上层调用sync函数导致进程block住。这个最好跟SSD 厂商沟通好自己的测试环境,以便提前了解可能出现的问题。

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

热插拔注意事项

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

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

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

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

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

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

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

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

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

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

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

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

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

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

不建议意外热移除是有道理的!谨慎操作永不为过!


意外热移除(Surprise Hot-plug)是一种比较有风险的操作。即使在测试充分和支持良好的平台上,也会有对系统产生负面影响的风险,比如对有 I/O 访问的设备进行拔盘操作,会使得存储在系统缓存中的 I/O 数据丢失,这种操作一方面触发上层应用处理这类错误,另一方面, Linux 自带的 NVMe 驱动会出现 hung 住等问题。当下主流PCIe SSD都会有多个设备指示灯用于显示设备的运行状态,这种设计一定程度上降低了意外热移除的概率。

所以拔盘时,建议优先使用正常热移除(Orderly Hot Removal),介绍如下:

停止当前和待移除设备相关的进程(如可能访问设备的数据库等)

Umount 与该设备相关的文件系统

向系统发出移除设备信号:

#echo 0 >/sys/bus/pci/slots/<SSD_SLOT_NUM>/power

SSD_SLOT_NUM 是待移除设备对应的 PCIe 卡槽编号,可通过 lspci 命令获得


等待系统移除设备(可通过 lsblk 等命令查看)后再执行手动拔盘操作


总结


这篇文章主要介绍了在进行NVMe SSD热插拔时需要注意的事项。首先,我们检查系统是否支持NVMe热插拔,然后避免出现上面提到的3种情况。PCIe目前还无法做到如SATA/SAS一样的支持力度,这个需要服务器厂商和SSD厂商共同推进,热插拔需要U.2接口PCIe SSD、操作系统、服务器的通力配合,相信在未来会越来越好。用户在这个阶段,只有尽量和厂商多沟通,才能避免操作中造成系统崩溃,数据丢失等风险。[1]

原文出处:Memblaze_2011的博客_CSDN博客-PCIe SSD,闪存技术,优化方案领域博主

原文链接 https://blog.csdn.net/Memblaze_2011/article/details/52870727


参考

[1] https://blog.csdn.net/Memblaze_2011/article/details/52870727

[2] https://www.ngui.cc/zz/2380331.html

[3] PCIe SSD之SFF-8639和备受关注的热插拔功能

免责声明

本文根据公开信息整理,旨在介绍更多的存储知识,所载文章仅为作者观点,不构成投资或商用建议。本文仅用于学习交流, 不允许商用。若有疑问或有侵权行为请联系作者处理。

猜你喜欢

转载自blog.csdn.net/vagrant0407/article/details/130094996