4.5.4. eMMC 压力测试

4.5.4.1. 测试原理

eMMC 压力测试通过 iozone 工具对 eMMC 存储设备进行压力测试,模拟不同的 I/O 操作模式,测量读写性能、吞吐量、延迟等指标。具体测试原理如下:

  • 创建测试文件: IOzone 首先在 eMMC 存储上创建一个或多个文件,这些文件的大小和数量可以自定义来模拟不同类型的负载,创建文件时, IOzone 会使用特定的块大小来进行读写操作。

  • 执行多种 I/O 操作:

    • 顺序写入( Sequential Write):连续写入数据到存储设备,测试设备的最大写入带宽。

    • 顺序读取( Sequential Read):连续读取数据,测试设备的读取带宽。

    • 随机写入( Random Write):对数据进行随机写入,测试设备的随机写入能力。

    • 随机读取( Random Read):对数据进行随机读取,测试设备的随机读取能力。

    • 混合读写:模拟多种读写操作,测试设备的综合性能。

    • 重写( Re-write):对已经存在的文件进行修改或覆盖,测试设备在更新文件时的性能。

  • 数据记录与分析: IOzone 会记录每个操作的执行时间,并计算吞吐量和延迟等关键指标生成数据报告。

测试内容

eMMC 压力测试包含了 emmc_performance_test.shemmc_stability_test.sh 两个测试脚本,分别代表 eMMC 性能测试与 eMMC 稳定性压力测试:

eMMC 稳定性压力测试

1. 测试目的:

  • 稳定性压力测试脚本:主要目的是通过长时间的压力测试验证系统的稳定性,通常会使用 -z(填充文件)和设置较大的文件(如 -n 和 -g 参数)来确保在长时间运行时对系统的可靠性进行验证。

2. 命令解析:

  • 稳定性测试:iozone -e -I -az -n 16m -g 2g -q 16m -f "$output_dir/iozone_data" -Rb "$output_dir/test_iozone_emmc_ext4_stability_${loop_num}.xls"

  • 参数解析:

    • -e:启用扩展测试 (extended test),这是 iozone 的一个特性,可以执行更多的测试类型,如重写 (rewrite)、反向写 (reverse write) 和 EOF 写入等。

    • -I:启用直接 I/O( O_DIRECT),绕过操作系统的缓存直接进行磁盘读写。

    • -a:执行自动模式测试。 Iozone 会自动测试不同的操作和文件大小,通常会进行顺序读写、随机读写等多种测试。

    • -z:在这个命令中,用于在每次测试时填充文件,以确保测试期间会进行连续的读写操作,增强了对系统压力的考验。这是常见的稳定性测试选项。

    • -n 16m:设置每次写入测试的最小数据块大小为 16MB。这意味着测试从 16MB 数据块开始,并逐渐增大。

    • -g 2g:设置测试的最大文件大小为 2GB。这表示 Iozone 将测试最大 2GB 文件的读写性能。

    • -q 16m:在执行测试时,设置 Iozone 使用的文件块大小为 16MB,且这个块大小是内存缓冲区的大小。

    • -f “$output_dir/iozone_data”:指定测试结果存储的文件路径。

    • -Rb “$output_dir/test_iozone_emmc_ext4_stability_${loop_num}.xls”:使用 Excel 格式 (.xls) 输出测试结果文件。

eMMC 性能测试说明

1. 测试目的:

  • 性能测试脚本:主要用于衡量存储设备在不同文件和记录大小下的性能,测试通过多种记录大小和文件大小组合来评估不同场景下的性能,命令中有多种 -r(记录大小)和 -s(文件大小)参数。

