磁盘分区写性能:


# cd /home/es  (/dev/vdb1)

# time dd if=/dev/zero of=test.dbf bs=8k count=300000


说明:/dev/zero 是一个伪设备,它只产生空字符流,对它不会产生IO,所以,IO都会集中在of文件中,of文件只用于写,所以这个命令相当于测试磁盘的写能力。因为一般更长测试时间更准确,所以可以设置count大一些。


注意:这个命令是不准确的,因为命令结束的时候数据还没有真正写到磁盘上去,因为对磁盘的写,我们一般是先写到了缓存就返回了。


输出的结果类似:

300000+0 records in

300000+0 records out

2457600000 bytes (2.5 GB) copied, 8.62196 s, 285 MB/s


real    0m8.695s

user    0m0.121s

sys     0m6.706s


## 写速度为:8*300000/1024/8.695=285M/s


磁盘分区读性能:


# time dd if=/dev/vdb1 of=/dev/null bs=8k


^C # 手动退出程序


说明:/dev/vdb1 是一个物理分区,对它的读取会产生IO,/dev/null 是伪设备,相当于黑洞,of到该设备不会产生IO,所以,这个命令的IO只发生在/dev/sdb1上,也相当于测试磁盘的读能力。


输出的结果类似:

1559766+0 records in

1559765+0 records out

12777594880 bytes (13 GB) copied, 94.9403 s, 135 MB/s


real    1m34.942s

user    0m0.787s

sys     0m13.248s


## 读取速度为:8*1559766/1024/94.9403=135M/s


补充:Windows下安装Cygwin也可以使用time和dd命令,而且输出结果中直接包含IO的时间和速度,有兴趣的朋友可以试一下,不过我测试下来的速度读写都只有40多M每秒,不知道是否是平台的原因,可能Cygwin的机制和Linux下还是有所不同吧。


在用dd做读或者写的时候,应该要注意自己的使用场景,如果需要将数据写入磁盘的话:


dd if=/dev/zero of=test bs=64k count=16k  是不准确的,


而 dd if=/dev/zero of=test bs=64k count=16k conv=fsync 比较准确,它在dd结束前会写到磁盘,


而 dd if=/dev/zero of=test bs=64k count=4k oflag=dsync或者sync  是真正的每写一次就写一次磁盘,所以其实可以听到磁盘啪啪啪的响的。


dd如何绕开cache:


如果要规避掉文件系统cache, 直接读写, 不使用buffer cache,需做这样的设置

iflag=direct,nonblock

oflag=direct,nonblock

iflag=cio

oflag=cio


direct 模式就是把写入请求直接封装成 io 指令发到磁盘

非direct 模式,就把数据写入系统缓存,然后就认为 io 成功,并由操作系统决定缓存中的数据什么时候被写入磁盘


dd if=/dev/zero of=test bs=64k count=4k oflag=dsync 这个可以当成是模拟数据库插入操作