下面的测试方法受到缓存的影响,2.5寸,5400转的ATAT笔记本硬盘,不可能速度达到368MB/s,所以肯定先写缓存了
steve@steve-Inspiron-6000:~/temp$ time dd if=/dev/zero of=./test1 bs=64k count=1000
1000+0 records in
1000+0 records out
65536000 bytes (66 MB) copied, 0.177868 s, 368 MB/s
用/dev/urandom可写入随机数据
time dd if=/dev/urandom of=./test1 bs=64k count=1000
Linux 中直接 I/O 机制的介绍(此文有对linux direct I/O的精彩介绍)
http://www.ibm.com/developerworks/cn/linux/l-cn-directio/
使用oflag=direct表示使用DirectIO方式,速度降到33.6MB/S,比较符合实际情况
steve@steve-Inspiron-6000:~/temp$ time dd if=/dev/zero of=./test2 bs=64k count=1000 oflag=direct
1000+0 records in
1000+0 records out
65536000 bytes (66 MB) copied, 1.94967 s, 33.6 MB/s
real 0m1.953s
user 0m0.000s
sys 0m0.144s
direct I/O直接读
dd if=./nginx of=/mnt/hgfs/pub/test bs=512 iflag=direct
注意在RHEL 6.4 上测试,不是所有文件系统都支持direct I/O
在dd命令结束前同步数据和元数据(metaData)
steve@steve-Inspiron-6000:~/temp$ time dd if=/dev/zero of=./test3 bs=64k count=1000 conv=fsync
1000+0 records in
1000+0 records out
65536000 bytes (66 MB) copied, 2.83524 s, 23.1 MB/s
real 0m2.839s
user 0m0.000s
sys 0m0.168s
在dd命令结束前只同步数据
steve@steve-Inspiron-6000:~/temp$ time dd if=/dev/zero of=./test1 bs=64k count=1000 conv=fdatasync
1000+0 records in
1000+0 records out
65536000 bytes (66 MB) copied, 2.78156 s, 23.6 MB/s
real 0m2.785s
user 0m0.004s
sys 0m0.168s
使用同步I/O,每次写都要物理写入磁盘(磁盘会狂响的^_^),巨慢
steve@steve-Inspiron-6000:~/temp$ time dd if=/dev/zero of=./test2 bs=64k count=1000 oflag=sync
1000+0 records in
1000+0 records out
65536000 bytes (66 MB) copied, 48.4128 s, 1.4 MB/s
real 0m48.416s
user 0m0.000s
sys 0m0.364s
oflag=dsync只同步写数据
steve@steve-Inspiron-6000:~/temp$ time dd if=/dev/zero of=./test5 bs=64k count=1000
oflag=nonblock
1000+0 records in
1000+0 records out
65536000 bytes (66 MB) copied, 0.144059 s, 455 MB/s
real 0m0.148s
user 0m0.000s
sys 0m0.128s