2. 命令解析:

  • 性能测试:iozone -e -I -a -r 4K -r 16K -r 64K -r 256K -r 1M -r 4M -r 16M -s 16K -s 1M -s 16M -s 128M -s 256M  -f "$output_dir/iozone_data" -Rb "$output_dir/test_iozone_emmc_ext4_performance_${loop_num}.xls"

  • 参数解析:

    • -e:启用扩展测试。

    • -I:启用直接 I/O,绕过操作系统缓存。

    • -a:执行自动模式测试,包含多个读写操作,测试多个文件大小和记录大小。

    • -r 4K -r 16K -r 64K -r 256K -r 1M -r 4M -r 16M:指定测试中使用的记录大小,影响 eMMC 在不同数据块尺寸下的性能表现。

    • -s 16K -s 1M -s 16M -s 128M -s 1G:指定测试文件大小的范围。从较小的 16KB 到较大的 1GB,测试不同大小文件的读写性能。

    • -f “$output_dir/iozone_data”:指定测试文件存储位置。

    • -Rb “$output_dir/test_iozone_emmc_ext4_performance_${loop_num}.xls”:输出测试结果为 Excel 格式。

4.5.4.2. 准备工作

1. 输入 lsblk -f 命令确保 eMMC 存储设备的挂载状态正常,且有足够的存储空间进行测试。

