EMMC存储性能测试方法

记于 2022 年 9 月 15 日

EMMC存储性能测试方法 - Wesley’s Blog

参考Android-emmc性能测试 | 一叶知秋进行实践操作

dd 命令

页面缓存

为了测试 emmc 的真实读写性能,我们需要先把页面缓存给清理:

echo 1 > /proc/sys/vm/drop_caches
console:/ # echo 1 > /proc/sys/vm/drop_caches                                  
console:/ # busybox dd if=/dev/block/mmcblk0 of=/dev/null bs=1M count=512                          <
512+0 records in
512+0 records out
536870912 bytes (512.0MB) copied, 2.491718 seconds, 205.5MB/s
console:/ # busybox dd if=/dev/block/mmcblk0 of=/dev/null bs=1M count=512                          <
512+0 records in
512+0 records out
536870912 bytes (512.0MB) copied, 0.290948 seconds, 1.7GB/sconsole:/ # echo 1 > /proc/sys/vm/drop_caches 
console:/ # busybox  dd if=/dev/block/mmcblk0 of=/dev/null bs=1M count=512                          <
512+0 records in
512+0 records out
536870912 bytes (512.0MB) copied, 2.508393 seconds, 204.1MB/s
console:/ # 

连续执行两次 busybox dd if=/dev/block/mmcblk0 of=/dev/null bs=1M count=512 ,从 /dev/block/mmcblk0 (即emmc) 块设备中读取内容,写到 /dev/null

/dev/null 是一个虚拟设备,写入这个路径并不会保存数据,可以认为这个设备的写入速度无限大,也就是写入速度不会成为这个命令的瓶颈,我们这个命令主要是为了测试 emmc 的读取速度。可以看到第一次执行的结果是 205.5MB/s,第二次执行的结果是 1.7GB/s。从这个数据来看,页面缓存极大的提高了热点文件的读取速度。然后我们用 echo 1 > /proc/sys/vm/drop_caches命令清除一下页面缓存,再执行同样的 dd命令,发现速度跟第一次差不多了。

写入性能测试

写入块设备

