4.5.5. QSPI NAND Flash 压力测试
4.5.5.1. 测试原理
NAND Flash 测试
测试内容
1. 测试
在
创建
测试 文件: IOzone 首先 在 对应 路径 上 创建 一个 或 多个 文件,并会 使用 特定 的 块 大小 来 进行 读写操作。例如 脚本 中 IOzone 将会 在 $output_dir/iozone_data路径下 创建 一个 大小 为 32MB 的 测试 文件。 执行
多种 I/O 操作:使用 -a 选项, IOzone 将 自动 评估 多种 测试 模式 和 配置,包括 不同 的 块 大小、文件大小、操作 模式 等。 顺序
写入( Sequential Write):连续 写入 数据 到 存储设备,测试 设备 的 最大 写入 带宽。 顺序
读取( Sequential Read):连续 读取数据,测试 设备 的 读取 带宽。 随机
写入( Random Write):对 数据 进行 随机 写入,测试 设备 的 随机 写入 能力。 随机
读取( Random Read):对 数据 进行 随机 读取,测试 设备 的 随机 读取 能力。 不同
块 大小 测试:通过 测试 不同 大小 的 数据 块,可以 评估 存储设备 在 不同 数据 块 尺寸 下 的 表现。 覆盖
与 追加 (Overwrite vs Append):对 已经 存在 的 文件 进行 修改 或 覆盖,测试 设备 在 更新 文件 时 的 性能。 覆盖 (Overwrite):覆盖
原有 数据,这种 方式 用于 测试 设备 在 处理 重复 写入 时 的 性能,尤其 是 对 NAND Flash 存储 的 影响。 追加 (Append):追加
写入 数据,不会 影响 已有 数据。
数据
记录 与 分析: IOzone 会 记录 每个 操作 的 执行 时间,并 计算 吞吐量 和 延迟 等 关键 指标 生成 数据 报告。
2. 命令
测试
命令: iozone -e -+r -o -a -q 1M -s 32M -f "$output_dir/iozone_data" -Rb "$output_dir/test_iozone_qspi_nand_flash_${loop_num}.xls"参数
解析: -e:计算
时间 时 将 flush (fsync,fflush) 包括 进来。 -+r: 这
选项 是 启用 random 模式 测试,不仅 是 顺序 读写,还 包括 随机 读写。 -o: 该
选项 启用 overwrite 测试,测试 过程 会 覆盖 文件系统 中 的 数据 而 不是 追加 数据。 -a: 启用
自动测试 模式。这 表示 iozone 会 在 不同 的 操作 模式 下 自动 执行 一系列 测试,比如 顺序 读写、随机 读写、不同 大小 的 文件 等。 -q 1M: 在
执行 测试 时,设置 Iozone 使用 的 文件 块 大小 为 1MB。 -s 32M: 设置
测试 的 文件大小 为 32MB。即, iozone 会 在 32MB 大小 的 文件 上 执行 性能 测试。 -f $output_dir/iozone_data:指定
测试 结果 存储 的 文件 路径。 -Rb $output_dir/test_iozone_emmc_ext4_stability_${loop_num}.xls:使用 Excel 格式 (.xls) 输出
测试 结果 文件。
4.5.5.2. 准备工作
1. X5_EVB 默认
拨码1。