root@buildroot:/userdata/gpu2d_test# lsblk -f
NAME         FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
mtdblock0
mmcblk0
|-mmcblk0p1
|-mmcblk0p2
|-mmcblk0p3
|-mmcblk0p4
|-mmcblk0p5
|-mmcblk0p6
|-mmcblk0p7
|-mmcblk0p8
|-mmcblk0p9  ext4   1.0   /     de7aed37-7c14-4ace-b0bf-2b68a2f9ed7b       0   100% /
|-mmcblk0p10 ext4   1.0   hbre  c0e42531-9464-4908-a53f-d2e753512238   78.8M    51% /usr/hobot
|-mmcblk0p11 ext4   1.0   app   420a2fb6-82e2-47bf-b126-6b95b948ed1c  495.6M    23% /app
`-mmcblk0p12 ext4   1.0   cache 4f1aa72c-2d55-4d56-87e1-e82017e426e4    4.7G    10% /userdata
mmcblk0boot0
mmcblk0boot1

在 eMMC 性能测试中,命令 -s 256MB 会创建指定大小的文件进行读写测试,例如,-s 256M -f “$output_dir/iozone_data”, 请注意在 /app 挂载路径下的剩余空间是否满足最大文件读写测试的需求。

2. 确认在板端 /app/platform_samples/chip_base_test/02_emmc/ 路径下存在 emmc_performance_test.shemmc_stability_test 两个测试脚本。

02_emmc/
├── emmc_performance_test.sh
└── emmc_stability_test.sh

4.5.4.3. 测试方法

压测脚本支持输入后缀 -h 查看命令参数的说明 , 例如(同时适用与两个压测脚本):

./emmc_performance_test.sh -h

Usage: ./emmc_performance_test.sh [options]

Options:
  -t <time>       Set the test duration (e.g., 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: script's '../output' folder).
  -h              Show this help message and exit.

各参数解析如下:

  • -t <time>:设置测试时长,例如 2h 表示 2 小时, 30m 表示 30 分钟,默认是 48 小时。

  • -d <seconds>:设置循环之间的睡眠时间(以秒为单位),默认值是 30 秒。

  • -o <directory>:设置日志输出目录,默认值是脚本所在目录的 ../output 文件夹。

  • -h:显示帮助信息并退出脚本。

示例: 例如,使用命令: ./emmc_performance_test.sh -t 2h -d 10 -o /userdata/output 自定义测试时长 2 小时, 10 秒循环间隔,输出目录为 /userdata/output 。

eMMC 稳定性测试:

确保完成准备工作后,运行测试命令:

app/platform_samples/chip_base_test/02_emmc/

./emmc_stability_test.sh

运行一段时间后,打印结果如下:

eMMC stability test starting...
Test configuration:
  Test duration: 2880 minutes
  Sleep duration: 30 seconds
  Output directory: /app/platform_samples/chip_base_test/log
loop_test: 1
        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 03:53:27 1970

        Include fsync in write timing
        O_DIRECT feature enabled
        Auto Mode
        Cross over of record size disabled.
        Using minimum file size of 16384 kilobytes.
        Using maximum file size of 2097152 kilobytes.
        Using Maximum Record Size 16384 kB
        Excel chart generation enabled
        Command line used: iozone -e -I -az -n 16m -g 2g -q 16m -f /app/platform_samples/chip_base_test/log/iozone_data -Rb /app/platform_samples/chip_base_test/log/test_iozone_emmc_stability_1.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
           16384       4    16528    18226    24101    23748    24132    27420    21336     22977     21307    74257    73024   746423   508393
           16384       8    23396    25740    26597    26515    22837    28021    21191     33722     21453    70527    78517   501653   507889
           16384      16    32617    36313    45886    45603    39386    37817    37385     52995     37303    73691    75478  1155837   823647
           16384      32    49805    56460    58152    58100    54770    27146    51481     27408     61609    82317    70461   798713   767005
           16384      64    62190    60412    97321   104999    81189    36860    82208     37939     92583    81828    79986  1130242   642484
           16384     128    77980    76682   133045   135420   118054    61150   110984     56217    121902    78314    76628   856053   832562
           16384     256    75600    96903   151310   154328   141069    74830   114178     67056    142496    81797    74447   712936   496740
           16384     512    84511    95697   140845   144154   158989    90900   153428     82660    157005    82618    73102   870147   849219
           16384    1024    89460    96806   148825   159890   163213    48185   144125     94222    143921    62020    87725  1553869   827098
           16384    2048    99009    90244   151417   155064   153802    96864   151189     98534    149906    61780    86793   659528   521202
           16384    4096   100021    90433   156428   159981   159845    98881   155403    100275    156243    65415    73284  1298977   878545
           16384    8192   101815   102025   158681   161991   161900    91054   155868    101216    158402    64583    67735   607062   815936
           16384   16384    99572   103136   161970   164727   165066   102090   162238     91487    160470    72264    74101   611891   826056
           32768       4    18622    21099    25151    25152    25244    28032    21607     25818     21371    75887    82629   508259   856455
           32768       8    26335    30219    30169    30249    24746    30948    23299     41141     23233    76726    86830  1665040  1162150
           32768      16    36097    39610    47906    48403    40690    41694    37340     58452     36658    77680    87567   847682   960966
           32768      32    51848    48383    77901    82475    66412    27517    51665     27602     60524    79078    84456  1582842  1041245
           32768      64    58908    61008    98257   106892    88301    38228    83961     38238     70671    78600    87072   984526   882972
           32768     128    82441    84594   141841   142600   124474    58406   121304     61327    121530    78985    85211  2110116  1571606
           32768     256    94575    92323   156299   157396   145970    70771   143510     78336    144694    78374    85049  2113519  1560826
           32768     512    97020    92220   140765   164216   158572    91175   154818     86774    158036    35928    29897  1596103  1137501
           32768    1024    31191    31041   149915   158399   164417    27155   140115     28060    142770    25172    26510  1741589  1375131
           32768    2048    26899    27783   147326   148335   146382    28053   153602     27722    138546    25156    29453  1706311  1320332
           32768    4096    31098    30301   154606   156154   156925    30463   152405     30380    156005    27478    28423  1633662  1319640
           32768    8192    30679    30385   158022   159438   159458    29472   154650     30223    151013    27118    28941  1644072  1314189
           32768   16384    29761    30626   162190   163566   163254    30455   161151     29771    154181    27460    29196  1614823  1306695

关键信息说明:

  • Test duration:测试持续时间 : 这是测试的持续时间,单位为分钟(即 48 小时)。

  • Sleep duration:睡眠时间 : 在每次循环执行测试时,脚本会等待 30 秒钟,可以让系统和存储设备有足够的时间进行恢复,减少测试过程中可能的波动。

  • Output directory:输出目录:/app/platform_samples/chip_base_test/log

  • Command line used:使用命令:iozone -e -I -az -n 16m -g 2g -q 16m -f /app/platform_samples/chip_base_test/log/iozone_data -Rb /app/platform_samples/chip_base_test/log/test_iozone_emmc_stability_1.xls,关键参数如下:

    • 文件大小范围:最小 16MB,最大 2GB。

    • 记录大小范围:从 4KB 到 16384KB(即 16MB)。

  • 主要性能指标

    • kB:表示文件大小(单位: KB)。

    • reclen:表示记录大小(单位:字节),即每次读写操作的数据块大小。

    • random write / rewrite / read / reread:这些列分别表示在随机写入、重写、随机读取、重读时的吞吐量。

    • bkwd (Backward Read):表示倒序读取( Backward Read)操作的吞吐量。

    • record write / record read:表示记录顺序写入和顺序读取吞吐量。

    • stride read / stride write:表示跳跃读取( stride read)和跳跃写入( stride write)的吞吐量。

    • fwrite / frewrite / fread / freread:这些列表示基于 O_DIRECT 标志进行的直接 I/O 操作的吞吐量。

eMMC 性能测试

确保已完成准备工作后,板端运行测试命令:

cd /app/platform_samples/chip_base_test/02_emmc/

./emmc_performance_test.sh

运行一段时间后,打印结果如下:

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
              16       4     3780     8167      460    12500    12279     5310     4857      7633      7011     7194     8998   727272  1230769
              16      16     6269    17718     9122    41884    38095     6619    28021     11527      8639     6090    17524  1230769  1333333
            1024       4    17325    19623    18309    20130    18949    26827    18673     22446     18655    59413    62814  1519287  1214709
            1024      16    31250    36644    39791    41593    37498    38246    35873     42816     36268    62488    26864   957904   699931
            1024      64    57270    60937    86166    95961    83955    43208    72418     42219     76389    60685    66009  2160337  1802816
            1024     256    84342    87097   122341   149227   140659    79006   112515     72660    117068    28331    72117  1914018  1532934
            1024    1024    91690    93953   133664   161641   162720    98594   134013     90611    133229    75756    84838  1796491  1484057
           16384       4    18423    21648    23625    23736    23659    28863    20940     25469     20881    76403    69075   518645   641302
           16384      16    36059    40422    43281    43681    37900    38980    39529     57907     39596    79792    80306  2223971  1079528
           16384      64    66766    75152   116098   117609    93394    40465    91837     42408     94044    75202    68624  2080243  1789036
           16384     256    91077    88937   152283   159162   141655    67446   138908     77983    143531    82034    74734  1231879   637435
           16384    1024   102095    99983   163597   169954   164941    84258   159818     98017    160611    81357    75563  1996344   853911
           16384    4096   102216   101084   161169   160300   162896   100551   158995     91289    158698    75250    77551  1345818  1381333
           16384   16384    93026   103119   157747   160792   167624   101833   163279     92495    165471    76821    76778  1279300   861046
          131072       4    18723    21457    25046    25080    24999    27855    22198     25599     21949    87720    87353  1363827  1188807
          131072      16    37955    40133    48228    48432    36506    38149    38223     59057     37771    90659    91102  2044709  1630938
          131072      64    58971    69843   108532   108846    85083    37930    94236     39192     91901    90835    91374  2211625  1812790
          131072     256    93938    96103   157272   158124   142723    69904   144578     72571    139679    92895    90228  2196504  1819635
          131072    1024    97717    92395   168437   169027   164048    89288   164161     94035    162668    91980    93660  1742978  1506765
          131072    4096   100309    86737   159881   159958   159632    42273   157815     30580    158251    29852    29923  1383725  1487679
          131072   16384    31068    30734   161342   161741   162055    30712   160999     30645    157931    30094    30414  1662000  1493987
          262144       4    16202    17899    24111    24117    21117    26843    22901     25761     22613    91624    91576  1391777  1192387
          262144      16    36265    39895    48418    48431    35809    38468    41636     58951     41142    93458    84658  2084213  1674945
          262144      64    57271    72327   109199   109366    83766    36119    87882     38508     91967    93643    92303  2137804  1803623
          262144     256    60192    90587   156266   156170   140349    66190   145055     72361    140016    89305    91224  2224254  1826685
          262144    1024    69923    97061   167924   168228   163411    87766   157521     93416    162937    94083    92071  1850332  1568569
          262144    4096    70257    99365   158394   158507   157501    96434   158837     99824    158364    93752    91331  1633662  1470752
          262144   16384    69600   100196   162300   162584   162611    99225   162466    100701    164261    92946    91611  1671452  1471487

关键信息说明:

  • Test duration:测试持续时间 : 这是测试的持续时间,单位为分钟(即 48 小时)。

  • Sleep duration:睡眠时间 : 在每次循环执行测试时,脚本会等待 30 秒钟,可以让系统和存储设备有足够的时间进行恢复,减少测试过程中可能的波动。

  • Output directory:输出目录:/app/platform_samples/chip_base_test/log

  • Command line used:使用命令:iozone -e -I -a -r 4K -r 16K -r 64K -r 256K -r 1M -r 4M -r 16M -s 16K -s 1M -s 16M -s 128M -s 256M -f "$output_dir/iozone_data" -Rb "$output_dir/test_iozone_emmc_ext4_performance_${loop_num}.xls"

    • 记录大小( Record Size)包括 4KB, 16KB, 64KB, 256KB, 1MB, 4MB, 16MB。

    • 文件大小( File Size)设置为 16KB, 1MB, 16MB, 128MB, 256MB。

  • 主要性能指标

    • kB:表示文件大小(单位: KB)。

    • reclen:表示记录大小(单位:字节),即每次读写操作的数据块大小。

    • random write / rewrite / read / reread:这些列分别表示在随机写入、重写、随机读取、重读时的吞吐量。

    • bkwd (Backward Read):表示倒序读取( Backward Read)操作的吞吐量。

    • record write / record read:表示记录顺序写入和顺序读取吞吐量。

    • stride read / stride write:表示跳跃读取( stride read)和跳跃写入( stride write)的吞吐量。

    • fwrite / frewrite / fread / freread:这些列表示基于 O_DIRECT 标志进行的直接 I/O 操作的吞吐量。

4.5.4.4. 测试指标

eMMC 稳定性测试

测试程序启动后,稳定性测试会在 /app/platform_samples/chip_base_test/log 目录下生成以下文件:

  • test_iozone_emmc_stability.log:记录压测时的状态信息。

  • test_iozone_emmc_stability_*.xls:记录压测时的数据结果。

测试目标是确保系统能够在 48 小时内稳定运行,不发生重启或挂死的情况。为确保测试过程中的稳定性,可通过以下命令检查日志文件中是否存在 fail、 error、 timeout 等异常信息:

cd "/app/platform_samples/chip_base_test/log/" && grep -iE 'error|fail|timeout' test_iozone_emmc_stability*.log

eMMC 稳定性测试结果

运行测试 24H 后检测 log 日志,并未出现异常状态信息,说明稳定性压测合格。

Test loop 1 succeeded!
Test loop 2 succeeded!
Test loop 3 succeeded!
.....

eMMC 性能测试输出

测试程序启动后,性能测试将在 /app/platform_samples/chip_base_test/log 目录下生成以下文件:

  • test_iozone_emmc_performance.log:记录压测时的状态信息。

  • test_iozone_emmc_performance_*.xls:记录压测时的数据结果

测试目标是确保系统能够在 48 小时内稳定运行,期间不发生重启或挂死现象。为检查日志中的异常信息,可使用以下命令查找 fail、 error、 timeout 等关键字:

cd /app/platform_samples/chip_base_test/output/ && grep -iE 'error|fail|timeout' test_iozone_emmc_performance*.log

此外,性能应符合实际使用中的通用标准。针对 evb_x5 ( eMMC 5.1 ),其最高支持 HS200 模式。通常,读取速度在 90 MB/s 到 150 MB/s 之间,写入速度略低,通常在 60 MB/s 到 120 MB/s 之间。

eMMC 性能测试结果

经过 48 小时的测试,使用命令检查 log 日志时未发现异常状态信息且通过日志输出,最大读取速率可达到约 168 MB/s,最大写入速率约为 102 MB/s,性能压测合格。

Test loop 1 succeeded!
Test loop 2 succeeded!
Test loop 3 succeeded!
.....