块设备的测试
来源:互联网 发布:松下交换机编程 编辑:程序博客网 时间:2024/04/29 23:07
块设备的测试
对于嵌入式开发,有时需要测试块设备,本文将以mmc设备为例,分析各种测试方法
1.Linux中的读写机制
由于块设备物理上的特殊性,读写很慢,而且时机、顺序、大小都比较重要。所以VFS(Virtual File System)中引入了高速缓存的机制,这属于一种软件机制,允许内核将原本存在块设备上的某些信息保存在内存中,以便对这些数据的进一步访问能快速进行,而不必慢速访问块设备本身
- 比如往块设备上写数据时,VFS文件系统采用了文件数据延迟写的技术,因此,如果在调用系统接口写入数据时没有使用同步写模式,那么大多数据将会先保存在缓存中,待等到满足某些条件时才将数据刷入块设备里
- 比如从块设备上读数据时,系统会先将数据往缓存里放一份,如果下次要读的数据与该数据有部分重合,那么下次就会直接从缓存读了,而并不会真的从块设备中读取
- 总之,缓存的存在大大方便了读写块设备,只要缓存内数据能解决的,就绝对不会劳烦去读写块设备,相当智能
2.块设备的读写速度测试
对于块设备读写速度测试,最重要的是避开缓存和其他进程的干扰
- 首先利用
killall -9 xxx
杀死应用层非系统自带的进程 - 读速度测试
echo 3 > /proc/sys/vm/drop_caches
time dd if=/dev/mmcblkxxx of=/xxx/xxx bs=1M count=100 conv=fsync
首先清空系统的缓存,强制系统直接去块设备中读取。然后用time,来测试dd命令消耗的时间, of的路径应该设为内存,比如常见的/tmp目录下可能就挂载了内存,根据系统设置灵活更改。fsync参数保证了数据被同步到块设备中,命令才返回。最后的返回值realtime是我们需要的,这个返回值包含了数据被同步到块设备中的时间 - 写速度测试
echo 3 > /proc/sys/vm/drop_caches
dd if=/dev/urandom of=/xxx/xxx bs=1M count=100
time dd if=/xxx/xxx of=/dev/mmcblkxxx bs=1M count=100 conv=fsync
首先清空系统的缓存。先在内存中生成一个文件,内容是随机数,of的路径应该设为内存,比如常见的/tmp目录下可能就挂载了内存,根据系统设置灵活更改。然后用time,来测试dd命令消耗的时间, of的路径应该设为没有用的分区,以防止内核或文件被覆盖,根据系统设置灵活更改。fsync参数保证了数据被同步到块设备中,命令才返回。最后的返回值realtime是我们需要的,这个返回值包含了数据被同步到块设备中的时间
3.块设备的可靠性测试
所谓的可靠性测试,就是在不同温度下,对块设备进行大量读写,保证其内部数据不出差错(检验md5是否变化)
- 读可靠性测试,读取100万次:
#!/bin/shkillall -9 xxxsum_val=`dd if=/dev/mmcblkxxx bs=1M count=1 2> /dev/null | md5sum | awk '{print $1}'`echo "$sum_val"for i in `seq 1000`;do for j in `seq 1000` do echo 3 > /proc/sys/vm/drop_caches tmp=`dd if=/dev/mmcblkxxx bs=1M count=1 2> /dev/null | md5sum | awk '{print $1}'` if [ "$sum_val" != "$tmp" ];then echo "error" >> ./test.txt break 2 fi done echo $i >> ./test.txtdone
首先杀死应用层非系统自带的进程,提升程序执行速度。然后先读一次数据,获取该次数据的md5值作为标准值。接着进行嵌套循环,共计100万次操作,每次操作进行清缓存、读数据、计算数据的md5值,如果和标准值不同,则输出错误信息到一个文件中,并终止本脚本
- 可靠性写测试
#!/bin/shkillall -9 rundd if=/dev/urandom of=/dev/mmcblkxxx bs=1M count=100 seek=1900sum=`dd if=/dev/mmcblkxxx bs=1M count=100 skip=1900 2> /dev/null | md5sum | awk '{print $1}'`echo "$sum"for i in `seq 15`;do for j in `seq 1800` do echo 3 > /proc/sys/vm/drop_caches dd if=/dev/mmcblkxxx of=/dev/mmcblkxxx bs=1M count=100 seek=$j skip=1900 tmp=`dd if=/dev/mmcblkxxx bs=1M count=100 skip=$j 2> /dev/null | md5sum | awk '{print $1}'` echo $i >> ./test.txt if [ "$sum" != "$tmp" ];then echo "error" >> ./test.txt break 2 fi donedone
写测试相对来说要求比较多,首先其实现方式是先写,再读,读出来做MD5校验看看与原始值是否相同。在写的过程中,尤其注意不能一直往同一地址写,这不是因为缓存的原因,而是系统在写的过程中并不把目标地址中的数据清除,所以就算写失败了我们读出来的数据还是上一次的正确数据。对于这个问题,有两种解决方案:第一种是在写之前将目标地址除的数据先全部写0,缺点是耗时间;第二种是我们上面代码中的方法,即在循环中每次往不同的地址写值(利用dd命令的seek来实现)
操作的mmc位置不可以在rootfs所在的分区,否则会破坏文件系统的内容。以上面这段代码为例,它在一个大小为2G的分区内操作,先把特定的数据写到分区的末尾100M处,这100M专门存放该特定数据,读写操作不可在此进行,然后用一个循环,从这个2G分区的头部开始,不停的写和读,每操作一次地址向后移动1M,这样就保证了每一次操作的都是不同的地址。注意代码中的1800这个数字,之所以设该数字是因为1900位置处的数据是参考的基准数据,不可以被改变,所以要在1900之前100M(即1800处)刹住车
- 块设备的测试
- 块设备--块设备的架构
- 块设备--块设备的打开流程
- 块设备的基础知识
- 块设备的初始化
- 块设备的基础知识
- 块设备的初始化
- linux块设备驱动与其测试
- Ceph块设备云硬盘测试过程
- fio 测试ceph块设备性能
- 代码块的测试
- 字符设备和块设备的区别
- 字符设备和块设备的区别
- 字符设备与块设备的区别
- 块设备和字符设备的区别
- 字符设备和块设备的区别
- 字符设备和块设备的区别
- 字符设备与块设备的区别
- ios AFNetworking 圆形进度条下载,显示百分比
- JSON与聚合数据不解之缘<二>
- 根据字符串的第一个'_',从数据库查询与其相关的其他字段
- [libevent源码分析] event_base_dispatch
- 常见的响应式布局(一)
- 块设备的测试
- 执行HDevelop项目
- java--List
- Universal-Image-Loader(android图片缓存)
- js 生成guid
- 点击按钮滑动显示侧边导航栏
- Lock与Condition应用(三个线程之间通信问题)
- android6.0第三方app如何打开串口
- 有趣的第一人称和第三人称游戏