测试裸盘写性能
直接写,不同步数据,不屏蔽写缓存,观察性能,我们可以看到,写的数据越多,磁盘写性能下降很明显,说明这种操作不能正确的反映磁盘写性能
其中/dev/zero是一个伪设备,它只产生空字符流,对它不会产生IO,所以,IO都会集中在of文件中,of文件只用于写,所以这个命令相当于测试磁盘的写能力。
[root@orcadt6 opt]# dd if=/dev/zero of=/dev/vda bs=4k count=100000
100000+0 records in
100000+0 records out
409600000 bytes (410 MB) copied, 1.21162 s, 338 MB/s
[root@orcadt6 opt]# dd if=/dev/zero of=/dev/vda bs=4k count=1000000
1000000+0 records in
1000000+0 records out
4096000000 bytes (4.1 GB) copied, 30.8322 s, 133 MB/s
[root@orcadt6 opt]# dd if=/dev/zero of=/dev/vda bs=4k count=5000000
5000000+0 records in
5000000+0 records out
20480000000 bytes (20 GB) copied, 270.688 s, 75.7 MB/s
[root@orcadt6 opt]#
测试裸盘读性能
直接读,观察性能,
/dev/null是伪设备,相当于黑洞,of到该设备不会产生IO,所以这个命令的IO只发生在/dev/sdb1上,也相当于测试磁盘的读能力
[root@orcadt6 opt]# dd if=/dev/vda of=/dev/null bs=4k count=5000000
5000000+0 records in
5000000+0 records out
20480000000 bytes (20 GB) copied, 219.49 s, 93.3 MB/s
[root@orcadt6 opt]# dd if=/dev/vda of=/dev/null bs=4k count=1000000
1000000+0 records in
1000000+0 records out
4096000000 bytes (4.1 GB) copied, 24.9427 s, 164 MB/s
[root@orcadt6 opt]# dd if=/dev/vda of=/dev/null bs=4k count=100000
100000+0 records in
100000+0 records out
409600000 bytes (410 MB) copied, 0.353777 s, 1.2 GB/s
[root@orcadt6 opt]# dd if=/dev/vda of=/dev/null bs=4k
^C6425487+0 records in
6425486+0 records out
26318790656 bytes (26 GB) copied, 688.21 s, 38.2 MB/s
看下帮助文档
用法:dd [OPERAND] ......
或者:dd OPTION
根据操作数复制文件,转换和格式化。
bs = BYTES一次读写BYTES字节
cbs = BYTES一次转换BYTES字节
conv = CONVS按照逗号分隔的符号列表转换文件
count = N仅复制N个输入块
ibs = BYTES一次读取BYTES字节(默认值:512)
if = FILE从FILE而不是stdin读取
iflag = FLAGS按逗号分隔的符号列表读取
obs = BYTES一次写BYTES字节(默认值:512)
of = FILE写入FILE而不是stdout
oflag = FLAGS根据逗号分隔的符号列表写入
seek = N在输出开始时跳过N个阻塞大小的块
skip = N在输入开始时跳过N ibs大小的块
status = LEVEL要打印到stderr的信息的级别;
'none'除了错误消息外都会抑制所有内容,
'noxfer'抑制最终转移统计,
'progress'显示定期传输统计信息
N和BYTES之后可以跟随以下乘法后缀:
c = 1,w = 2,b = 512,kB = 1000,K = 1024,MB = 1000 * 1000,M = 1024 * 1024,xM = M
对于T,P,E,Z,Y,GB = 1000 * 1000 * 1000,G = 1024 * 1024 * 1024等。
每个CONV符号可能是:
ascii 从EBCDIC到ASCII
ebcdic 从ASCII到EBCDIC的ebcdic
ibm 从ASCII到交替EBCDIC的ibm
block 阻止填充换行符终止的记录,其空格为cbs-size
unblock 用换行符替换cbs-size记录中的尾随空格
lcase 将大写更改为小写
ucase 将小写更改为大写
sparse 尝试寻找而不是写入NUL输入块的输出
swab 交换每对输入字节
sync 每个输入块同步填充NUL到ibs大小;使用时使用block或unblock,填充空格而不是NUL
excl 如果输出文件已存在,则excl失败
nocreat 不创建输出文件
notrunc 不截断输出文件
noerror 错误不终止操作
fdatasync 在完成之前物理同步写入输出文件数据,不只在写缓存后返回
fsync同样,但同时写入元数据
每个FLAG符号可能是:
append 追加附加模式(仅对输出有意义;建议使用conv = notrunc)
direct 直接使用直接I / O数据
directory 写目录,非目录则失败
dsync 使用同步I / O进行数据
sync 同样地同步,但也用于元数据
fullblock 累积整个输入块(仅限iflag)
nonblock 使用非阻塞I / O.
noatime 不更新访问时间
nocache 丢弃缓存数据
noctty 不从文件中分配控制终端
nofollow 不遵循符号链接
count_bytes 将'count = N'视为字节数(仅限iflag)
skip_bytes 将'skip = N'视为字节数(仅限iflag)
seek_bytes 将'seek = N'视为字节数(仅限oflag)
将USR1信号发送到正在运行的'dd'进程就可以了
将I / O统计信息打印到标准错误,然后重新开始复制。
$ dd if = / dev / zero of = / dev / null&pid = $!
$ kill -USR1 $ pid;sleep 1;kill $ pid
18335302 + 0记录在
18335302 + 0记录
9387674624 bytes (9.4 GB) copied, 34.6279 seconds, 271 MB/s
如何准确测试写磁盘
熟悉以上例子和文档后,查看如何真正写磁盘
分析参数,conv=fdatasync 同步数据io至磁盘,就是io直接下发磁盘成功后返回
oflag=direct,dsync 绕开写缓存直接写入磁盘,同步IO,以下结果相对比较真实,可以从我写的磁盘看出来我使用的是虚拟设备虚拟盘,相对写是比较慢的
[root@orcadt6 opt]# dd if=/dev/zero of=/dev/vda bs=4k count=10 conv=fdatasync oflag=direct,dsync
10+0 records in
10+0 records out
40960 bytes (41 kB) copied, 0.0886036 s, 462 kB/s
[root@orcadt6 opt]# dd if=/dev/zero of=/dev/vda bs=4k count=100 conv=fdatasync oflag=direct,dsync
100+0 records in
100+0 records out
409600 bytes (410 kB) copied, 0.36866 s, 1.1 MB/s
[root@orcadt6 opt]# dd if=/dev/zero of=/dev/vda bs=4k count=1000 conv=fdatasync oflag=direct,dsync
1000+0 records in
1000+0 records out
4096000 bytes (4.1 MB) copied, 4.07199 s, 1.0 MB/s
[root@orcadt6 opt]# dd if=/dev/zero of=/dev/vda bs=4k count=10000 conv=fdatasync oflag=direct,dsync
10000+0 records in
10000+0 records out
40960000 bytes (41 MB) copied, 42.1317 s, 972 kB/s
读性能评测
同理可得一下读性能,在dd命令中count越大越接近真实情况(持续IO)
[root@orcadt6 opt]# dd if=/dev/vda of=/dev/null bs=4k count=10000 iflag=direct,dsync
10000+0 records in
10000+0 records out
40960000 bytes (41 MB) copied, 12.4751 s, 3.3 MB/s
[root@orcadt6 opt]# dd if=/dev/vda of=/dev/null bs=4k count=1000 iflag=direct,dsync
1000+0 records in
1000+0 records out
4096000 bytes (4.1 MB) copied, 1.10571 s, 3.7 MB/s
[root@orcadt6 opt]# dd if=/dev/vda of=/dev/null bs=4k count=10 iflag=direct,dsync
10+0 records in
10+0 records out
40960 bytes (41 kB) copied, 0.00106058 s, 38.6 MB/s
[root@orcadt6 opt]# dd if=/dev/vda of=/dev/null bs=4k count=20000 iflag=direct,dsync
20000+0 records in
20000+0 records out
81920000 bytes (82 MB) copied, 27.4144 s, 3.0 MB/s