前言
SD卡的读写速度,受限制于SD卡本身固有的性能之外,还跟读卡器,主CPU性能等有一定的关系。所以,同一张SD卡,想要知道其在嵌入式设备中实际的读写性能,还需要在嵌入式环境中实际测试下才准确,linux下命令dd使用指定的输入和输出块大小来拷贝文件,它每次从输入读取指定大小的一个块写到独立的输出块去,通过这种方法来测试读写速度。
测试环境
硬件:嵌入式ARM
系统:Linux version 3.10.0
内存:512M
一、内核缓存
在开始测试之前,必须先弄明白“内核缓存”的概念,否则很容易测出错误的数据。向文件中写入数据时,数据会先缓存在Page Cache中,内存中的这部分数据被标注为Dirty Page,linux系统上的pdflush守护进程会跟进系统设置将将这部分Dirty Page刷到磁盘上,也可以通过fsync系统调用在数据写入后强制刷到磁盘上。将写入的数据刷入磁盘时,是以Buffer Cache为单位,每次回写若干个Buffer Cache。
读取文件内容时,系统会一次性连续读取包括所请求页面在内的多个页面(如预读页面个数为n)。如果请求的页面在page cache中命中的话,会从缓存中返回页面内容,增加读取的页面数量,异步读取2n个页面;如果请求的页面没有在page cache中命中,也会增加读取页面数量,同步读取2n个页面。
为了避免内核缓存对测试带来影响,在每条测试语句之前,都要先清除linux内核缓存,命令如下:
# sync; echo 3 > /proc/sys/vm/drop_caches
二、测试磁盘写能力
1、正确的命令
# sync; echo 3 > /proc/sys/vm/drop_caches
# dd bs=1M count=500 if=/dev/zero of=/mnt/sdcard/outfile
500+0 records in
500+0 records out
524288000 bytes (500.0MB) copied, 122.160615 seconds, 4.1MB/s
# sync; echo 3 > /proc/sys/vm/drop_caches
# dd bs=20k count=25600 if=/dev/zero of=/mnt/sdcard/outfile
25600+0 records in
25600+0 records out
524288000 bytes (500.0MB) copied, 12