ARM 處理器平臺 eMMC Flash 存儲磨損測試示例

By Toradex秦海

1).?簡介

目前工業嵌入式?ARM?平臺最常用的存儲器件就是?eMMC Nand Flash?存儲,而由于工業設備一般生命周期都比較長,eMMC?存儲器件的磨損壽命對于整個設備來說至關重要,因此本文就基于?NXP i.MX8M Mini ARM?處理器平臺演示?eMMC?器件磨損測試的示例流程。

關于?eMMC?存儲器件的基本介紹可以參考如下文章,eMMC?存儲器件通常包含有?eMMC Nand Flash?控制器和一定數量的?Nand Flash?存儲顆粒來組成,ARM?處理器主機對于?eMMC?的操作都要通過?Nand Flash?控制器進行映射,同時?Nand Falsh?控制器還負責?Wear leveling/ECC/Bad Block Management?等功能以保證?eMMC?器件穩定可靠工作。

eMMC (Linux) | Toradex Developer Center

eMMC?存儲器件的磨損壽命主要由其包含的?Nand Flash?顆粒存儲單元的?P/E(programming and erasing)?次數來決定,不同?Nand Flash?顆粒種類通常的?P/E?次數不同,一個大概的參考如下,不同品牌不同工藝的顆粒會有差異。

./ SLC Nand Flash - 10K - 100K P/E Cycles

./ MLC Nand Flash - 3K - 10K, normally 3K P/E Cycles

./ 2D TLC Nand Flash - normally 1K P/E Cycles

./ 3D TLC Nand Flash - normally 3K P/E Cycles

但是由于?Nand?控制器操作?Nand Flash?存儲單元?programming?寫入最小單位是?Page,而?erasing?擦除最小單位是?Block,因此當寫入/擦除數據不是對應最小單元整數倍時候就會產生額外的開銷,同時還附加其他?Wear leveling/Garbage collection/Bad Block Management?等功能產生的開銷,就會導致實際寫入的全壽命數據量要小于理論上按照單元?P/E Cycles?計算的數據量(eMMC capacity * P/E cycles),這個差異就是?WAF?(Write Amplification Factor)寫放大因子((eMMC capacity * P/E cycles)/actual full-lifetime data written)。更多相關說明請參考如下文章。

使用 eMMC 閃存設備的磨損估計

因此由于上述?Nand Flash?控制器地址映射和?WAF?的存在,磨損測試是無法直接將?Host?寫入數據和實際?Nand Flash?顆粒的?P/E?對應的,而?WAF?在不同寫入情況下又是一個動態數值,所以我們依賴?Linux Kernel mmc-utils?工具或者?eMMC?提供商的專用軟件來讀取?Extended CSD rev 1.7 (MMC 5.0)?包含的?Health Status?信息,并通過其每?10%?的線性變化和實際寫入數據是否對應線性變化,以及最終寫入數據量,可以推算出實際的?WAF。

eMMC (Linux) | Toradex Developer Center

關于?CSD Register?中?Health Status?和?Spare Block Register?的定義說明如下

./?Device life time estimation type?A/B: life time estimation?based on blocks P/E cycles, provided in steps of 10%, e.g.:

0x02 means 10%-20% device life time used.

./?Pre EOL information: overall status for reserved blocks. Possible values are:

0x00 - Not defined.

0x01 - Normal: consumed less than 80% of the reserved blocks.

0x02 - Warning: consumed 80% of the reserved blocks.

0x03 - Urgent: consumed 90% of the reserved blocks.

本文所示例的平臺來自于?Toradex?Verdin?i.MX8MM?嵌入式平臺。

2.?準備

a).?Verdin i.MX8MM ARM核心版配合Dahlia?載板并連接調試串口用于后續測試

b).參考這里下載?Toradex Yocto Linux BSP6 Reference Image

c).參考這里的說明將上述下載的?BSP Image?安裝到?Verdin i.MX8MM?核心板。

d).準備一個?SD?卡,參考這里的說明使用上述下載的?BSP Image?制作啟動?SD?卡。

3).?測試流程

a).?將?SD?插入?Dahlia?載板后啟動,系統自動會優先從外部?SD?卡?(mmc1)?啟動,可以通過如下調試串口?log?信息來進一步判定。

-------------------------------

......

