記于 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