数据完整性是数据存储系统中关键的元素之一,对于用户而言,不一致的数据可能导致严重的业务错误产生,因此保障数据的完整性与一致性至关重要。
NVMe SSD端到端保护
在主机和SSD之间进行数据交互,数据从主机生成到写入SSD闪存中,以及数据从SSD闪存中读出到写回主机,这个过程中会经过多个部件、多种传输和复杂的软件处理,任何一个环节发生错误都可能导致数据错误。
但是这种错误一般无法被立即检测出来,而是后续通过应用在访问数据过程中,才发现数据已经出错,在应用层体现出现数据不一致,这类错误我们称为静默数据破坏,即Silent Data Corruption。
为确保主机和SSD之间的数据完整性,NVMe提供了端到端数据保护机制,它可以有效降低静默错误的发生,保护主机写入闪存和从闪存读出到写入主机的全部流程,使数据的一致性得到保证。
NVMe端到端数据保护的关键在于PI(Protection Information)的使用。完整的端到端数据保护支持由Host端生成PI,提供从Host直至SSD内部的完整端到端数据路径保护。在数据生成时,通过对数据添加PI,并将其作为元数据始终伴随用户数据一同传输和校验,借此降低静默错误的发生;同时,借助ECC(如BCH、LDPC)、Die间RAID5等手段,对检测到的错误数据加以修正,提升整个端到端数据传输过程中的可靠性。PI也可以通过SSD Controller生成,提供SSD盘内的数据保护,通常,我们将后者称为“数据路径保护”技术。
什么是 PI
NVMe协议规定(后续介绍均参照NVMe2.0协议),Host与SSD之间的数据交互,除了逻辑块(用户数据),还可以携带一些额外的元数据(MetaData),大小为0~N Bytes。Metadata一个最重要的角色就是传递端对端(E2E, End to End)数据保护信息(PI, Protection Information)。
PI相当于逻辑块数据的保镖,有DIF(Data Integrity Field)和DIX(Data Integrity Extension)两种数据保护机制,两者的主要区别是PI信息的位置不同。
(1)DIF: 是data buffer和Metadata buffer连接在一起传输的模式。如下图所示:
(2)DIX: 是data buffer和Metadata buffer分离的一种模式,最后会在SSD端把它们拼接在一起。如下图所示:
PI 的组成
PI内容主要由Guard、Application Tag、Reference Tag和Storage Tag组成。
Guard Tag: 用户数据的 CRC 校验信息,支持CRC16/CRC32/CRC64
Application Tag: 应用指定Tag,固定为16bit
Reference Tag: Reference Tag 把逻辑块数据与一个地址关联起来,防止被误用或者乱序逻辑块传输,用来检测数据是否写入错误的 LBA 地址;
Storage Tag: 应用指定Tag
根据配置不同,PI 主要有四种组成格式:
1)16bit Guard Tag(Storage Tag size is zero)
2) 16bit Guard Tag(Storage Tag size is non-zero)
3) 32bit Guard Tag
4) 64bit Guard Tag
PI 的位置
按照NVMe协议,根据对SSD命名空间的格式化(512B or 4KB Sector),PI可以放置在元数据的前8或后8字节。
如果Metadata元数据超过8字节(如支持64B元数据),则CRC处理原则如下:
PI在Metadata前8字节,PI中CRC tag的生成不包括Metadata字节。
PI在Metadata后8字节,PI中CRC tag的生成包含Metadata字节,但不包括后8字节PI。
Host通过NVMe format命令DWord10中的PIL字段指定PI在Metadata中的位置:为1则是Metadata的首8B,为0则是Metadata 的尾8B。
PI 的类型
根据不同的Tag设置和PI 检查方式,PI 可分为Type0、Type1、Type2、Type3四种类型。
Host通过NVMe format命令DWord10中的PI字段指定了PI的类型。
PI 的生成机制和Check范围
NVMe IO命令主要通过PRINFO (Protection Information Field) 和ILBRT/EILBRT命令字来控制PI的生成机制和Check范围。
PRINFO控制PI主要包括PRACT(Protection Information Action)和PRCHK(Protection Information Check)。
1.PRACT
PRACT指明了PI信息生成的机制。
PRACT=0
当WRITE命令时:
(1)如果namespace在format的时候没有启动PI 使能,针对Host过来的Logical User Data和Meta,NVMe模块不会做任何处理,直接交给后端的Flash Controller模块处理。
(2)如果namespace在format的时候启动了PI 使能且PRACT=0,SSD接收到Host传来的数据后根据PRCHK检查PI,如果检查失败,SSD会向Host返回命令失败,并置上相应的错误位(Guard check, App Tag Check 和 Ref Tag Check)。
当READ命令时:
(1)如果namespace在format的时候启动了PI使能且PRACT=0,SSD读取到FLASH的数据以后会根据PRCHK检查PI,如果检查失败,SSD会向Host返回命令失败,并置上相应的错误位(Guard check, App Tag Check 和 Ref Tag Check)。
PRACT=1
当WRITE命令时:
(1)如果namespace在format的时候启动了PI 使能且PRACT=1,并且Metadata size= 8Byte,SSD会生成PI信息并跟User Data一起写入Flash。
(2)如果namespace在format的时候启动了PI 使能且PRACT=1,并且Metadata size > 8Byte (比如16 Byte),SSD会生成并覆盖原有的PI信息,跟User Data一起写入Flash。
当READ命令时:
(1)如果namespace在format的时候启动了PI使能且PRACT=1,并且Metadata size= 8Byte,SSD从Flash读出数据以后会检查PI信息,如果失败,向Host返回命令失败,如果通过,去掉PI(也就是Meta data)仅将User Data返回给Host。
(2)如果namespace在format的时候启动了PI使能且PRACT=1,并且Metadata size > 8Byte (比如16 Byte),SSD从Flash读出数据以后会检查PI信息,如果失败,向Host返回命令失败,如果通过,将包含PI的Meta data连同User Data一起返回给Host。
2.PRCHK
PRCHK控制PI具体检查的内容。
如果PRCHK bit2=1,检查Guard Tag。SSD比较PI中的Guard与User Data的CRC
如果 PRCHK bit1=1,检查Application Tag。SSD比较PI中的App Tag与读写命令里的LBAT (Logical Block Application Tag)位的内容
如果PRCHK bit0=1,检查Reference Tag
* 针对 Type1 PI,SSD比较PI中的Ref Tag与计算出的参考Ref Tag,如果检查失败,向Host 返回命令失败;
* 参考Ref Tag包含在读写命令的ILBRT或者 EILBRT中;
* 针对Type 1和Type 2 PI,参考Ref Tag随着LBA增加递增;
* 针对Type3 PI,参考Ref Tag保持不变;
* 针对Type1 PI,Host必须保证ILBRT和EILBRT与LBA的最后4个Byte相等;
* 针对Type2 PI,SSD检查PI的方式与Type1 相同,不同处在于Host可以任意指定ILBRT和EILBRT;
* 针对Type3 PI,SSD不会检查ILBRT和EILBRT,同时可以直接Abort这个命令;
* 针对Type1和Type 2 PI,如果App Tag=0xFFFF,PI check会被Disable;
* 针对Type 3 PI,如果Ref Tag和 App Tag所有bit均为1,PI check会被Disable。
3.ILBRT/EILBRT
ILBRT/EILBRT命令字主要用于SSD计算Ref Tag,计算方法前文介绍中已有描述。具体内容在NVMe CMD的DWord3和DWord14中。
beat365体育官网平台SSD主控芯片端到端数据保护
beat365体育官网平台即将流片的新一代高性能消费级PCIe5.0 SSD主控芯片STAR1500和已上市的PCIe4.0 SSD主控芯片STAR2000,均已支持NVMe2.0协议中的端到端数据保护功能,支持主机或者SSD内部产生PI信息,为用户提供了高可靠的数据业务保护,使用户使用更安心。