dd测试服务器读写速度
网上dd命令的文章有很多,这里只是自己做下简单的记录。
dd命令介绍
作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。可以用于测试磁盘命令、数据备份或恢复等。
dd命令用于复制文件并对原文件的内容进行转换和格式化处理。用的比较多的还是用dd来备份裸设备。但是不推荐,如果需要备份oracle裸设备,可以使用rman备份,或使用第三方软件备份,使用dd的话,管理起来不太方便。建议在有需要的时候使用dd 对物理磁盘操作,如果是文件系统的话还是使用tar backup cpio等其他命令更加方便。另外,使用dd对磁盘操作时,最好使用块设备文件。
dd --help 打印帮助
dd 命令通用语法格式如下:
dd [bs=<字节数>][cbs=<字节数>][conv=<关键字>][count=<区块数>][ibs=<字节数>][if=<文件>][obs=<字节数>][of=<文件>][seek=<区块数>][skip=<区块数>][--help][--version]
dd if=path/to/input_file of=/path/to/output_file bs=block_size count=number_of_blocks
关于IO方式
正常系统调用read/write流程
硬盘->内核缓冲区->用户缓冲区
用户缓冲区->内核缓冲区->硬盘
Direct IO
跨过内核缓冲区,从用户缓冲区直接写盘,在Oracle里应该是跨过SGA,从PGA——>datafile
SYNC IO
会话发起IO请求时,整个会话阻塞,直到IO完成,在Oracle里比较典型的是lgwr,用户commit后必须等待lgwr写完才能返回
ASYNC IO
发出IO请求后,丢给内核去做,在Oracle表现为设置了dbwr_io_slaves,dbwr收集脏块后丢给slave进程去写盘
测试磁盘读写速度
测试时常会加上time计时
1、只测试磁盘写能力
time dd if=/dev/zero of=test.log bs=64k,count=4k
因为/dev//zero是一个伪设备,它只产生空字符流,对它不会产生IO,所以,IO都会集中在of文件中,of文件只用于写,所以这个命令相当于测试磁盘的写能力。命令结尾添加oflag=direct将跳过内存缓存,添加oflag=sync将跳过hdd缓存。
2、只测试磁盘读能力
time dd if=/dev/sdb of=/dev/null bs=64k
因为/dev/sdb是一个物理分区,对它的读取会产生IO,/dev/null是伪设备,相当于黑洞,of到该设备不会产生IO,所以,这个命令的IO只发生在/dev/sdb上,也相当于测试磁盘的读能力。(Ctrl+c终止测试)
读取某个文件测试磁盘读能力时,要首先清除内存的缓存,以确保这个文件确实是从驱动盘读取的。否则是从page cache里取的值。
运行下面的命令来清除内存缓存
$ sudo sh -c "sync && echo 3 > /proc/sys/vm/drop_caches"
执行完后再执行dd命令,如dd if=./test.log of=/dev/null bs=4k
3、测试同时读写能力
time dd if=/dev/sdb of=/testrw.dbf bs=64k
一个是物理分区,一个是实际的文件,对它们的读写都会产生IO(对/dev/sdb是读,对/testrw.dbf是写),假设它们都在一个磁盘中,这个命令就相当于测试磁盘的同时读写能力。
4、测试纯写入性能
dd if=/dev/zero of=test bs=8k count=10000 oflag=direct
5、测试纯读取性能
dd if=test of=/dev/null bs=8k count=10000 iflag=direct
注意:dd 只能提供一个大概的测试结果,而且是连续 I/O(顺序IO) 而不是随机 I/O,理论上文件规模越大,测试结果越准确。 同时,iflag/oflag 提供 direct 模式,direct 模式是把写入请求直接封装成 I/O 指令发到磁盘,非 direct 模式只是把数据写入到系统缓存就认为 I/O 成功,并由操作系统决定缓存中的数据什么时候被写入磁盘。
还可以监控下dd执行的进度:linux下显示dd命令的进度
疑问1:fdatasync 、fsync 、dsync 几种方式,建议用哪种呢?
建议dd bs=8k count=4k if=/dev/zero of=test.log conv=fdatasync
因为这种方式最接近计算机实际操作,所以测出来的数据最有参考价值。??
1. dd if=/dev/zero of=test bs=64k count=16k
这个很不准确的,因为命令结束的时候数据还没有真正写到磁盘上去
2. dd if=/dev/zero of=test bs=64k count=16k conv=fsync
这个还算准确,数据已经写入磁盘
3. dd if=/dev/zero of=test bs=64k count=4k oflag=dsync
这个可以当成是模拟数据库插入操作,所以很慢
-dsync 可以当成是模拟数据库插入操作,在/dev/zone中读出一条数据就立即写入硬盘
-fsync 同样也是将数据已经写入磁盘,但是是在经过缓存后最后再写入硬盘
疑问2:同一块磁盘,不同bs与count的组合,测试结果不同?
测试结果磁盘写速度肯定不同。
同一块磁盘,同一命令每次结果都可能会不同,需要多采样几次,取平均值。
疑问3:bs表示一个块大小,count为次数。应该如何设置bs、count的值,测试更准确?
常用的有bs=64k,count=4k
bs的大小:1M的大小实际上是相当大的。小尺寸如 64K 甚至是 4K 的。
常用命令
dd if=/dev/zero of=test bs=64k count=4k oflag=dsync
dd if=/dev/zero of=test bs=8k count=256k conv=fdatasync
参考文档:
正确的使用dd进行磁盘读写速度测试、Linux 中用 dd 命令来测试硬盘读写速度
转自:https://www.cnblogs.com/kongzhongqijing/articles/9049336.html
        我曾七次鄙视自己的灵魂:
  第一次,当它本可进取时,却故作谦卑;
  第二次,当它在空虚时,用爱欲来填充;
  第三次,在困难和容易之间,它选择了容易;
  第四次,它犯了错,却借由别人也会犯错来宽慰自己;
  第五次,它自由软弱,却把它认为是生命的坚韧;
  第六次,当它鄙夷一张丑恶的嘴脸时,却不知那正是自己面具中的一副;
  第七次,它侧身于生活的污泥中,虽不甘心,却又畏首畏尾。
时间仓促,如有错误欢迎指出,欢迎在评论区讨论,如对您有帮助还请点个推荐、关注支持一下
作者:博客园 - 角刀牛
出处:https://www.cnblogs.com/jiaodaoniujava/
该文章来源互联网,本博仅以学习为目的,版权归原作者所有。
若内容有侵犯您权益的地方,请公告栏处联系本人,本人定积极配合处理解决。