cache 分区一般是用来存放 OTA 升级包的,正常状态下挂载失败也不影响系统的正常运行,所以我们拿 cache 分区来作写入测试,先找到 cache 对应的块设备文件(df -h命令显示异常的话,可以执行ls -l /dev/block/platform/*/by-name/cache

注意:本测试方法可能会损坏cache分区导致ota失败,出现这种情况建议恢复出厂设置或者线刷。

console:/ # df -h
Filesystem            Size  Used Avail Use% Mounted on
tmpfs                 1.5G  892K  1.5G   1% /dev
tmpfs                 1.5G     0  1.5G   0% /mnt
/dev/block/mmcblk0p26  14M  168K   14M   2% /metadata
/dev/block/dm-1       1.1G  0.9G  199M  84% /
/dev/block/mmcblk0p40 379M   24M  356M   7% /wesley
/dev/block/mmcblk0p38 379M  154M  226M  41% /factory
/dev/block/mmcblk0p39  18M  1.3M   17M   8% /atv
/dev/block/mmcblk0p36 9.1M   24K  9.0M   1% /oem
/dev/block/dm-2       340M  240M  100M  71% /vendor
/dev/block/dm-0       167M   84K  167M   1% /mnt/scratch
overlay               167M   84K  167M   1% /system_ext
overlay               167M   84K  167M   1% /product
overlay               167M   84K  167M   1% /odm
tmpfs                 1.5G     0  1.5G   0% /apex
tmpfs                 1.5G  248K  1.5G   1% /linkerconfig
tmpfs                  20M  1.0M   19M   6% /mnt/vendor/rtdlog
tmpfs                  20M  8.0K   20M   1% /tmp
/dev/block/mmcblk0p23 1.4G  3.9M  1.4G   1% /cache
/dev/block/mmcblk0p31 236M   12M  224M   6% /mnt/vendor/tvconfigs
/dev/block/mmcblk0p32  26M   84K   26M   1% /mnt/vendor/tvdata
/dev/block/mmcblk0p33  18M   36K   18M   1% /mnt/vendor/impdata
/dev/block/mmcblk0p4  976K  228K  748K  24% /mnt/vendor/factory
/dev/block/mmcblk0p6  976K   28K  948K   3% /mnt/vendor/factory_ro
tmpfs                  20M     0   20M   0% /shm
tmpfs                 8.0M     0  8.0M   0% /mnt/EPGdb
/dev/block/mmcblk0p42 107G  4.8G  102G   5% /data
tmpfs                 1.5G     0  1.5G   0% /data_mirror
/dev/fuse             107G  4.8G  102G   5% /mnt/user/0/emulated
console:/ # 

cache分区的块设备文件为/dev/block/mmcblk0p23。

写入测试:

console:/ #  echo 1 > /proc/sys/vm/drop_caches    
console:/ #  busybox dd if=/dev/zero of=/dev/block/mmcblk0p23 bs=1M count=1024 conv=fsync
1024+0 records in
1024+0 records out
1073741824 bytes (1.0GB) copied, 11.371810 seconds, 90.0MB/s

输入文件为 /dev/zero,是一个虚拟设备,我们可以认为这个设备的读取速度无限大,也就是读取速度不会影响到写入的速度。

bs=1M : 一次写入 1M

count=1024 : 写入 1024 次,也就是写入的数据总量为 1G

conv=fsync : dd 结束前,把数据同步到 emmc,如果没加这个参数的话,数据可能还在缓存之中。为了确保数据准确,一定要加这个参数。

可以重复测试几次

写入文件

console:/ # echo 1 > /proc/sys/vm/drop_caches
console:/ # busybox dd if=/dev/zero of=/data/ddtest.bin bs=1M count=1024 conv=fsync                   
1024+0 records in
1024+0 records out
1073741824 bytes (1.0GB) copied, 15.211609 seconds, 67.3MB/s
console:/ #

要重复测试几次。相对直接写块设备文件慢了 30M/s 左右。这可能是文件系统带来的影响。

读取测试

读取块设备

直接用我们上面介绍清除缓存的例子就行,这里就不再重复了。

从上面的例子得到的数据为 205M/s 左右。

读取文件

console:/ # echo 1 > /proc/sys/vm/drop_caches        
console:/ # busybox dd if=/data/ddtest.bin of=/dev/null bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.0GB) copied, 5.464306 seconds, 187.4MB/s
console:/ # 

直接拿测试写入速度时生成的文件,重复测试几次,速度基本上在 187MB/s 左右。

iozone

Android 系统源码中并没有 iozone,我们从官网上下载编译,我下载时最新版本为iozone3_493,这个版本已经有 Android.mk 在代码里面了,将源码放到 Android系统源码里面 mm 即可。下面已经是我编译好的文件。对应不同硬件使用对应版本即可,把文件push到/data/local/tmp/,并赋予执行权限。

source/izone.zip at main · wesley666/source

随机读写测试

console: echo 1 > /proc/sys/vm/drop_caches                                              <
console:/data/local/tmp # ./iozone -azecI -+n -L64 -S32 -r1m -s1024m -i0 -i1 -i2 -w -f /data/iozonetest.bin Iozone: Performance Test of File I/OVersion $Revision: 3.493 $Compiled for 32 bit mode.Build: linux-arm Contributors:William Norcott, Don Capps, Isom Crawford, Kirby CollinsAl Slater, Scott Rhine, Mike Wisner, Ken GossSteve 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: Fri Jun 10 19:34:04 2022Auto ModeCross over of record size disabled.Include fsync in write timingInclude close in write timingO_DIRECT feature enabledNo retest option selectedRecord Size 1024 kBFile size set to 1048576 kBSetting no_unlinkCommand line used: ./iozone -azecI -+n -L64 -S32 -r1m -s1024m -i0 -i1 -i2 -w -f /data/iozonetest.binOutput is in kBytes/secTime Resolution = 0.000001 seconds.Processor cache size set to 32 kBytes.Processor cache line size set to 64 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  freread1048576    1024   150737        0   210429        0   208681   173348                                                                iozone test complete.
console:/data/local/tmp # 

从结果来看,写速度为150MB/s,读速度为210MB/s,随机读速度为208MB/s。 随机写速度为 173MB/s。

重复测试几次结果差不多,读的速度基本跟 dd 的一致。写入比 dd 的快了一倍几,这里面的差距待研究,可能跟参数设置有关。

./iozone -azecI -+n -L64 -S32 -r1m -s1024m -i0 -i1 -i2 -w -f /data/iozonetest.bin [-Rb /sdcard/emmc_test.xls] 

各个参数定义如下:

a: 使用全自动模式。生成涵盖所有测试操作的输出,记录大小为4k到16M,文件大小为64k到512M。

z: 与-a一起使用以测试所有可能的记录大小。通常,Iozone在全自动模式下使用时会忽略对非常大的文件的小记录大小的测试。此选项强制iozone在自动测试中也包括小记录大小。

e: 在时间计算中包括flush(fsync,fflush)

c: 在计时计算中包括close()。 仅当您怀疑当前正在测试的操作系统中的close()被破坏时,这才有用。 它对于NFS3测试也很有用,可以帮助识别nfs3_commit是否运行良好。

I: 对所有文件操作使用DIRECT I/O. 告诉文件系统所有操作都绕过缓冲区缓存并直接转到磁盘。 这也将在VxFS上使用VX_DIRECT,在Linux上使用O_DIRECT,在Solaris上使用directio()。

-+n: 没有选择重新测试。使用此选项可防止重新测试运行。

L64: Set processor cache line size to 64 Bytes

S32: Set processor cache size to 32KBytes

r2m: block size 指定一次写入/读出的块大小:1M

s1024m: 用于指定要测试的文件的大小:1024M

-i N 用来选择测试项, 比如Read/Write/Random 比较常用的是0 1 2,可以指定成-i 0 -i 1 -i2.这些别的详细内容请查man

0=write/rewrite

1=read/re-read

2=random-read/write

3=Read-backwards

4=Re-write-record

5=stride-read

6=fwrite/re-fwrite

7=fread/Re-fread

8=random mix

9=pwrite/Re-pwrite

10=pread/Re-pread

11=pwritev/Re-pwritev

12=preadv/Re-preadv

-+b 400000,30000: burst size 400000KBytes,sleep between burst 30000ms

w: 当临时文件使用完毕时不删除它们。把它们留在文件系统中。

f: 指定测试文件的名字(这个文件必须指定你要测试的那个硬件中)

可选参数:

R: Generate Excel report

b: Filename Create Excel worksheet file,emmc_test.xls

注意:

根据测试文件大小的不同,iozone 磁盘读写性能的测试方法主要包括1倍内存测试和2倍内存测试(避免缓存的影响)。

参考

Android-emmc性能测试 | 一叶知秋

axboe/fio: Flexible I/O Tester

DevriesL/RaptorMark

Iozone Filesystem Benchmark

iozone: Index of /src/current

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/79346.shtml

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

相关文章

软件管理(安装方式)

1.rpm安装 1.1.rpm介绍 rpm软件包名称: 软件名称 版本号(主版本、次版本、修订号) 操作系统 -----90%的规律 举例:openssh-6.6.1p1-31.el7.x86_64.rpm 数字是版本号:第一位主版本号,第二位次版本号,带横杠的是修订号, el几---操作系统的版本。 #用rpm安装需要考虑如下信…

OnlyOffice Document Server 源码调试指南-ARM和x86双模式安装支持

在ARM64架构下创建的ONLYOFFICE源码调试容器具有显著优势。该容器基于官方Document Server镜像构建&#xff0c;通过集成Git、Python和Node.js等工具链&#xff0c;实现跨平台环境一致性&#xff0c;确保ARM设备的兼容性。容器化隔离消除了依赖冲突&#xff0c;支持快速部署到边…

oracle 数据库查询指定用户下每个表占用空间的大小,倒序显示

oracle 查询指定用户下每个表占用空间的大小&#xff0c;倒序显示 使用场景&#xff1a;数据分析&#xff1b;导出医院正式库到开发环境时&#xff0c;查询出占用表空间高的业务表、导出时排除该表 在Oracle数据库中&#xff0c;要查询指定用户下每个表占用空间的大小并以倒序…

归并排序【逆序对】

目录 归并排序原理 逆序对 归并排序 主要利用分治思想&#xff0c;时间复杂度O(nlogn) 原理 1.对数列不断等长拆分&#xff0c;直到一个数的长度。2.回溯时&#xff0c;按升序合并左右两段。3.重复以上两个过程&#xff0c;直到递归结束。 合并 1.i&#xff0c;j分别指向a的…

AI 与生物技术的融合:开启精准医疗的新纪元

在科技飞速发展的今天&#xff0c;人工智能&#xff08;AI&#xff09;与生物技术的融合正在成为推动医疗领域变革的重要力量。精准医疗作为现代医学的重要发展方向&#xff0c;旨在通过深入了解个体的基因信息、生理特征和生活方式&#xff0c;为患者提供个性化的治疗方案。AI…

对比表格:数字签名方案、密钥交换协议、密码学协议、后量子密码学——密码学基础

文章目录 一、数字签名方案1.1 ECDSA&#xff1a;基于椭圆曲线的数字签名算法1.2 EdDSA&#xff1a;Edwards曲线数字签名算法1.3 RSA-PSS&#xff1a;带有概率签名方案的RSA1.4 数字签名方案对比 二、密钥交换协议2.1 Diffie-Hellman密钥交换2.2 ECDH&#xff1a;椭圆曲线Diffi…

Linux 进程间通信(IPC)详解

进程间通信&#xff08;IPC&#xff09;深入解析 一、进程间通信概述 在操作系统里&#xff0c;不同进程间常常需要进行数据交换、同步协调等操作&#xff0c;进程间通信&#xff08;Inter - Process Communication&#xff0c;IPC&#xff09;机制应运而生。在Linux系统中&a…

深度解析ComfyUI的使用

一、ComfyUI 概述 ComfyUI 本质上是一个专为 AI 绘画爱好者和专业人士打造的用户界面工具&#xff0c;它的核心作用是将复杂的 AI 绘画生成过程以直观的方式呈现给用户。与传统的图像生成工具不同&#xff0c;ComfyUI 借助其独特的节点化工作流系统&#xff0c;把深度学习模型…

模型测试报错:有2张显卡但cuda.device_count()显示GPU卡数量只有一张

此贴仅为记录debug过程&#xff0c;为防后续再次遇见 问题 问题情境 复现文章模型&#xff0c;使用GPU跑代码&#xff0c;有两张GPU&#xff0c;设置在 cuda: 1 上跑 问题描述 在模型测试加载最优模型时报错&#xff1a;torch.cuda.device_count()显示GPU卡数量只有一张&…

【计网】认识跨域,及其在go中通过注册CORS中间件解决跨域方案,go-zero、gin

一、跨域&#xff08;CORS&#xff09;是什么&#xff1f; 跨域&#xff0c;指的是浏览器出于安全限制&#xff0c;前端页面在访问不同源&#xff08;协议、域名、端口任一不同&#xff09;的后端接口时&#xff0c;会被浏览器拦截。 比如&#xff1a; 前端地址后端接口地址是…

内存性能测试方法

写于 2022 年 6 月 24 日 内存性能测试方法 - Wesley’s Blog dd方法测试 cat proc/meminfo console:/ # cat proc/meminfo MemTotal: 3858576 kB MemFree: 675328 kB MemAvailable: 1142452 kB Buffers: 65280 kB Cached: 992252 …

AVFormatContext 再分析二

说明 &#xff1a;将 avfromatContext 的变量依次打印分析&#xff0c;根据ffmpeg 给的说明&#xff0c;猜测&#xff0c;结合网上的文章字节写测试代码分析二。 37 AVInputFormat *iformat; /** * The input container format. * * Demuxing only, set by avfo…

深入了解Linux系统—— 进程优先级

前言 我们现在了解了进程是什么&#xff0c;进程状态表示什么 &#xff0c;我们现在继续来了解进程的属性 —— 进程优先级 进程执行者 在了解进程优先级之前&#xff0c;先来思考一个问题&#xff1a;在我们进行文件访问操作时&#xff0c;操作系统是如何直到我们是谁&#x…

Expected SARSA算法详解:python 从零实现

&#x1f9e0; 向所有学习者致敬&#xff01; “学习不是装满一桶水&#xff0c;而是点燃一把火。” —— 叶芝 我的博客主页&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 欢迎点击加入AI人工智能社区&#xff01; &#x1f680; 让我们一起努力&#xff0c;共创…

1penl配置

好的&#xff0c;根据您提供的 1pctl 命令输出信息&#xff0c;我们来重新依次回答您的所有问题&#xff1a; 第一&#xff1a;1Panel 怎么设置 IP 地址&#xff1f; 根据您提供的 user-info 输出&#xff1a; 面板地址: http://$LOCAL_IP:34523/93d8d2d705 这里的 $LOCAL_I…

链表的回文结构题解

首先阅读题目&#xff1a; 1.要保证是回文结构 2.他的时间复杂度为O(n)、空间复杂度为O(1) 给出思路: 1.首先利用一个函数找到中间节点 2.利用一个函数逆置中间节点往后的所有节点 3.现在有两个链表&#xff0c;第一个链表取头节点一直到中间节点、第二个链表取头结点到尾…

【LLaMA-Factory实战】1.3命令行深度操作:YAML配置与多GPU训练全解析

一、引言 在大模型微调场景中&#xff0c;命令行操作是实现自动化、规模化训练的核心手段。LLaMA-Factory通过YAML配置文件和多GPU分布式训练技术&#xff0c;支持开发者高效管理复杂训练参数&#xff0c;突破单机算力限制。本文将结合结构图、实战代码和生产级部署经验&#…

C++负载均衡远程调用学习之 Dns-Route关系构建

目录 1.LARS-DNS-MYSQL环境搭建 2.LARSDNS-系统整体模块的简单说明 3.Lars-Dns-功能说明 4.Lars-Dns-数据表的创建 5.Lars-Dns-整体功能说明 6.Lars-DnsV0.1-Route类的单例实现 7.Lars-DnsV0.1-Route类的链接数据库方法实现 8.Lars-DnsV0.1-定义存放RouteData关系的map数…

fastapi+vue中的用户权限管理设计

数据库设计&#xff1a;RBAC数据模型 这是一个典型的基于SQLAlchemy的RBAC权限系统数据模型实现&#xff0c;各模型分工明确&#xff0c;共同构成完整的权限管理系统。 图解说明&#xff1a; 实体关系&#xff1a; 用户(USER)和角色(ROLE)通过 USER_ROLE 中间表实现多对多关系…

【Python实战】飞机大战

开发一个飞机大战游戏是Python学习的经典实战项目&#xff0c;尤其适合结合面向对象编程和游戏框架&#xff08;如Pygame&#xff09;进行实践。以下是游戏设计的核心考虑因素和模块划分建议&#xff1a; 一、游戏设计核心考虑因素 性能优化 Python游戏需注意帧率控制&#xff…