Hit any key to stop autoboot: ?0

switch to partitions #0, OK

mmc1 is current device

Scanning mmc 1:1...

Found U-Boot script /boot.scr

......

-------------------------------

b).?因為系統會自動?mount eMMC?對應設備分區,為了后續測試,需要先關閉自動掛載。

-------------------------------

root@verdin-imx8mm-07276322:~# mount |grep /dev/mmcblk0

/dev/mmcblk0p2 on /media/RFS-mmcblk0p2 type ext4 (rw,relatime)

/dev/mmcblk0p1 on /media/BOOT-mmcblk0p1 type vfat (rw,relatime,gid=6,fmask=0007,dmask=0007,allo)

-------------------------------

在設備?Linux?下執行下面腳本關閉自動掛載,執行成功后上述掛載信息就沒有了。

-------------------------------

#!/bin/sh -e

systemd-umount /dev/mmcblk0p1

systemd-umount /dev/mmcblk0p2

systemctl stop systemd-udevd

systemctl stop systemd-remount-fs

count=`ls -1 /etc/udev/rules.d/*automount.rules 2>/dev/null |wc -l`

if [ $count != 0 ]

then

rm /etc/udev/rules.d/*automount.rules

fi

-------------------------------

c).?接下來要通過?Linux?磁盤操作工具來進行大量寫入數據來測試?eMMC?的磨損,?本文測試使用?fio?工具,當然還有像?dd/hdparm?等工具也可以根據情況酌情選擇。

./?首先創建?fio?配置文件,類似如下,具體說明可以參考?fio?官方文檔。

-------------------------------

[global]

bs=32k

direct=0

ioengine=libaio

iodepth=4

verify=crc32c

filename=/dev/mmcblk0 ; emmc device filename

verify_dump=1

verify_fatal=1

randrepeat=0

[write-once]

description=Write once area, used for testing date retention

stonewall

rw=write

verify_pattern=0xaa555aa5 ; fixed data pattern

size=256M

offset=0

[verify-write-once]

description=Verify write once area, used for testing data retention

stonewall

rw=read

verify_only

size=256M

offset=0

[write]

description=Write r/w stress data area with random data

stonewall

rw=write

do_verify=0

offset=256M

[verify]

description=Verify r/w stress data area

stonewall

rw=read

verify_only

offset=256M

-------------------------------

//其中需要說明的是?bs (block size)?的設置需要根據不同的?eMMC?手冊中定義的?Optimal Write Size?以盡可能減小?WAF,比如當前測試?eMMC?手冊中定義如下

ARM 處理器平臺 eMMC Flash 存儲磨損測試示例5304.png

實際讀取的寄存器數值如下,對應為?32KB,因此?fio?配置文件中?bs?參數設置為?32k?或者其整數倍數,可以保證?Nand Flash?顆粒存儲單元寫入都是按照?Page Size。

-------------------------------

$?mmc extcsd read /dev/mmcblk0 ?| grep write

Optimal write size [OPTIMAL_WRITE_SIZE: 0x08]

-------------------------------

./?然后可以通過類似如下測試腳本來進行一次寫入和驗證,測試?fio?的配置正確和可用以及當前的?eMMC Health Status?狀態

-------------------------------

#!/bin/bash -e

EMMC_DEVICE=/dev/mmcblk0

FIO_TEST_NAME=emmc-pe-test.fio

echo ">> eMMC P/E test preparation on ${EMMC_DEVICE}"

echo ">> eMMC EXTCSD Health Status"

mmc extcsd read "${EMMC_DEVICE}" | fgrep -A1 DEVICE_LIFE_TIME_EST

mmc extcsd read "${EMMC_DEVICE}" | fgrep -A1 PRE_EOL_INFO

echo ">> Write once data"

fio --section=write-once "${FIO_TEST_NAME}"

echo ">> Verify write once data"

fio --section=verify-write-once "${FIO_TEST_NAME}"

-------------------------------

./?最后可以通過如下循環寫入腳本持續寫入測試來測試?eMMC?磨損情況。

-------------------------------

#!/bin/bash -e

EMMC_DEVICE=/dev/mmcblk0

COUNT=0

FIO_TEST_NAME=emmc-pe-test.fio

echo ">> Starting eMMC P/E test on ${EMMC_DEVICE}"

while true

do

????????echo ">> Run $COUNT"

????????echo ">> eMMC EXTCSD Health Status"

????????mmc extcsd read "${EMMC_DEVICE}" | fgrep -A1 DEVICE_LIFE_TIME_EST

????????mmc extcsd read "${EMMC_DEVICE}" | fgrep -A1 PRE_EOL_INFO

????????echo ">> Check write once data"

????????fio --section=verify-write-once "${FIO_TEST_NAME}"

????????echo ">> Wear eMMC"

????????fio --section=write --section=verify "${FIO_TEST_NAME}"

????????COUNT=$(($COUNT + 1))

done

-------------------------------

./?磨損測試一次全盤寫入和驗證的?log?信息如下,由于實際測試完成時間會非常長,通常根據?eMMC?容量不同可能需要幾天甚至十幾天時間,本文就不演示最終完成的數據。最后可以根據壽命達到90%以上時候全部?log?信息統計出類似如下表格?eMMC?每磨損?10%?實際?P/E?的次數和數據量,得出?eMMC?的全壽命磨損數據/磨損是否線性以及實際?WAF?數值。另外,關于?LIFE_TIME_EST_A?還是?LIFE_TIME_EST_B?沒有標準定義,由各個廠商自行定義,所以實際以廠商定義為準。

-------------------------------

>> Starting eMMC P/E test on /dev/mmcblk0

>> Run 0

>> eMMC EXTCSD Health Status

Device life time estimation type B [DEVICE_LIFE_TIME_EST_TYP_B: 0x01]

?i.e. 0% - 10% device life time used

Device life time estimation type A [DEVICE_LIFE_TIME_EST_TYP_A: 0x01]

?i.e. 0% - 10% device life time used

Pre EOL information [PRE_EOL_INFO: 0x01]

?i.e. Normal

>> Check write once data

verify-write-once: (g=0): rw=read, bs=(R) 32.0KiB-32.0KiB, (W) 32.0KiB-32.0KiB, (T) 32.0KiB-32.4

fio-3.30

Starting 1 process

Jobs: 1 (f=1)

verify-write-once: (groupid=0, jobs=1): err= 0: pid=583: Fri Apr 29 20:04:38 2022

??Description ?: [Verify write once area, used for testing data retention]

??read: IOPS=4908, BW=153MiB/s (161MB/s)(256MiB/1669msec)

...

Run status group 0 (all jobs):

???READ: bw=153MiB/s (161MB/s), 153MiB/s-153MiB/s (161MB/s-161MB/s), io=256MiB (268MB), run=166c

Disk stats (read/write):

??mmcblk0: ios=1009/0, merge=0/0, ticks=2390/0, in_queue=2391, util=94.47%

>> Wear eMMC

write: (g=0): rw=write, bs=(R) 32.0KiB-32.0KiB, (W) 32.0KiB-32.0KiB, (T) 32.0KiB-32.0KiB, ioeng4

verify: (g=1): rw=read, bs=(R) 32.0KiB-32.0KiB, (W) 32.0KiB-32.0KiB, (T) 32.0KiB-32.0KiB, ioeng4

fio-3.30

Starting 2 processes

Jobs: 1 (f=1): [_(1),V(1)][100.0%][eta 00m:00s] ??????????????????????????????????

write: (groupid=0, jobs=1): err= 0: pid=590: Fri Apr 29 20:17:15 2022

??Description ?: [Write r/w stress data area with random data]

??write: IOPS=732, BW=22.9MiB/s (24.0MB/s)(14.4GiB/642435msec); 0 zone resets

...

verify: (groupid=1, jobs=1): err= 0: pid=607: Fri Apr 29 20:17:15 2022

??Description ?: [Verify r/w stress data area]

??read: IOPS=4812, BW=150MiB/s (158MB/s)(14.4GiB/97725msec)

...

Run status group 0 (all jobs):

??WRITE: bw=22.9MiB/s (24.0MB/s), 22.9MiB/s-22.9MiB/s (24.0MB/s-24.0MB/s), io=14.4GiB (15.4GB),c

Run status group 1 (all jobs):

???READ: bw=150MiB/s (158MB/s), 150MiB/s-150MiB/s (158MB/s-158MB/s), io=14.4GiB (15.4GB), run=9c

Disk stats (read/write):

??mmcblk0: ios=58819/29449, merge=0/3732727, ticks=143387/81519893, in_queue=81663280, util=99.%

...

-------------------------------

ARM 處理器平臺 eMMC Flash 存儲磨損測試示例9211.png

4).?總結

本文基于?NXP i.MX8MM ARM?處理器平臺說明和演示了?eMMC?壽命磨損測試的流程,同時由于測試是線性寫入,得出的結果和實際應用具體情況可能有不同,不過在實際應用中,為了最大程度的增加?eMMC?存儲器件的壽命和可靠性,在寫入數據時候最好不要無論大小數據每次都直接寫入磁盤,最好使用緩存將要寫入的數據累積到一定量之后,根據具體?eMMC Optimal Write Size?來最終寫入磁盤,以盡可能減少?WAF,提高磨損壽命。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70749.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70749.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70749.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Comfy UI 快捷鍵

Comfy UI 頁面的快捷鍵操作(記錄下,以防忘記): 捷徑命令Ctrl Enter將當前圖表排隊等待生成Ctrl Shift Enter將當前圖表排成第一個生成圖表Ctrl Z/Ctrl Y撤消/重做Ctrl S保存工作流程Ctrl O加載工作流Ctrl A選擇所有節點A…

uniapp 本地數據庫多端適配實例(根據運行環境自動選擇適配器)

項目有個需求,需要生成app和小程序,app支持離線數據庫,如果當前沒有網絡提醒用戶開啟離線模式,所以就隨便搞了下,具體的思路就是: 一個接口和多個實現類(類似后端的模板設計模式)&am…

HIVE SQL函數之比較函數

背景:今天接到一個臨時需求,需要比較abc的大小,但是abc三個字段都存在為空的情況。 開發:對于這個開發很簡單,因為比較函數有太多了,首先想到的是用case when去進行一個非空的判斷,再去比較用I…

AI探索筆記:淺談人工智能算法分類

人工智能算法分類 這是一張經典的圖片,基本概況了人工智能算法的現狀。這張圖片通過三個同心圓展示了人工智能、機器學習和深度學習之間的包含關系,其中人工智能是最廣泛的范疇,機器學習是其子集,專注于數據驅動的算法改進&#…

進程概念、PCB及進程查看

文章目錄 一.進程的概念進程控制塊(PCB) 二.進程查看通過指令查看進程通過proc目錄查看進程的cwd和exe獲取進程pid和ppid通過fork()創建子進程 一.進程的概念 進程是一個運行起來的程序,而程序是存放在磁盤的,cpu要想執行程序的指…

OA辦公系統自動滲透測試過程

目錄 一、下載環境源碼 二、部署環境 三、測試 XSS漏洞 SQL注入 文件上傳漏洞 一、下載環境源碼 OA源碼打包地址: https://download.csdn.net/download/weixin_43650289/90434502?spm=1001.2014.3001.5503 二、部署環境

怎么修改node_modules里的文件,怎么使用patch-package修改node_modules的文件,怎么修改第三方庫原文件。

在開發中會遇到需要node_modules里第三方庫有bug,然后需要修改node_modules文件的情況 使用patch-package包可以修改node_modules里的文件 patch-package npm 官網:patch-package - npm 安裝 npm i patch-package 修改文件后 npx patch-package s…

Python在實際工作中的運用-通用格式CSV文件自動轉換XLSX

繼續上篇《Python在實際工作中的運用-CSV無損轉XLSX的幾個方法》我們雖然對特定格式的CSV實現了快速轉換XLSX的目標,但是在運行Py腳本前,還是需要編輯表格創建腳本和數據插入腳本,自動化程度很低,實用性不強,為減少人工提高效率,實現輸入CSV文件路徑即可自動適配完成轉換…

seacmsv9報錯注入

1、seacms的介紹 ? seacms中文名&#xff1a;海洋影視管理系統。是一個采用了php5mysql架構的影視網站框架&#xff0c;因此&#xff0c;如果該框架有漏洞&#xff0c;那使用了該框架的各個網站都會有相同問題。 2、源碼的分析 漏洞的部分源碼如下&#xff1a; <?php …

Hbase客戶端API——語句大全

目錄 創建表&#xff1a; 插入數據&#xff1a; 刪除數據&#xff1a; 修改數據&#xff1a; 查詢數據&#xff1a;Get 查詢數據&#xff1a;Scan 查詢數據&#xff1a;過濾查詢 創建表&#xff1a; 檢驗&#xff1a; 插入數據&#xff1a; 驗證 一次多條數據插入 驗證&…

vscode 版本

vscode官網 Visual Studio Code - Code Editing. Redefined 但是官網只提供最新 在之前的版本就要去github找了 https://github.com/microsoft/vscode/releases 獲取舊版本vscode安裝包的方法_vscode 老版本-CSDN博客

IP------PPP協議

這只是IP的其中一塊內容PPP&#xff0c;IP還有更多內容可以查看IP專欄&#xff0c;前一章內容為網絡類型&#xff0c;可通過以下路徑查看IP---網絡類型-CSDN博客&#xff0c;歡迎指正 3.PPP協議 1.PPP優點 網絡類型&#xff1a;p2p PPP---點到點協議 兼容性會更強凡是接口或…

Springboot基礎篇(3):Bean管理

前言&#xff1a;Spring 通過掃描類路徑&#xff08;Classpath&#xff09;來查找帶有特定注解&#xff08;如 Component、Service、Repository 等&#xff09;的類&#xff0c;并將它們注冊為 Spring 容器中的 Bean。 1 Bean掃描 Bean 掃描是 Spring 框架的核心功能之一&…

Metal 學習筆記二:3D模型

是什么讓一個好游戲更好玩&#xff1f;漂亮的圖像&#xff01;就像《神界&#xff1a;原罪2》&#xff0c;《暗黑破壞神3》以及《巫師3》等大作一樣&#xff0c;需要一個強大的程序團隊以及3D美術團隊強強合作。你在屏幕中看到正是3D模型使用自定義渲染繪制的結果。就像上一章你…

【算法】797. 差分

題目 797. 差分 思路 差分的實質是通過構造數組b減少時間復雜度&#xff0c;數組a為初始數據&#xff0c;構造數組b&#xff0c;數組a是b的前綴和&#xff0c;通過對數組b操作就可以實現數組a每個數加上c&#xff0c;而對數組b的操作在單位時間內即可完成&#xff0c;對數組…

解鎖狀態模式:Java 編程中的行為魔法

系列文章目錄 后續補充~~~ 文章目錄 一、狀態模式&#xff1a;概念與原理二、狀態模式的深度剖析&#xff08;一&#xff09;模式定義與核心思想&#xff08;二&#xff09;模式結構與角色 三、狀態模式的實際應用場景&#xff08;一&#xff09;電商系統中的訂單狀態管理&…

php 獲取head參數

php 獲取head參數 在PHP中&#xff0c;獲取HTTP頭部&#xff08;head&#xff09;參數可以通過不同的方式實現&#xff0c;下面為你詳細介紹幾種常見的方法。 1. 使用$_SERVER超全局變量 $_SERVER 是PHP中的一個超全局變量&#xff0c;它包含了諸如頭信息、路徑、腳本位置等…

數據結構與算法-圖論-最短路-拓展運用

選擇最佳路線 分析&#xff1a; 這是一道圖論中的最短路徑問題&#xff0c;目標是在給定的公交網絡中&#xff0c;找到從琪琪家附近的車站出發&#xff0c;到她朋友家附近車站&#xff08;編號為 s &#xff09;的最短時間。以下是對該問題的詳細分析&#xff1a; 問題關鍵信息…

AI知識架構之神經網絡

神經網絡:這是整個內容的主題,是一種模擬人類大腦神經元結構和功能的計算模型,在人工智能領域廣泛應用。基本概念:介紹神經網絡相關的基礎概念,為后續深入理解神經網絡做鋪墊。定義與起源: 神經網絡是模擬人類大腦神經元結構和功能的計算模型,其起源于對生物神經系統的研…

【江科協-STM32】5. 輸出比較

1. 輸出比較簡介 OC(Output Compare)輸出比較。 輸出比較可以通過CNT&#xff08;CNT計數器&#xff09;與CCR寄存器值的關系&#xff0c;來對輸出電平進行置1、置0或翻轉的操作&#xff0c;用于輸出一定頻率和占空比的PWM波形。 :::tip CNT計數器是正向計數器。它只能正向累…