幾十年來,閃存一直是嵌入式系統(tǒng)的一個(gè)重要課題。與其他存儲(chǔ)技術(shù)相比,它允許大幅改進(jìn)電子設(shè)備的大小和魯棒性。閃存存儲(chǔ)的其他優(yōu)勢(shì)包括缺少移動(dòng)部件和降低功耗。然而,閃存的挑戰(zhàn)并沒有在消費(fèi)類電子產(chǎn)品中廣為宣傳。其中包括有限的耐用性和更高的軟件復(fù)雜性。 圖 1:從U盤驅(qū)動(dòng)器和 SD 卡到 SSD 和集成電路,閃存是我們?nèi)粘I畹囊徊糠帧?/p> 如圖 1 所示,閃存在我們的日常生活中無處不在,從專門用于存儲(chǔ)數(shù)據(jù)的設(shè)備(如U盤驅(qū)動(dòng)器、SD 卡和 SSD)到內(nèi)部使用閃存的其他消費(fèi)類電子產(chǎn)品(如智能手機(jī)、Wi-Fi 調(diào)制解調(diào)器和智能燈燈泡。 一個(gè)標(biāo)志性的反例是2001年發(fā)布的iPod的第一款產(chǎn)品。它使用旋轉(zhuǎn)的硬盤來提供高存儲(chǔ)容量(當(dāng)時(shí)是 5 或 10 GB)。然而,一項(xiàng)研究發(fā)現(xiàn),使用硬盤的產(chǎn)品的故障率大于20%,而配備閃存的型號(hào)的故障率則低于10%。由于它們包含敏感的移動(dòng)部件,旋轉(zhuǎn)的磁盤不能很好地處理機(jī)械沖擊。這對(duì)配備磁性存儲(chǔ)的便攜式設(shè)備的故障率起著關(guān)鍵影響。 圖2:2001年發(fā)布的原版iPod是具有磁性存儲(chǔ)的移動(dòng)設(shè)備的罕見例子。 當(dāng)涉及到嵌入式系統(tǒng)時(shí),閃存是非易失性存儲(chǔ)器的首選。在嵌入式 Linux 系統(tǒng)中,在模塊 (SoM) 和單板計(jì)算機(jī) (SBC) 上使用集成電路 (IC) 是一種常見做法,因?yàn)樗鼈兺ǔ1纫恍┬吞?hào)的 SD 卡更耐數(shù)據(jù)磨損。當(dāng)環(huán)境振動(dòng)是決定性因素時(shí),它們也更加堅(jiān)固。使用集成閃存的模塊案例包括來自 Toradex 的 Apalis 和 Colibri 系列。在圖 3 中,您可以看到 Colibri iMX8X 模塊的放大視圖,該模塊配備了 Micron 的 eMMC: 圖 3:Colibri iMX8X 配備了來自 Micron 的 eMMC 閃存。 本文的目標(biāo)是概述如何通過利用開源和專有軟件來測(cè)量和估計(jì) eMMC 磨損,從而設(shè)計(jì)更可靠的嵌入式系統(tǒng)。其動(dòng)機(jī)是例如對(duì) IoT 網(wǎng)關(guān)和數(shù)據(jù)記錄器的需求不斷增加,以及出于更高的可靠性或間歇性連接原因?qū)⑷哂鄶?shù)據(jù)保留在本地的需求。為了介紹實(shí)際的實(shí)施細(xì)節(jié),配備 Micron eMMC 的 Toradex 模塊將被用于介紹如何實(shí)現(xiàn)磨損監(jiān)控和壽命估計(jì)解決方案,即閃存分析工具。 本文還包括寬泛的技術(shù)概述和一些實(shí)現(xiàn)細(xì)節(jié)。您可能對(duì)該信息并不陌生,因此如果您已經(jīng)具備必要的知識(shí)或您認(rèn)為合適,請(qǐng)隨時(shí)跳過部分。 技術(shù)概述 在進(jìn)一步討論之前,值得注意的是,閃存是一個(gè)如此廣泛的話題,即使一篇專門討論其工作原理的文章也無法提供足夠全面的概述。以下段落僅作為背景,以更好地了解如何估計(jì) eMMC 磨損。 雖然本文僅介紹了理解磨損估計(jì)的要點(diǎn),但互聯(lián)網(wǎng)上提供了有關(guān)閃存存儲(chǔ)的豐富文獻(xiàn)。例如,Toradex 在其開發(fā)者網(wǎng)站上擁有博客、網(wǎng)絡(luò)研討會(huì)錄像和一系列文章。維基百科關(guān)于閃存的文章也有超過一百個(gè)對(duì)其他資源的引用。 NOR 和 NAND 閃存是一個(gè)寬泛的術(shù)語,有幾種技術(shù)組合共同構(gòu)成具有特定特性的最終閃存產(chǎn)品。閃存存儲(chǔ)分可初步分為兩種類型:NOR 和 NAND。這些以該技術(shù)在晶體管級(jí)別如何運(yùn)行來存儲(chǔ)位而命名,類似于 NOR 和 NAND 邏輯門。 雖然 NOR 具有更簡(jiǎn)單的操作原理和更高的可靠性,但它通常需要更高的引腳數(shù)量,并且與 NAND 相比,其單位硅面積的存儲(chǔ)密度較低,這會(huì)影響其尺寸和成本。由于這些原因,NOR 通常只用于特定應(yīng)用,即使對(duì)于工業(yè)級(jí)、高度可靠的嵌入式系統(tǒng)也是如此。您可以在 Micron 的 NOR /NAND 閃存指南(PDF)了解更多此話題的信息。您可以在圖 4 中看到 NOR和 NAND 技術(shù)在存儲(chǔ)密度和容量方面的摘要,該摘要取自本段中提到的指南: 圖 4:按密度和容量劃分的 NOR 和 NAND 產(chǎn)品。(來源:Micron NOR/NAND閃存指南) 如您所見,Micron eMMC 是 MLC 和 TLC 范圍內(nèi)的專用 NAND 設(shè)備,我們將對(duì)此進(jìn)行更詳細(xì)的討論。由于 Toradex 模塊使用 4GB 到 16GB 范圍內(nèi)的 eMMC,我們可以推斷它們使用 MLC 設(shè)備。本文稍后將對(duì)此進(jìn)行介紹。 NAND 結(jié)構(gòu) 原始的 NAND 閃存設(shè)備可以分為三個(gè)不同的部分。
從上面的要點(diǎn)中最重要的信息是,塊磨損,因?yàn)樗鼈儠?huì)被擦除。因此,我們最感興趣的是塊擦除計(jì)數(shù)。也就是說,每個(gè)塊被擦除的次數(shù)。 圖 5:原始 NAND 閃存的總體示意圖。 NAND SLC 和 MLC 單元格作為最小單位,用于存儲(chǔ)每一個(gè)位。每個(gè)單元實(shí)際存儲(chǔ)的位數(shù)取決于它在讀取操作期間可以保持和區(qū)分的電平閾值。閃存有多種設(shè)計(jì),用于指示存儲(chǔ)單元可以存儲(chǔ)的位數(shù)。
表 1 總結(jié)的密度和成本與可靠性和使用壽命之間存在權(quán)衡。 表1:NAND單元技術(shù)比較 圖 6 有助于展示 SLC 和 MLC 如何存儲(chǔ)位: 圖 6:SLC 和 MLC 電壓閾值 pSLC("偽SLC")提高了 MLC 設(shè)備的操作速度和使用壽命,但代價(jià)是將其容量減少一半。壽命與真正的 SLC 無法相比擬,但它大大增加了。偽 SLC 不應(yīng)與快速模式混淆,后者使 MLC 設(shè)備更快,但不會(huì)延長其使用壽命: 圖 7:偽 SLC 和快速模式 了解塊是否配置為 MLC 或 pSLC 對(duì)于確定設(shè)備的使用壽命非常重要,因?yàn)槲覀儠?huì)隨著時(shí)間的推移統(tǒng)計(jì)壞塊計(jì)數(shù)。 對(duì)于使用 MLC 技術(shù)的 eMMC,根據(jù)硅的線寬,塊一般可以承受 3000 到 10000 次擦除周期。與 MLC 相比,pSLC 的生存期提高操作2倍。因此,pSLC 比快速模式或提高配置(即使用容量翻倍的閃存使其使用壽命延長兩倍)更可取。在制造商的公開文檔中很難找到擦除周期計(jì)數(shù)和線寬值,因此對(duì)設(shè)備本身進(jìn)行基準(zhǔn)測(cè)試可能是一種解決方案。 ECC 我們簡(jiǎn)要地回顧了塊磨損并變無法繼續(xù)使用。這時(shí)當(dāng)它們正常的時(shí)候,并不是一切都是完美的。位可能被隨機(jī)翻轉(zhuǎn),損壞存儲(chǔ)的數(shù)據(jù)。這是 ECC 或糾錯(cuò)代碼算法介入以更正翻轉(zhuǎn)的位。 隨著時(shí)間的推移,塊中有位翻轉(zhuǎn)的概率會(huì)增加。當(dāng)它變得太大時(shí),塊被標(biāo)記為無法使用??赡茉谝婚_始就有壞塊,存儲(chǔ)設(shè)備會(huì)從工廠發(fā)貨時(shí)就標(biāo)記一些壞塊。制造商通常包括備用模塊來替換這些壞塊,從而使它們不會(huì)立即影響可用的存儲(chǔ)容量。 寫入放大 簡(jiǎn)單地講,寫入放大就是將數(shù)據(jù)從一個(gè)塊復(fù)制到另一個(gè)塊,無論是為了更新數(shù)據(jù)、磨損均衡或任何其他原因。 磨損均衡和垃圾回收 如果始終使用相同的物理頁和塊,如更新文件,則這些塊將過早磨損。在最壞的情況下,如果 NAND 控制器沒有為壞塊重新分配,則系統(tǒng)甚至可能在閃存壽命終止 (EOL) 之前停止工作。 為了防止這種情況發(fā)生,磨損均衡算法可確保塊始終被均勻使用。為此,它會(huì)移動(dòng)數(shù)據(jù)。有兩種類型的磨損均衡算法。
垃圾回收是在出于任何原因復(fù)制數(shù)據(jù)時(shí)將塊標(biāo)記為"臟"的過程,而不是簡(jiǎn)單地直接清除它們。臟塊僅在以后某個(gè)時(shí)間點(diǎn)擦除,例如系統(tǒng)空閑時(shí),但早于當(dāng)系統(tǒng)將再次需要這些塊的的時(shí)間。請(qǐng)記住,擦除塊是一種緩慢的操作,因此在某些情況下,適當(dāng)?shù)睦厥湛梢蕴岣咝阅?/p> 圖 8 展示了原始 NAND 管理算法如何被視為控制器將物理擦除塊( PEB )映射到邏輯擦除塊(LEB),并將特定的 NAND 操作抽象為簡(jiǎn)單的讀取和寫入操作: 圖 8:原始 NAND 操作通過控制器抽象。 當(dāng)原始 NAND 芯片連接到系統(tǒng),試圖實(shí)現(xiàn)"透明"控制器以簡(jiǎn)單地將 NAND 編程、讀取和擦除操作轉(zhuǎn)換到類似 HDD 的讀寫操作時(shí),它嚴(yán)重影響了閃存的性能和使用壽命。這就是為什么 Linux MTD 子系統(tǒng)幾乎總是被基于原始 NAND 特性的文件系統(tǒng)使用,并且可能在這之間還有一層,如UBI 和 UBIFS 就是一個(gè)例子,而不是文件系統(tǒng)直接訪問塊設(shè)備。 如果您想了解有關(guān)磨損均衡的更多信息,請(qǐng)查看 Micron 的 TN-29-42:NAND 閃存設(shè)備中的磨損均衡處理技術(shù) (PDF) 和維基百科上的"磨損均衡"文章(以及其參考資料,包括一些LWN.net文章)。有關(guān)垃圾回收,請(qǐng)閱讀 Micron 的 TN-2960:?jiǎn)渭?jí)單元 NAND 閃存中的垃圾回收 (PDF)。 要詳細(xì)了解原始 NAND 設(shè)備和應(yīng)用程序之間抽象層的完整實(shí)現(xiàn),請(qǐng)完整閱讀MTD、UBI 和 UBIFS 文檔。當(dāng)然,為了了解實(shí)現(xiàn)的細(xì)節(jié),您也可以看看Linux內(nèi)核源代碼。 盡管原始 NAND 操作非常復(fù)雜,為了創(chuàng)建磨損估計(jì)模型,我們必須在一定程度上了解這些操作,抽象這種復(fù)雜性的簡(jiǎn)單方法是購買具有集成控制器的 NAND 設(shè)備,也稱為托管型NAND。就集成電路而言,常用類型包括嵌入式 USB、eMMC 和 UFS。在這里,我們將重點(diǎn)討論eMMC。 eMMC 閃存分析 工業(yè)級(jí)嵌入式系統(tǒng)中最常用的大容量閃存技術(shù)之一是 eMMC(嵌入式多媒體卡),它由原始 NAND(通常是 MLC 或 TLC)及其附帶的 NAND 控制器組成。它從底層操作系統(tǒng)中抽象了大部分管理軟件堆棧。eMMC 標(biāo)準(zhǔn)由 JEDEC 維護(hù),在注冊(cè)后可免費(fèi)使用。本文撰寫時(shí)發(fā)布的最新標(biāo)準(zhǔn)是嵌入式多媒體卡電氣特性標(biāo)準(zhǔn) 5.1(注冊(cè)后下載 PDF)。 由于控制器提供了高質(zhì)量的抽象層(前提是它來自可靠的制造商)因此,只要采取一些預(yù)防措施,就可以安全地使用能夠處理塊設(shè)備操作的文件系統(tǒng)。在 Toradex 嵌入式 Linux BSP 中,對(duì)于具有 eMMC 閃存的計(jì)算機(jī)模塊,我們默認(rèn)使用 EXT4 文件系統(tǒng)。圖 9 總結(jié)了原始 NAND 和托管型 NAND 在控制器方面的差異: 圖 9:原始 NAND 和 eMMC 控制器 在本文的示例中,我們分析了具有 1024 個(gè)塊的 4GB MLC eMMC,在實(shí)際情況中,它可以時(shí) Micron的MTFC4GAJCN-1M-WT,這在 Apalis iMX6Q 1GB 最新版本的模塊上使用。我們還假設(shè)平均塊壽命為 3000 次擦除周期,這只是一個(gè)根據(jù)我們實(shí)際經(jīng)驗(yàn)的猜測(cè)。它不是從上述器件的數(shù)據(jù)表中得到的。 使用 eMMC 的挑戰(zhàn)在于收集有關(guān)控制器實(shí)施和模塊生命周期的詳細(xì)信息,這些細(xì)節(jié)可能公開提供,也可能不公開。此外,人們可能更喜歡選擇提供良好專有健康報(bào)告的制造商。eMMC 標(biāo)準(zhǔn)為此保留一些寄存器,但是否使用它們則是可選的。為案例研究選擇的 eMMC 具有詳細(xì)的健康報(bào)告,有關(guān)該報(bào)告的詳細(xì)信息可從 Micron 的 TN-FC-32:e.MMC 設(shè)備運(yùn)行狀況報(bào)告獲取,該報(bào)告可在 Micron 網(wǎng)站的 eMMC 軟件部分注冊(cè)后獲得。在 Micron 網(wǎng)站的這一部分中,您還可以找到本文稍后將使用的 emmcparm 工具,以及非常有幫助的 TN-FC-25:了解 eMMC 的 Linux 驅(qū)動(dòng)程序支持。 命令和寄存器 eMMC 標(biāo)準(zhǔn)通過包含電源、CMD、DAT0-7 和 CLK 信號(hào)的總線定義了操作。 CMD 是一個(gè)串行通道,不同的 CMD 值表示不同的操作。將命令從主機(jī)發(fā)送到卡后,將通過同一串行行從卡向主機(jī)回復(fù)應(yīng)答。相關(guān)數(shù)據(jù)可通過 DAT 信號(hào)線獲取問。為了更好的說明,圖 10 中提供了多塊讀取操作的圖示。幸運(yùn)的是,我們將使用的所有工具已經(jīng)實(shí)現(xiàn)并抽象成為了 eMMC 通信。 圖 10:多塊讀取操作。(資料來源:JEDEC標(biāo)準(zhǔn)號(hào)84-B51,第5.3.1節(jié),第9頁) eMMC 標(biāo)準(zhǔn)還定義了具有不同信息集的寄存器,這些信息又可通過特定的 CMD 命令進(jìn)行訪問。表 2 顯示了 eMMC 寄存器: 表2:e.MMC寄存器(資料來源:JEDEC標(biāo)準(zhǔn)號(hào)84-B51,第5.3章,第8頁) Extended Device Specific Data(以前稱為Extended Card Specific Data)是提供運(yùn)行狀況報(bào)告的位置。它包含:
一個(gè)相關(guān)的問題:如果這些信息是現(xiàn)成的,為什么不只使用JEDEC標(biāo)準(zhǔn)的數(shù)據(jù)?
Micron 專有運(yùn)行報(bào)告 對(duì)于本主題,我們(幾乎)不在 JEDEC 標(biāo)準(zhǔn)的討論范圍之內(nèi)。我們需要了解的唯一信息是如何訪問此數(shù)據(jù)。我們只需要知道,我們必須使用一般的命令,即GEN_CMD或CMD56,作為入口門,從器件中獲取這些數(shù)據(jù)。eMMC 規(guī)范中特定應(yīng)用命令部分包含更多詳細(xì)信息。 我們接下來需要的信息是供應(yīng)商實(shí)現(xiàn)的運(yùn)行狀況報(bào)告。在我們的例子中,它包含在 Micron 的 TN-FC-32: e.MMC 設(shè)備運(yùn)行狀況報(bào)告中,可在 e.MMC 軟件區(qū)域中找到。 可獲取下面的數(shù)據(jù):
要訪問其中每個(gè)參數(shù),必須由 CMD56 發(fā)出特定的參數(shù)。 關(guān)于在計(jì)算機(jī)模塊在生命期內(nèi) eMMC 支持的說明 計(jì)算機(jī)模塊制造商通常有長期供貨策略,因?yàn)樗麄兊目蛻艨梢詮闹惺芤?,如工業(yè)和醫(yī)療用戶。例如,Toradex 保證超過 10 年的供貨。 通常,單個(gè)器件的生命周期比整個(gè)計(jì)算機(jī)模塊的生命周期短。因此,新版本硬件會(huì)隨著時(shí)間的推移發(fā)布,并與產(chǎn)品更改通知 (PCN) 進(jìn)行說明。這是使用計(jì)算機(jī)模塊的主要優(yōu)勢(shì)之一 ,它抽象了重新設(shè)計(jì)的復(fù)雜性。 另一方面,您可能會(huì)想出一個(gè)不符合最新標(biāo)準(zhǔn)的 eMMC 的硬件。這是另一種實(shí)際方案,您希望有一個(gè)磨損估計(jì)解決方案以某種方式脫離特定的技術(shù)或標(biāo)準(zhǔn)。 閃存運(yùn)行狀況 在任何給定時(shí)間點(diǎn)的閃存運(yùn)行狀況可以理解為已耗盡的容量百分比。為了簡(jiǎn)單起見,我們將假設(shè)在早期階段沒有塊磨損,磨損水平是最佳和靜態(tài)的,并且沒有寫入放大,即理想的場(chǎng)景。 總使用量可以從擦除總數(shù)或可寫入設(shè)備的數(shù)據(jù)總量中獲得: 或者 這里:
根據(jù)定義,擦除周期的總數(shù)更準(zhǔn)確,因?yàn)閴K磨損由塊擦除引起。因此,前一種方法往往優(yōu)于后者。 在上面的示例中,一旦將 1536000 次擦除均勻地分布的塊上執(zhí)行,或者將大約 6 TB 的數(shù)據(jù)寫入設(shè)備,則其生存期已達(dá)到其生存期的 50%。 在 Linux 上監(jiān)視閃存運(yùn)行狀況 要Linux 中監(jiān)視前幾節(jié)中討論的閃存運(yùn)行狀況參數(shù),需要從 eMMC 設(shè)備中提取有意義的信息的軟件??蛇_(dá)到此目的的開源工具是 mmc-utils。它實(shí)現(xiàn)了大量 eMMC 協(xié)議,包括從Extended Card-Specific Data (EXT_CSD) 寄存器讀取數(shù)據(jù),并以人們可讀格式顯示數(shù)據(jù)。它包括 JEDEC eMMC 5.0 標(biāo)準(zhǔn)中定義的器件壽命。讓我們通過運(yùn)行不帶任何參數(shù)的軟件來簡(jiǎn)要了解一下它,其打印了幫助信息: root@colibri-imx6:~# mmc 上面的輸出側(cè)重于 extcsd 操作。如果我們執(zhí)行 extcsd 讀取命令,我們可以獲取一系列信息,包括 JEDEC 運(yùn)行狀況。讓我們看看輸出的開頭或第一行: root@colibri-imx6-05097264:/app# mmc extcsd read /dev/mmcblk1 這證實(shí)了我們有一個(gè)符合 JEDEC 5.0 標(biāo)準(zhǔn)的 eMMC。然后,我們可以篩選輸出以獲取 JEDEC 定義的運(yùn)行狀況: root@colibri-imx6:~# mmc extcsd read /dev/mmcblk1 | grep LIFE 在上面的示例中,我們看到運(yùn)行狀況估計(jì)設(shè)備壽命在 0% 到 10% 之間,并且具有正常的 EOL前的狀態(tài)。因此,它是一個(gè)新的設(shè)備。如果我們嘗試獲取供應(yīng)商的專有運(yùn)行狀況報(bào)告,我們發(fā)現(xiàn)它無法通過最新 mmc-utils 獲得。甚至稍早的 ChroiumOS 也只顯示零: root@colibri-imx6:~# mmc-cos extcsd read /dev/mmcblk1 | grep -i health 然而,人們總是可以編寫一些補(bǔ)丁來嘗試擴(kuò)展該工具的功能。一個(gè)可用作測(cè)試的示例可能類似于如下代碼所示。請(qǐng)注意,為了簡(jiǎn)潔起見,此代碼未完整顯示,例如省略驗(yàn)證功能: / Retrieve the erase count for each block for(physical_block = 0; physical_block < 128; physical_block++){ 然后,我們可以用這個(gè)應(yīng)用程序,從 Micron 的閃存中檢索以下數(shù)據(jù): int do_bad_block_count(int nargs, char **argv); 另一種選擇是使用供應(yīng)商的特定工具,如 Micron 的 emmcparm,該工具不僅提供 JEDEC 的綜合壽命報(bào)告,而且還提供上面列出的和在實(shí)際使用中舉例說明的更詳細(xì)的參數(shù)。 在撰寫本文時(shí)(2019 年 8 月),emmcparm 自 2016 年 5 月 27 日發(fā)布版本 2.6.0 以來到2019 年 6 月 5 日發(fā)布的 4.4.0 版本期間有不定期的更新。該工具具有多種功能,其中運(yùn)行狀況為一個(gè): root@colibri-imx6:~# emmcparm_arm I/O 跟蹤 I/O 跟蹤可以是一個(gè)有用的指示器,表明閃存在迅速耗盡,也可以是一個(gè)調(diào)試指示器,用于顯示哪些應(yīng)用程序正在寫入過多的數(shù)據(jù)。I/O 跟蹤為不依賴于 JEDEC 標(biāo)準(zhǔn)或 eMMC 供應(yīng)商運(yùn)行狀況報(bào)告的磨損估計(jì)模型提供輸入數(shù)據(jù)。因此,它是實(shí)現(xiàn)一種靈活的工具的想法,可以擴(kuò)展到所有各類使用原始 NAND 作為存儲(chǔ)的技術(shù)。 實(shí)現(xiàn)可靠的 I/O 跟蹤機(jī)制的第一步是掌握一些關(guān)于 Linux I/O 堆棧工作原理的基本知識(shí)。在非常高的層面上,通常在應(yīng)用程序開發(fā)期間發(fā)生的情況是編寫一些用戶空間代碼,并執(zhí)行文件操作。 操作的完成方式可能因您使用的庫和語言而異,但在某些時(shí)候,會(huì)從用戶空間過渡到內(nèi)核空間。此時(shí)庫的函數(shù)會(huì)對(duì)內(nèi)核進(jìn)行系統(tǒng)調(diào)用。除了使用經(jīng)過良好測(cè)試的成熟庫(如 C 標(biāo)準(zhǔn)庫),您也可以自行進(jìn)行系統(tǒng)調(diào)用,但代價(jià)是需要實(shí)現(xiàn)抽象,并容易出錯(cuò)。 然后,Linux 內(nèi)核通過通常稱為 I/O 堆?;虼鎯?chǔ)堆棧來處理該 I/O。作為最后一步,它通過低級(jí)設(shè)備驅(qū)動(dòng)程序?qū)?shù)據(jù)發(fā)送到設(shè)備,在使用 eMMC 的情況下,該驅(qū)動(dòng)程序必須符合 JEDEC 標(biāo)準(zhǔn)。圖 11 在盡可能的最高層面上,標(biāo)識(shí)了原始 NAND 和 eMMC 設(shè)備的堆棧 圖 11:eMMC 和原始 NAND 的 I/O 堆棧 我們可以從上到下瀏覽內(nèi)核堆棧: 圖12:Linux內(nèi)核結(jié)構(gòu)的簡(jiǎn)化概述。(來源:維基百科)
人們最初可能認(rèn)為,觀察隨時(shí)間而寫入閃存的次數(shù),以獲得寫入速率,是能夠可以從用戶空間完成,并且這就足夠了。然而,這種方法最大的問題是,它不能獲得精確的測(cè)量。 如圖 13 所示,Linux 內(nèi)核是一個(gè)復(fù)雜的系統(tǒng),它通過其堆棧實(shí)現(xiàn)緩存層,以防止不需要的磁盤訪問。這是一個(gè)顧慮,因?yàn)榇疟P操作總是很慢;即使閃存的出現(xiàn),并且其有更快的操作速度,現(xiàn)在也需要延長存儲(chǔ)設(shè)備的生命周期,這些緩存和隊(duì)列對(duì)此有所幫助: 圖 13:緩存、緩沖區(qū)、隊(duì)列和同步。 Linux 內(nèi)核實(shí)現(xiàn)了一個(gè)稱為頁緩存的緩存,該緩存位于高層 VFS 和低層文件系統(tǒng)之間。它是內(nèi)核最受歡迎的緩存系統(tǒng)。它使數(shù)據(jù)可供用戶空間應(yīng)用程序可靠使用,而無需通過文件系統(tǒng)。 進(jìn)一步深入 I/O 堆棧,由于 I/O 合并,優(yōu)化存儲(chǔ)硬件,以及通常以吞吐量為目標(biāo)的 I/O 隊(duì)列的使用,可能會(huì)產(chǎn)生緩存副作用。作為合并 I/O 的示例,有一種回寫機(jī)制,該機(jī)制將數(shù)據(jù)保留到必需寫為止,從而防止碎片化以及使用零碎數(shù)頁或塊。這些機(jī)制也使得很難跟蹤特定進(jìn)程實(shí)際上寫到閃存的數(shù)量。 作為數(shù)據(jù)同步的附帶說明,對(duì)于嵌入式系統(tǒng)應(yīng)用(尤其是沒有備用電源)可能至關(guān)重要,并且可能會(huì)影響閃存壽命。因此,要注意只有在絕對(duì)必要才保存數(shù)據(jù),即使在意外斷電的情況下。用戶按機(jī)器觸摸屏面板上的"保存"按鍵就是此類應(yīng)用的一個(gè)示例。 測(cè)量 I/O 寫入 從我們對(duì)所有實(shí)際到達(dá)閃存的寫入進(jìn)行監(jiān)視和核算的角度來看,問題變得更加明確:
不同于運(yùn)行狀況測(cè)量(可用于收集數(shù)據(jù)的工具數(shù)量有限),可用于 Linux 內(nèi)核堆棧觀察的工具是非常豐富的。圖 14 顯示了這方面的一個(gè)示例,取自Brendan Gregg的博客。Brendan Gregg 是 Linux 性能監(jiān)控領(lǐng)域知識(shí)最淵博的一個(gè)人。 圖 14:Linux 性能觀察性工具。(來源:Brendan Greg) 在我的研究過程中,我使用了iotop來跟蹤用戶空間操作,和blktrace/blkparse來準(zhǔn)確跟蹤塊級(jí)I/O和實(shí)際到達(dá)閃存的內(nèi)容。由于我不是內(nèi)核黑客,這個(gè)主題仍有很大的研究空間,所以我不會(huì)以任何方式暗示這些是最適合或最優(yōu)化的工具。例如,perf 跟蹤和 eBPF 也在我的待辦事項(xiàng)列表中。有一篇關(guān)于Linux塊I/O跟蹤的有趣文章,以及互聯(lián)網(wǎng)上的許多其他資源,包括Linux內(nèi)核文檔本身。 在塊級(jí)別跟蹤 I/O 的重要意義在于準(zhǔn)確性,因?yàn)檫@是確保寫入操作實(shí)際到達(dá)閃存的唯一途徑,而不是從緩存中刷新或由內(nèi)核中的后續(xù)文件系統(tǒng)操作合并。這一點(diǎn)很重要,因?yàn)檎嬲枰y(tǒng)計(jì)的是塊寫入的次數(shù)(實(shí)際上是擦除),而不僅僅是應(yīng)用程序嘗試寫入的實(shí)際數(shù)據(jù)量。 讓我們?cè)趯?shí)踐中簡(jiǎn)要地了解一下如何使用 iotop 和 blktrace。 iotop 有一些選項(xiàng)可以很方便地幫助完成此任務(wù),并且很容易收集和分析時(shí)間戳、寫入計(jì)數(shù)以及負(fù)責(zé)這些寫入的進(jìn)程: root@colibri-imx6:~# iotop –help 你可以參考下面的示例: root@colibri-imx6:~# dd if=/dev/urandom bs=4k count=100000 | pv -L 25k > testfile root@colibri-imx6:~# iotop --only --batch --accumulated --kilobytes --time –quiet 當(dāng)使用blktrace時(shí),事情變得有點(diǎn)復(fù)雜。文檔是開始查閱的好地方。在沒有過濾的情況下,以實(shí)時(shí)模式下運(yùn)行,它可以呈現(xiàn)大量的輸出: root@colibri-imx6:~# blktrace -o - /dev/mmcblk1 | blkparse -i - 幸運(yùn)的是,在 blktrace 和 blkparse 中實(shí)現(xiàn)了諸多篩選器來簡(jiǎn)化任務(wù)。表 3 列出了它們,并簡(jiǎn)要說明: 表 3:過濾掩碼(來源:blktrace 手冊(cè)) 為了跟蹤最后一刻用戶空間PID信息和在閃存上發(fā)出的確認(rèn)寫入操作,我們將會(huì)使用write過濾器。在 blkparse 端,進(jìn)一步篩選選擇以下跟蹤操作,這些跟蹤操作從 blkparse 文檔中引用:
壽命估算 通過記錄 I/O 跟蹤和閃存運(yùn)行狀況,可以確定兩個(gè)相關(guān)性:
請(qǐng)注意,這兩種相關(guān)性都會(huì)隨時(shí)間而發(fā)生,因此通過在單獨(dú)的存儲(chǔ)介質(zhì)上實(shí)現(xiàn)本地 DB(或相同的介質(zhì),但考慮其對(duì)閃存磨損的影響)并運(yùn)行系統(tǒng)足夠長的時(shí)間,可以收集足夠的數(shù)據(jù)估計(jì)上述相關(guān)性,然后計(jì)算壽命。 以擦除次數(shù)測(cè)量的總使用量: 以字節(jié)或者多個(gè)字節(jié)測(cè)量的總使用量: 這里:
請(qǐng)注意,在第二個(gè)公式中,調(diào)整后的平均寫入速率是運(yùn)行閃存運(yùn)行狀態(tài)后的寫入速率,包括相關(guān)的寫入也統(tǒng)計(jì)在內(nèi)。因此,在實(shí)踐中,這考慮到諸如寫入放大和系統(tǒng)寫入等因素,這些在應(yīng)用程序角度進(jìn)行監(jiān)視或估計(jì)理論值時(shí)不會(huì)被考慮的。 關(guān)于磨損估計(jì)的備注 溫度會(huì)影響閃存壽命。您必須考慮使用 pSLC 模式(如果可用)、使用靜態(tài)與動(dòng)態(tài)磨損均衡、存在的壞塊、設(shè)備接近 EOL 時(shí)會(huì)發(fā)生什么情況以及存在備用塊等可能性。 記得通過文獻(xiàn)來尋找與您的設(shè)計(jì)模型相關(guān)的注意事項(xiàng)和其他的方面。 閃存分析工具 Toradex 實(shí)驗(yàn)室目前正在開發(fā)閃存分析工具,旨在您的設(shè)備上抽象估算 eMMC 設(shè)備上磨損的所有復(fù)雜性。在本文中,我們一直在介紹此任務(wù)的原則、注意事項(xiàng)、案例和復(fù)雜性?,F(xiàn)在,可能很清楚為什么這是一個(gè)復(fù)雜的任務(wù),應(yīng)用程序開發(fā)人員可能寧愿選擇避免。 圖 15:閃存分析工具 如上圖 15 所示,該工具旨在成為全面的輔助工具,而不僅僅是一個(gè)壽命估計(jì)工具。它被設(shè)計(jì)利用 Torizon 平臺(tái)的 Docker 容器運(yùn)行并作為模塊化解決方案,您可以在核心模塊的 BSP 上選擇要使用的內(nèi)容。 由于當(dāng)前預(yù)測(cè)模型是使用線性回歸方法實(shí)現(xiàn)的,因此,該工具的路線圖包括對(duì)解決方案的深入研究,以創(chuàng)建具有更高準(zhǔn)確性的新模型,支持更多用例。我們能夠預(yù)見到基于 AI 和大數(shù)據(jù)的解決方案的可能性。 上面展示了 UI 的外觀,我邀請(qǐng)您率先測(cè)試下,并告訴我們您對(duì)此的看法。 總結(jié) 估計(jì)閃存壽命可以像從閃存運(yùn)行狀況中給出的塊大小公式計(jì)算一樣簡(jiǎn)單,也可以像開發(fā)工具并生成在數(shù)秒內(nèi)估計(jì)設(shè)備壽命所需的模型一樣復(fù)雜。您可以根據(jù)產(chǎn)品的使用場(chǎng)景來選擇投入多少精力,或僅選擇圖 16 中概述的重要元素。無論如何,這是寶貴的信息。 圖 16:估計(jì)和預(yù)測(cè)原始 NAND 壽命。 與更簡(jiǎn)單的計(jì)算相比,復(fù)雜的方法提供了一些好處。除了更精確的結(jié)果外,您還可以將您工具某個(gè)版本部署到生產(chǎn)中,以獲得更精確的生命周期數(shù)據(jù)。這還為您提供了監(jiān)控功能和觸發(fā)警報(bào)的能力,從而進(jìn)行更具預(yù)測(cè)性的維護(hù)。最后,一系列底層和高層面的工具,包括 Micron 的 emmcparm、mmc-utils 和 Toradex 閃存分析工具,都可以讓您輕松創(chuàng)建可靠的解決方案。我希望您在閱讀這個(gè)博客文章時(shí)有一個(gè)愉快的經(jīng)歷。 |
|