D2、D1、D0三个拨码 对应 X5 芯片 的 2NDBOOT_SEL管脚,用于决定 开发板 的 启动 模式。 D4拨码对应 X5 芯片 的 UART_BPS管脚,用于决定 开发板 调试 串口 的 波特率。
对应
| 2NDBOOT_SEL | Value | 选项 | 启动 |
|---|---|---|---|
| D2, D1, D0 | 000 | 2NDBOOT UART | 从 UART 接口 |
| 001 | 2NDBOOT eMMC | 从 eMMC 存储设备 |
|
| 010 | 2NDBOOT USB2.0 DFU | 通过 Dp/Dm 从 USB2.0 DFU( Device Firmware Upgrade)接口 |
|
| 011 | 2NDBOOT SD Card | 从 SD 卡 |
|
| 100 | 2NDBOOT QSPI NOR Flash | 从 QSPI NOR Flash 存储设备 |
|
| 101 | 2NDBOOT QSPI NAND Flash | 从 QSPI NAND Flash 存储设备 |
|
| 110 | 2NDBOOT USB3.0 DFU | 通过 Dp/Dm 从 USB3.0 DFU( Device Firmware Upgrade)接口 |
|
| 111 | 2NDBOOT QSPI NAND Flash (disable mmu) | 从 QSPI NAND Flash 存储设备 |
注意:X5 烧录
| UART_BPS | Value | 选项 | 描述 |
|---|---|---|---|
| D4 | 0 | 115200bps | 启动 |
| 1 | 921600bps | 启动 |
2. 准备 NAND Flash 启动./bd.sh lunch 选择 4 后,输入 ./bd.sh 进行
(base) root@DESKTOP-BD9DR0J:/home/gegugu/x5_sdk_default# ./bd.sh lunch
You're building on #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025
Lunch menu... pick a combo:
0. horizon/x5/board_x5_evb_debug_config.mk
1. horizon/x5/board_x5_evb_jammy_debug_config.mk
2. horizon/x5/board_x5_evb_jammy_release_config.mk
3. horizon/x5/board_x5_evb_nand_debug_config.mk
4. horizon/x5/board_x5_evb_nand_release_config.mk
5. horizon/x5/board_x5_evb_release_config.mk
6. horizon/x5/board_x5_soc_debug_config.mk
7. horizon/x5/board_x5_soc_release_config.mk
Which would you like? [0] : 4
3. 需要/app 分区,需要nand_test.sh 拷贝/userdata 路径
可以
通过 dmesg 命令 查看 到,/userdata 路径 挂载 在 NAND Flash 分区 上。
[ 4.930583] ubi1: volume 0 ("userdata") re-sized from 13 to 842 LEBs
[ 4.932256] ubi1: attached mtd9 (name "userdata", size 221 MiB)
[ 4.941166] mtdblock: MTD device 'userdata' is NAND, please consider using UBI block devices instead.
[ 11.830340] UBIFS (ubi1:0): UBIFS: mounted UBI device 1, volume 0, name "userdata"
可以
通过 命令 cat /proc/mtd查看所有 分区 大小 和 所属 类型。
dev: size erasesize name
mtd0: 00040000 00040000 "mbr"
mtd1: 00240000 00040000 "miniboot"
mtd2: 00240000 00040000 "miniboot_bak1"
mtd3: 00040000 00040000 "misc"
mtd4: 00200000 00040000 "uboot"
mtd5: 00180000 00040000 "ubootenv"
mtd6: 02000000 00040000 "boot"
mtd7: 09600000 00040000 "system"
mtd8: 06400000 00040000 "hbre"
mtd9: 0dd80000 00040000 "userdata"
4.5.5.3. 测试方法
压测
root@buildroot:/userdata/flash_test# ./nand_test.sh -h
Usage: ./nand_test.sh [options]
Options:
-t <time> Set the test duration ( 2h for hours, 30m for minutes; default: 48h).
-d <seconds> Set the sleep time between loops in seconds (default: 30).
-o <directory> Set the output directory for logs (default: ../log).
-h Show this help message and exit.
各
-t <time>:设置测试 时 长,例如 2h 表示 2 小时, 30m 表示 30 分钟,默认 是 48 小时。 -d <seconds>:设置循环 之间 的 睡眠 时间(以 秒 为 单位),默认值 是 30 秒。 -o <directory>:设置日志 输出 目录,默认值 是 脚本 所在 目录 的 ../output 文件夹。 -h:显示帮助 信息 并 退出 脚本。
示例:
例如,使用./nand_test.sh -t 2h -d 10 -o /userdata 自定义
确保
chmod +x nand_test.sh
./nand_test.sh
运行
Iozone: Performance Test of File I/O
Version $Revision: 3.493 $
Compiled for 64 bit mode.
Build: linux
Contributors:William Norcott, Don Capps, Isom Crawford, Kirby Collins
Al Slater, Scott Rhine, Mike Wisner, Ken Goss
Steve Landherr, Brad Smith, Mark Kelly, Dr. Alain CYR,
Randy Dunlap, Mark Montague, Dan Million, Gavin Brebner,
Jean-Marc Zucconi, Jeff Blomberg, Benny Halevy, Dave Boone,
Erik Habbinga, Kris Strecker, Walter Wong, Joshua Root,
Fabrice Bacchella, Zhenghua Xue, Qin Li, Darren Sawyer,
Vangel Bojaxhi, Ben England, Vikentsi Lapa,
Alexey Skidanov, Sudhir Kumar.
Run began: Thu Jan 1 00:31:26 1970
Include fsync in write timing
Read & Write sync mode active.
SYNC Mode.
Auto Mode
Using Maximum Record Size 1024 kB
File size set to 32768 kB
Excel chart generation enabled
Command line used: iozone -e -+r -o -a -q 1M -s 32M -f /userdata/log/iozone_data -Rb /userdata/log/test_iozone_qspi_nand_flash_2.xls
Output is in kBytes/sec
Time Resolution = 0.000001 seconds.
Processor cache size set to 1024 kBytes.
Processor cache line size set to 32 bytes.
File stride size set to 17 * record size.
random random bkwd record stride
kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread
32768 4 2780 4956 1584143 1296151 1103931 4301 1112514 4776 1110629 104392 105451 1532503 1542531
32768 8 5079 9559 1977788 1561719 1547485 10511 1607456 10708 1561273 108863 109577 1927416 1935041
32768 16 9850 20046 2440637 1723633 1978982 19502 2007597 18954 1985097 111847 110092 2271139 2314614
32768 32 17544 36329 2638750 1879761 2318381 31511 2218551 33214 2336732 112556 114307 2599809 2617043
32768 64 33968 70865 2698065 1881812 2456371 64672 2498703 71972 2527419 111349 114829 2679313 2676249
32768 128 58082 109002 2758249 1920300 2571652 108248 2636839 111033 2637900 115383 110742 2732260 2727484
32768 256 71359 104816 2685461 1911116 2609332 105044 2626272 108726 2640876 111676 112701 2705862 2710787
32768 512 79572 103659 2581783 1857701 2562602 106720 2558400 105179 2547857 114214 114433 2466355 2549245
32768 1024 89865 113358 2075237 1701968 2137647 113756 2116385 114655 2128068 113836 111487 1997318 2002811
关键
fsync:表示在 写入 时会 同步 数据 到 磁盘,确保 数据 被 持久 化。 Read & Write sync mode active:读取和 写入 操作 都 是 同步 的。 Record Size:使用的 最大 记录 大小 为 1024 kB。 File size:测试文件 的 大小 为 32768 kB。 Excel chart generation enabled:启用了 Excel 图表 生成,用于 展示 结果。 Command line used:实际运行 的 命令 是 iozone -e -+r -o -a -q 1M -s 32M -f /userdata/log/iozone_data -Rb /userdata/log/test_iozone_qspi_nand_flash_2.xls。 主要性能指标:kB:表示文件大小(单位: KB)。 reclen:表示记录 大小(单位:字节),即 每次 读写操作 的 数据 块 大小。 random write / rewrite / read / reread:这些列 分别 表示 在 随机 写入、重写、随机 读取、重读 时 的 吞吐量。 record write / record read:表示记录 顺序 写入 和 顺序 读取 吞吐量。 stride read / stride write:表示跳跃 读取( stride read)和 跳跃 写入( stride write)的 吞吐量。 fwrite / frewrite / fread / freread:这些列 表示 基于 O_DIRECT 标志 进行 的 直接 I/O 操作 的 吞吐量。
4.5.5.4. 测试指标
测试程序/userdata/log 目录
test_iozone_qspi_nand_flash.log:记录
压 测时 的 状态 信息。 test_iozone_qspi_nand_flash_*.xls:记录
压 测时 的 数据 结果。
测试fail、 error、 timeout 等
cd "/userdata/log/" && grep -iE 'error|fail|timeout' test_iozone_qspi_nand_flash*.log
QSPI NAND Flash 测试结果
运行
Test loop 1 succeeded!
Test loop 2 succeeded!
Test loop 3 succeeded!
.....