數(shù)據(jù)完整性是數(shù)據(jù)存儲(chǔ)系統(tǒng)中關(guān)鍵的元素之一,對(duì)于用戶而言,不一致的數(shù)據(jù)可能導(dǎo)致嚴(yán)重的業(yè)務(wù)錯(cuò)誤產(chǎn)生,因此保障數(shù)據(jù)的完整性與一致性至關(guān)重要。
NVMe SSD端到端保護(hù)
在主機(jī)和SSD之間進(jìn)行數(shù)據(jù)交互,數(shù)據(jù)從主機(jī)生成到寫入SSD閃存中,以及數(shù)據(jù)從SSD閃存中讀出到寫回主機(jī),這個(gè)過程中會(huì)經(jīng)過多個(gè)部件、多種傳輸和復(fù)雜的軟件處理,任何一個(gè)環(huán)節(jié)發(fā)生錯(cuò)誤都可能導(dǎo)致數(shù)據(jù)錯(cuò)誤。

但是這種錯(cuò)誤一般無法被立即檢測(cè)出來,而是后續(xù)通過應(yīng)用在訪問數(shù)據(jù)過程中,才發(fā)現(xiàn)數(shù)據(jù)已經(jīng)出錯(cuò),在應(yīng)用層體現(xiàn)出現(xiàn)數(shù)據(jù)不一致,這類錯(cuò)誤我們稱為靜默數(shù)據(jù)破壞,即Silent Data Corruption。
為確保主機(jī)和SSD之間的數(shù)據(jù)完整性,NVMe提供了端到端數(shù)據(jù)保護(hù)機(jī)制,它可以有效降低靜默錯(cuò)誤的發(fā)生,保護(hù)主機(jī)寫入閃存和從閃存讀出到寫入主機(jī)的全部流程,使數(shù)據(jù)的一致性得到保證。
NVMe端到端數(shù)據(jù)保護(hù)的關(guān)鍵在于PI(Protection Information)的使用。完整的端到端數(shù)據(jù)保護(hù)支持由Host端生成PI,提供從Host直至SSD內(nèi)部的完整端到端數(shù)據(jù)路徑保護(hù)。在數(shù)據(jù)生成時(shí),通過對(duì)數(shù)據(jù)添加PI,并將其作為元數(shù)據(jù)始終伴隨用戶數(shù)據(jù)一同傳輸和校驗(yàn),借此降低靜默錯(cuò)誤的發(fā)生;同時(shí),借助ECC(如BCH、LDPC)、Die間RAID5等手段,對(duì)檢測(cè)到的錯(cuò)誤數(shù)據(jù)加以修正,提升整個(gè)端到端數(shù)據(jù)傳輸過程中的可靠性。PI也可以通過SSD Controller生成,提供SSD盤內(nèi)的數(shù)據(jù)保護(hù),通常,我們將后者稱為“數(shù)據(jù)路徑保護(hù)”技術(shù)。
什么是 PI
NVMe協(xié)議規(guī)定(后續(xù)介紹均參照NVMe2.0協(xié)議),Host與SSD之間的數(shù)據(jù)交互,除了邏輯塊(用戶數(shù)據(jù)),還可以攜帶一些額外的元數(shù)據(jù)(MetaData),大小為0~N Bytes。Metadata一個(gè)最重要的角色就是傳遞端對(duì)端(E2E, End to End)數(shù)據(jù)保護(hù)信息(PI, Protection Information)。
PI相當(dāng)于邏輯塊數(shù)據(jù)的保鏢,有DIF(Data Integrity Field)和DIX(Data Integrity Extension)兩種數(shù)據(jù)保護(hù)機(jī)制,兩者的主要區(qū)別是PI信息的位置不同。
(1)DIF: 是data buffer和Metadata buffer連接在一起傳輸?shù)哪J?。如下圖所示:

(2)DIX: 是data buffer和Metadata buffer分離的一種模式,最后會(huì)在SSD端把它們拼接在一起。如下圖所示:

PI 的組成
PI內(nèi)容主要由Guard、Application Tag、Reference Tag和Storage Tag組成。
Guard Tag: 用戶數(shù)據(jù)的 CRC 校驗(yàn)信息,支持CRC16/CRC32/CRC64
Application Tag: 應(yīng)用指定Tag,固定為16bit
Reference Tag: Reference Tag 把邏輯塊數(shù)據(jù)與一個(gè)地址關(guān)聯(lián)起來,防止被誤用或者亂序邏輯塊傳輸,用來檢測(cè)數(shù)據(jù)是否寫入錯(cuò)誤的 LBA 地址;
Storage Tag: 應(yīng)用指定Tag
根據(jù)配置不同,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協(xié)議,根據(jù)對(duì)SSD命名空間的格式化(512B or 4KB Sector),PI可以放置在元數(shù)據(jù)的前8或后8字節(jié)。
如果Metadata元數(shù)據(jù)超過8字節(jié)(如支持64B元數(shù)據(jù)),則CRC處理原則如下:
PI在Metadata前8字節(jié),PI中CRC tag的生成不包括Metadata字節(jié)。

PI在Metadata后8字節(jié),PI中CRC tag的生成包含Metadata字節(jié),但不包括后8字節(jié)PI。

