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

news/2024/10/31 1:35:39/

声明

主页:元存储的博客_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和备受关注的热插拔功能

免责声明

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


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

相关文章

linux热拔插(转载)

linux热拔插(转载) 本文转载自边缘之火 《linux热拔插(转载)》 原文链接&#xff1a;http://bbs.ednchina.com/BLOG_ARTICLE_387616.HTM 将可移动设备连入系统时&#xff0c;系统的后台中会依次发生如下事件&#xff1a; l 内核检测到新硬件插 入&#xff0c;然后分…

18_热拔插驱动

18_热拔插驱动 文章目录 18_热拔插驱动1、介绍2、分析class_device_create函数3、示例3.1、装载buttons驱动3.2、卸载buttons驱动 4、自动挂载U盘4.1、U盘介绍4.2、分析mdev4.3、写mdev.conf进行U盘测试4.3.1、文件装载4.3.2、U盘自动挂载到mnt目录 1、介绍 热拔插即&#xff…

SpringBoot + Vue前后端分离项目实战 || 一:Vue前端设计

文章目录 环境配置开发工具下载Vue前端模板前端项目启动前端说明及修改修改导航栏自定义菜单与子菜单增加导航标签功能 前端数据格式 B站视频讲解&#xff1a;2023全网最简单但实用的SpringBootVue前后端分离项目实战 不想看视频可浏览此文章笔记&#xff0c;比较详细 环境配置…

HDMI热拔插电路举例说明

HDMI_PLUG 最近设计关于HDMI的接口设计&#xff0c;在热拔插上纠结了很久&#xff0c;现在总结下。 如图 我们HDMI接口的18脚为外部输入电压5V&#xff0c;而19脚是我们的检测脚&#xff0c;该脚在内部是有一个500k的电阻接到地&#xff0c;所以我们外部用一个1k的电阻就可把…

USB协议详解第28讲(USB硬件设计和热拔插原理)

目录 1.USB引脚接线定义 2.低速USB设备硬件设计原理 3.全速、高速USB设备硬件设计原理 4.USB设备插入检测和速度检测 4.1低速设备连接检测时序图 4.2全速设备连接检测时序图。 4.3设备断开时序图 1.USB引脚接线定义 对于四线制的USB&#xff0c;即USB1.0、USB1.1和USB2…

热插拔技术--以ADM1177为例说明

综述 ADM1177是一款热插拔控制器&#xff0c;并且还支持电压电流采集&#xff08;12bitADC&#xff09;和传输(IIC).本文着重说明热插拔技术&#xff0c;所以仅说明ADM热插拔处理过程&#xff0c;对于ADC和IIC部分不予说明&#xff0c;请读者自行研究。 热插拔的应用背景 服务…

(十七)Linux的热拔插UDEV机制

学习日志&#xff08;十七&#xff09; Linux的热拔插UDEV机制 Udev设备工具 Udev简介 udev是一个设备管理工具&#xff1b; udev以守护进程的形式运行&#xff0c;通过侦听内核发出来的uevent来管理/dev目录下的设备文件。 udev在用户空间运行&#xff0c;而不在内核空间…

带电插拔损坏设备原理_那些设备可以热插拔?

我们常常会看到一个词语热插拔&#xff0c; 对于从事 IT 人事来讲并不陌生&#xff0c; 但对于一般普通用户 来讲热插拔就一知半解了&#xff0c;那么什么是热插拔呢&#xff0c;热插拔是什么意思呢&#xff0c;热插拔就是指带电 插拔电脑 (IT) 上的设备&#xff0c; 英文 (hot…