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.rhkb.cn/news/24628.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

14.二叉搜索树

二叉搜索树 1.概念 ⼆叉搜索树⼜称⼆叉排序树,它或者是⼀棵空树,或者是具有以下性质的⼆叉树: *若它的左⼦树不为空,则左⼦树上所有结点的值都⼩于等于根结点的值 *若它的右⼦树不为空,则右⼦树上所有结点的值都⼤于等于根结点…

8、HTTP/1.0和HTTP/1.1的区别【高频】

第一个是 长连接: HTTP/1.0 默认 短连接,(它也可以指定 Connection 首部字段的值为 Keep-Alive实现 长连接)而HTTP/1.1 默认支持 长连接,HTTP/1.1是基于 TCP/IP协议的,创建一个TCP连接是需要经过三次握手的…

【爬虫基础】第二部分 爬虫基础理论 P1/3

上节内容回顾:【爬虫基础】第一部分 网络通讯 P1/3-CSDN博客 【爬虫基础】第一部分 网络通讯-Socket套接字 P2/3-CSDN博客 【爬虫基础】第一部分 网络通讯-编程 P3/3-CSDN博客 爬虫相关文档,希望互相学习,共同进步 风123456789&#xff…

nss刷题5(misc)

[HUBUCTF 2022 新生赛]最简单的misc 打开后是一张图片,没有其他东西,分离不出来,看看lsb,红绿蓝都是0,看到头是png,重新保存为png,得到一张二维码 扫码得到flag [羊城杯 2021]签到题 是个动图…

清华大学DeepSeek文档下载,清华大学deepseek下载(完成版下载)

文章目录 前言一、清华大学DeepSeek使用手册下载二、清华大学DeepSeek使用手册思维导图 前言 这是一篇关于清华大学deepseek使用手册pdf的介绍性文章,主要介绍了DeepSeek的定义、功能、使用方法以及如何通过提示语设计优化AI性能。以下是对这些核心内容的简要概述&…

强化学习演进:GRPO 从何而来

强化学习(Reinforcement Learning, RL)是机器学习的一个分支,其核心是让智能体(Agent)通过与环境(Environment)的交互,学习如何采取最优行动(Action)以最大化…

树和二叉树

文章目录 树和二叉树1.树的概念1.1特点1.2基本概念 2.二叉树2.1二叉树的定义2.2特殊的树2.3 二叉树的性质2.4二叉树的存储 二叉树的遍历 树和二叉树 1.树的概念 树是一种非线性的数据结构,它是由n个有限结点组成一个有具体层次关系的集合 1.1特点 没有前驱结点的…

ubuntu离线安装Ollama并部署Llama3.1 70B INT4

文章目录 1.下载Ollama2. 下载安装Ollama的安装命令文件install.sh3.安装并验证Ollama4.下载所需要的大模型文件4.1 加载.GGUF文件(推荐、更容易)4.2 加载.Safetensors文件(不建议使用) 5.配置大模型文件 参考: 1、 如…

15.代码随想录算法训练营第十五天|(递归)110. 平衡二叉树,257. 二叉树的所有路径*,404. 左叶子之和,222.完全二叉树的节点个数[打卡自用]

15.代码随想录算法训练营第十五天|(递归)110. 平衡二叉树,257. 二叉树的所有路径*,404. 左叶子之和,222.完全二叉树的节点个数 给定一个二叉树,判断它是否是 平衡二叉树 示例 1: 输入&#xf…

GateWay

文章目录 创建网关配置路由规则工作原理 断言过滤器默认filter全局跨域 左边的是响应式网关,右边是传统网关(Servlet年代) 推荐左边的 需求 创建网关 在服务模块外 新建一个gateway模块 导入依赖,nacos和gateway和负载均衡 配置一下 这里网关默认占80…

十一、大数据治理平台总体功能架构

大数据治理平台的功能架构图中心主题:数据治理 核心重点是建立健全大数据资产管理框架,确保数据质量、安全性、可访问性和合规性。 大数据治理平台总体功能架构图 关键功能领域 1.数据资产平台(左侧) 此部分主要关注数据资产本身…

网络安全 机器学习算法 计算机网络安全机制

(一)网络操作系统 安全 网络操作系统安全是整个网络系统安全的基础。操作系统安全机制主要包括访问控制和隔离控制。 访问控制系统一般包括主体、客体和安全访问政策 访问控制类型: 自主访问控制强制访问控制 访问控制措施: 入…

PDF扫描档智能方向识别:多模型投票机制的实践测试 救活古典书籍

2025-02-22 20:10物联全栈123 尊敬的诸位!我是一名物联网工程师。关注我,持续分享最新物联网与AI资讯和开发实战。期望与您携手探寻物联网与 AI 的无尽可能 RAG知识库搭建的过程中,扫描档pdf的支持和准确率一直是个大家都不愿主动提起的事情…

初会学习记录

【25初级会计《实务》】第一章:权责发生制举例_哔哩哔哩_bilibili 务实: 第一章 (1)会计概念,职能和目标: 2025年2月25日: (2)会计假设: 2025年2月26日: (3)会计核算基础: 202…

【FL0091】基于SSM和微信小程序的社区二手物品交易小程序

🧑‍💻博主介绍🧑‍💻 全网粉丝10W,CSDN全栈领域优质创作者,博客之星、掘金/知乎/b站/华为云/阿里云等平台优质作者、专注于Java、小程序/APP、python、大数据等技术领域和毕业项目实战,以及程序定制化开发…

【DDD系列-10】一页纸回顾DDD

1. DDD是什么 DDD: 是 Domain-Driven Design 的缩写,是 Eric Evans (埃里克•埃文斯)于 2004 年提出的一种软件设计方法和理念。其主要的思想是,利用确定的业务模型来指导业务与应用的设计和实现。主张开发人员与业务人员持续地沟通和模型的…

【视频2 - 4】初识操作系统,Linux,虚拟机

📝前言说明: ●本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,主要跟随B站博主灵茶山的视频进行学习,专栏中的每一篇文章对应B站博主灵茶山的一个视频 ●题目主要为B站视频内涉及的题目以及B站视频中提到的“课后作业”。…

逆向pyinstaller打包的exe软件,获取python源码(5)

在ailx10:逆向pyinstaller打包的exe软件,获取python源码(2)中,我们已经逆向出了主程序,但是import导入的py文件并没有被逆向出来,今天在知乎网友给的提醒下,说是在 PYZ-00.pyz_extracted 文件夹中&#xff…

快速理解Raft分布式共识算法

目录 拜占庭将军问题 Raft算法是干什么的? 一、领导选举(选老板) 二、日志复制(发通知) 三、安全性(防篡改) 🌰 举个真实例子 ✔️ Raft的优势 基础 状态机 节点类型 任期…

mmdetection框架下使用yolov3训练Seaships数据集

之前复现的yolov3算法采用的是传统的coco数据集,这里我需要在新的数据集上跑,也就是船舶检测方向的SeaShips数据集,这里给出教程。 Seaships论文链接:https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber8438999 一、…