Host通過NVMe format命令DWord10中的PIL字段指定PI在Metadata中的位置:為1則是Metadata的首8B,為0則是Metadata 的尾8B。

PI 的類型
根據(jù)不同的Tag設(shè)置和PI 檢查方式,PI 可分為Type0、Type1、Type2、Type3四種類型。

Host通過NVMe format命令DWord10中的PI字段指定了PI的類型。

PI 的生成機(jī)制和Check范圍
NVMe IO命令主要通過PRINFO (Protection Information Field) 和ILBRT/EILBRT命令字來控制PI的生成機(jī)制和Check范圍。
PRINFO控制PI主要包括PRACT(Protection Information Action)和PRCHK(Protection Information Check)。

1.PRACT
PRACT指明了PI信息生成的機(jī)制。
PRACT=0
當(dāng)WRITE命令時(shí):
(1)如果namespace在format的時(shí)候沒有啟動(dòng)PI 使能,針對(duì)Host過來的Logical User Data和Meta,NVMe模塊不會(huì)做任何處理,直接交給后端的Flash Controller模塊處理。
(2)如果namespace在format的時(shí)候啟動(dòng)了PI 使能且PRACT=0,SSD接收到Host傳來的數(shù)據(jù)后根據(jù)PRCHK檢查PI,如果檢查失敗,SSD會(huì)向Host返回命令失敗,并置上相應(yīng)的錯(cuò)誤位(Guard check, App Tag Check 和 Ref Tag Check)。


當(dāng)READ命令時(shí):
(1)如果namespace在format的時(shí)候啟動(dòng)了PI使能且PRACT=0,SSD讀取到FLASH的數(shù)據(jù)以后會(huì)根據(jù)PRCHK檢查PI,如果檢查失敗,SSD會(huì)向Host返回命令失敗,并置上相應(yīng)的錯(cuò)誤位(Guard check, App Tag Check 和 Ref Tag Check)。


PRACT=1
當(dāng)WRITE命令時(shí):
(1)如果namespace在format的時(shí)候啟動(dòng)了PI 使能且PRACT=1,并且Metadata size= 8Byte,SSD會(huì)生成PI信息并跟User Data一起寫入Flash。

(2)如果namespace在format的時(shí)候啟動(dòng)了PI 使能且PRACT=1,并且Metadata size > 8Byte (比如16 Byte),SSD會(huì)生成并覆蓋原有的PI信息,跟User Data一起寫入Flash。

當(dāng)READ命令時(shí):
(1)如果namespace在format的時(shí)候啟動(dòng)了PI使能且PRACT=1,并且Metadata size= 8Byte,SSD從Flash讀出數(shù)據(jù)以后會(huì)檢查PI信息,如果失敗,向Host返回命令失敗,如果通過,去掉PI(也就是Meta data)僅將User Data返回給Host。

(2)如果namespace在format的時(shí)候啟動(dòng)了PI使能且PRACT=1,并且Metadata size > 8Byte (比如16 Byte),SSD從Flash讀出數(shù)據(jù)以后會(huì)檢查PI信息,如果失敗,向Host返回命令失敗,如果通過,將包含PI的Meta data連同User Data一起返回給Host。

2.PRCHK
PRCHK控制PI具體檢查的內(nèi)容。
如果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)位的內(nèi)容
如果PRCHK bit0=1,檢查Reference Tag
* 針對(duì) Type1 PI,SSD比較PI中的Ref Tag與計(jì)算出的參考Ref Tag,如果檢查失敗,向Host 返回命令失??;
* 參考Ref Tag包含在讀寫命令的ILBRT或者 EILBRT中;
* 針對(duì)Type 1和Type 2 PI,參考Ref Tag隨著LBA增加遞增;
* 針對(duì)Type3 PI,參考Ref Tag保持不變;
* 針對(duì)Type1 PI,Host必須保證ILBRT和EILBRT與LBA的最后4個(gè)Byte相等;
* 針對(duì)Type2 PI,SSD檢查PI的方式與Type1 相同,不同處在于Host可以任意指定ILBRT和EILBRT;
* 針對(duì)Type3 PI,SSD不會(huì)檢查ILBRT和EILBRT,同時(shí)可以直接Abort這個(gè)命令;
* 針對(duì)Type1和Type 2 PI,如果App Tag=0xFFFF,PI check會(huì)被Disable;
* 針對(duì)Type 3 PI,如果Ref Tag和 App Tag所有bit均為1,PI check會(huì)被Disable。
3.ILBRT/EILBRT
ILBRT/EILBRT命令字主要用于SSD計(jì)算Ref Tag,計(jì)算方法前文介紹中已有描述。具體內(nèi)容在NVMe CMD的DWord3和DWord14中。

憶芯SSD主控芯片端到端數(shù)據(jù)保護(hù)
憶芯科技即將流片的新一代高性能消費(fèi)級(jí)PCIe5.0 SSD主控芯片STAR1500和已上市的PCIe4.0 SSD主控芯片STAR2000,均已支持NVMe2.0協(xié)議中的端到端數(shù)據(jù)保護(hù)功能,支持主機(jī)或者SSD內(nèi)部產(chǎn)生PI信息,為用戶提供了高可靠的數(shù)據(jù)業(yè)務(wù)保護(hù),使用戶使用更安心。