乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      使用 eMMC 閃存設(shè)備的磨損估計(jì)

       XeonGate 2021-09-17

      幾十年來,閃存一直是嵌入式系統(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)鍵影響。

      22001年發(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

       3Colibri 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è)不同的部分。

      • 單元格 Cell:最小的單位。該單元以位級(jí)別存儲(chǔ)數(shù)據(jù),并且不能由控制 NAND 存儲(chǔ)的設(shè)備直接尋址。

      • 頁 Page:可用于讀取和編程操作的最小單位組。編程操作由從值 1 到值 0 "翻轉(zhuǎn)"位構(gòu)成。頁面大小在幾千字節(jié)范圍內(nèi),例如,4 KB。

      • 塊 Block:可用于擦除操作的最小頁組合。在定義中,如 Linux MTD 堆棧,塊也稱為擦除塊。擦除操作包括恢復(fù)值為 0 的位到值 1。塊大小在幾兆字節(jié)范圍內(nèi),例如,4 MB。擦除操作比在頁上執(zhí)行的編程或讀取操作慢得多。

      從上面的要點(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ù)。

      • SLC:?jiǎn)渭?jí)單元,每個(gè)單元存儲(chǔ) 1 
             PslcSLC 模式的 MLC 操作,每個(gè)單元存儲(chǔ) 1 

      • MLC:多級(jí)單元,每個(gè)單元存儲(chǔ) 2 

      • TLC:三級(jí)單元,每個(gè)單元存儲(chǔ) 3 

      • QLC:四級(jí)單元,每個(gè)單元存儲(chǔ) 4 

       1 總結(jié)的密度和成本與可靠性和使用壽命之間存在權(quán)衡。

      1NAND單元技術(shù)比較

       6 有助于展示 SLC  MLC 如何存儲(chǔ)位:

       6SLC  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ù)。有兩種類型的磨損均衡算法。

      • 動(dòng)態(tài):僅移動(dòng)動(dòng)態(tài)數(shù)據(jù),即隨時(shí)間更新的數(shù)據(jù)。靜態(tài)數(shù)據(jù)保存在最初寫入的塊中。此算法更簡(jiǎn)單,但不使用存儲(chǔ)設(shè)備的全部容量。當(dāng)只有一小部分閃存保存靜態(tài)數(shù)據(jù)時(shí),最好使用它。

      • 靜態(tài):此算法有目的地移動(dòng)靜態(tài)數(shù)據(jù),均勻地磨損閃存的所有塊。這是一種更復(fù)雜的算法,但它通過使用所有可用的閃存延長了存儲(chǔ)設(shè)備的使用壽命。

      垃圾回收是在出于任何原因復(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-42NAND 閃存設(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í) MicronMTFC4GAJCN-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-32e.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 寄存器:

      2e.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)告的位置。它包含:

      • 供應(yīng)商專有運(yùn)行狀況報(bào)告,32 字節(jié)長

      • 設(shè)備壽命估計(jì)類型 A,以 10% 的增量提供運(yùn)行狀況
           在我們的eMMC 上指的是SLC

      • 設(shè)備壽命估計(jì)類型 B,以 10% 的增量提供運(yùn)行狀況
           在我們的eMMC 上指的是MLC

      • EOL 預(yù)警信息,按平均預(yù)留塊來反映設(shè)備壽命
           返回正常值、警告值(消耗的預(yù)留塊的 80%)和緊急值(消耗的保留塊的 90%

      一個(gè)相關(guān)的問題:如果這些信息是現(xiàn)成的,為什么不只使用JEDEC標(biāo)準(zhǔn)的數(shù)據(jù)?

      • 原因之一是健康報(bào)告僅從JEDEC標(biāo)準(zhǔn)第5.0版中引入。

      • 另一個(gè)是值的低分辨率(10% 增量),這對(duì)寫入少量數(shù)據(jù)的測(cè)試應(yīng)用程序不利。需要很長的運(yùn)行時(shí)間才能獲得任何有用的信息。

      • 此外,提供獨(dú)立于特定技術(shù)(如既能可以時(shí) SD 卡,也可以是采用 MTD的原始閃存)的閃存磨損估計(jì)工具更加靈活。

      Micron 專有運(yùn)行報(bào)告

      對(duì)于本主題,我們(幾乎)不在 JEDEC 標(biāo)準(zhǔn)的討論范圍之內(nèi)。我們需要了解的唯一信息是如何訪問此數(shù)據(jù)。我們只需要知道,我們必須使用一般的命令,即GEN_CMDCMD56,作為入口門,從器件中獲取這些數(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ù):

      • 壞塊計(jì)數(shù)器和信息:工廠壞塊計(jì)數(shù)、運(yùn)行時(shí)壞塊計(jì)數(shù)和剩余塊計(jì)數(shù)。這還提供有關(guān)每個(gè)塊上關(guān)于失效頁地址和是否在擦除或者編程中失效。

      • 塊擦除計(jì)數(shù)器:所有塊的最小、最大和平均塊擦除計(jì)數(shù),以及每個(gè)塊擦除計(jì)數(shù)。

      • 塊配置:每個(gè)塊的物理地址,以及它是 SLC 還是 MLC。

      要訪問其中每個(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ù)總量中獲得:

      或者

      這里:

      • 表示總使用量,以擦除周期數(shù)(頂部)或字節(jié)數(shù)(底部)表示

      • 表示塊的數(shù)量

      • Lavg 表示塊的平均塊壽命,以塊擦除計(jì)數(shù)表示

      • 塊的大小,以字節(jié)表示

      根據(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
      Usage:

      mmc extcsd read <device>
      Print extcsd data from <device>.

      mmc extcsd dump <device>
      Print raw extcsd data from <device>.

      上面的輸出側(cè)重于 extcsd 操作。如果我們執(zhí)行 extcsd 讀取命令,我們可以獲取一系列信息,包括 JEDEC 運(yùn)行狀況。讓我們看看輸出的開頭或第一行:

      root@colibri-imx6-05097264:/app# mmc extcsd read /dev/mmcblk1
      =============================================
      Extended CSD rev 1.7 (MMC 5.0)
      =============================================

      這證實(shí)了我們有一個(gè)符合 JEDEC 5.0 標(biāo)準(zhǔn)的 eMMC。然后,我們可以篩選輸出以獲取 JEDEC 定義的運(yùn)行狀況:

      root@colibri-imx6:~# mmc extcsd read /dev/mmcblk1 | grep LIFE
      Device life time estimation type B [DEVICE_LIFE_TIME_EST_TYP_B: 0x01]
      Device life time estimation type A [DEVICE_LIFE_TIME_EST_TYP_A: 0x01]
      eMMC Life Time Estimation A [EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_A]: 0x01
      eMMC Life Time Estimation B [EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_B]: 0x01

      root@colibri-imx6-05097264:~# mmc extcsd read /dev/mmcblk1 | grep EOL
      Pre EOL information [PRE_EOL_INFO: 0x01]
      eMMC Pre EOL information [EXT_CSD_PRE_EOL_INFO]: 0x01

      在上面的示例中,我們看到運(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
      Vendor proprietary health report:
      [VENDOR_PROPRIETARY_HEALTH_REPORT[301]]: 0x00
      [VENDOR_PROPRIETARY_HEALTH_REPORT[300]]: 0x00
      [VENDOR_PROPRIETARY_HEALTH_REPORT[299]]: 0x00

      然而,人們總是可以編寫一些補(bǔ)丁來嘗試擴(kuò)展該工具的功能。一個(gè)可用作測(cè)試的示例可能類似于如下代碼所示。請(qǐng)注意,為了簡(jiǎn)潔起見,此代碼未完整顯示,例如省略驗(yàn)證功能:

      / Retrieve the erase count for each block
      // A two-step approach is needed (read number of tables and then read tables)
      int do_block_erase_info(int nargs, char **argv)
      {
      ret = CMD56_data_in(fd, cmd56_how_many_tables, data_in);
      printf("Block erase count\n");
      printf("Block\tErase\n");
      for(table_idx = 0; table_idx < how_many_tables; table_idx++){
      ret = CMD56_data_in(fd, (table_idx * 256) + cmd56_retrieve_base, data_in);

      for(physical_block = 0; physical_block < 128; physical_block++){
      printf("%d\t%d\n",
      (256*data_in[0+2*physical_block]) + data_in[1+2*physical_block],
      (256*data_in[256+2*physical_block]) + data_in[257+2*physical_block]);
      }
      }
      }

      然后,我們可以用這個(gè)應(yīng)用程序,從 Micron 的閃存中檢索以下數(shù)據(jù):

      int do_bad_block_count(int nargs, char **argv);
      int do_bad_block_info(int nargs, char **argv);
      int do_block_erase_count(int nargs, char **argv);
      int do_block_erase_info(int nargs, char **argv);
      int do_block_addr_type_info(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
      --spare_block
      --bad_block
      --erase_count
      --sect_count

      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è)備的堆棧

       11eMMC 和原始 NAND  I/O 堆棧

      我們可以從上到下瀏覽內(nèi)核堆棧:

      12Linux內(nèi)核結(jié)構(gòu)的簡(jiǎn)化概述。(來源:維基百科

      • virtual file system是用戶空間 API 的抽象層。

      • file system本身實(shí)現(xiàn)特定結(jié)構(gòu)來定義與文件相關(guān)的概念。

      • generic block layer,通常包括文獻(xiàn)中的 I/O scheduler,是堆棧中處理所有塊 I/O BIO) 的地方,此抽象文件系統(tǒng)的塊設(shè)備等。

      • I/O scheduler獲取 I/O 請(qǐng)求的隊(duì)列,并根據(jù)特定算法將它們發(fā)送到塊設(shè)備驅(qū)動(dòng)程序。它嘗試最大化塊 I/O 性能,scheduler的選擇計(jì)可能會(huì)影響閃存的延遲、吞吐量和使用。

      人們最初可能認(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)視和核算的角度來看,問題變得更加明確:

      •  Linux 堆棧的哪些位置,我們保證能夠測(cè)量實(shí)際到達(dá)閃存的寫入量

      • 我們?nèi)绾螠y(cè)量這一點(diǎn)?(我們可以使用哪些工具?)

      不同于運(yùn)行狀況測(cè)量(可用于收集數(shù)據(jù)的工具數(shù)量有限),可用于 Linux 內(nèi)核堆棧觀察的工具是非常豐富的。圖 14 顯示了這方面的一個(gè)示例,取自Brendan Gregg的博客。Brendan Gregg  Linux 性能監(jiān)控領(lǐng)域知識(shí)最淵博的一個(gè)人。

       14Linux 性能觀察性工具。(來源: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
      Options:
      -o, --only only show processes or threads actually doing I/O
      -b, --batch non-interactive mode
      -a, --accumulated show accumulated I/O instead of bandwidth
      -k, --kilobytes use kilobytes instead of a human friendly unit
      -t, --time add a timestamp on each line (implies –batch)
      -q, --quiet suppress some lines of header (implies --batch)

      你可以參考下面的示例:

      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
      TIME TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
      2019-08-02 03:11:19 50 be/4 root 0.00 K 24.00 K -0.00 % -0.00 % pv -L 25k
      2019-08-02 03:11:20 50 be/4 root 0.00 K 52.00 K -0.00 % -0.00 % pv -L 25k
      2019-08-02 03:11:21 50 be/4 root 0.00 K 80.00 K -0.00 % -0.00 % pv -L 25k
      2019-08-02 03:11:22 50 be/4 root 0.00 K 104.00 K -0.00 % -0.00 % pv -L 25k
      2019-08-02 03:11:23 50 be/4 root 0.00 K 128.00 K -0.00 % -0.00 % pv -L 25k

      當(dāng)使用blktrace時(shí),事情變得有點(diǎn)復(fù)雜。文檔是開始查閱的好地方。在沒有過濾的情況下,以實(shí)時(shí)模式下運(yùn)行,它可以呈現(xiàn)大量的輸出:

      root@colibri-imx6:~# blktrace -o - /dev/mmcblk1 | blkparse -i -
      179,0 0 26 0.000114661 304 A WS 4509800 + 8 <- (179,2) 4468840
      179,0 0 27 0.000117328 304 Q WS 4509800 + 8 [jbd2/mmcblk1p2-]
      179,0 0 28 0.000119661 304 M WS 4509800 + 8 [jbd2/mmcblk1p2-]
      179,0 0 29 0.000127328 304 U N [jbd2/mmcblk1p2-] 1
      179,0 0 30 0.000131661 304 I WS 4509736 + 72 [jbd2/mmcblk1p2-]
      179,0 0 31 0.008860277 279 D WS 4509736 + 72 [kworker/0:3H]
      179,0 0 32 0.012586780 279 C WS 4509736 + 72 [0]

      幸運(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 文檔中引用:

      • C - 完成:上一個(gè)發(fā)出的請(qǐng)求已完成。輸出將詳細(xì)說明該請(qǐng)求的扇區(qū)和大小,以及請(qǐng)求的成敗。

      • I - 插入:請(qǐng)求正在被發(fā)送到 io 調(diào)度器,從而添加到內(nèi)部列隊(duì)并稍后由驅(qū)動(dòng)完成。此時(shí)請(qǐng)求已完全形成。

      壽命估算

      通過記錄 I/O 跟蹤和閃存運(yùn)行狀況,可以確定兩個(gè)相關(guān)性:

      • 隨時(shí)間推移的閃存運(yùn)行狀況

      • 在寫入率方面的閃存運(yù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è)量的總使用量:

      這里:

      • 是秒為單位的壽命

      • 是以擦除次數(shù)(頂部)或字節(jié)(底部)表示的總使用量

      • Cavg 是平均所有塊擦除計(jì)數(shù);即塊擦除總數(shù)除以每秒擦除的塊

      • Wavg 是調(diào)整后的平均寫入速率(以每秒字節(jié)為單位)

      請(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)歷。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多