Linux的dd指令 |
您所在的位置:网站首页 › 伪指令dd的含义 › Linux的dd指令 |
当我们碰到数据库响应慢的时候,除了数据库自己的问题,磁盘读写可能是其中一个值得怀疑的因素,此时就可以用dd来测试磁盘的读写速度。 Linux的dd指令,可以用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。 man的说明,言简意赅, dd - convert and copy a file dd的参数说明, if=file 输入文件名,缺省为标准输入。 of=file 输出文件名,缺省为标准输出。 ibs=bytes 一次读入 bytes 个字节(即一个块大小为 bytes 个字节)。 obs=bytes 一次写 bytes 个字节(即一个块大小为 bytes 个字节)。 bs=bytes 同时设置读写块的大小为 bytes ,可代替 ibs 和 obs 。 cbs=bytes 一次转换 bytes 个字节,即转换缓冲区大小。 skip=blocks 从输入文件开头跳过 blocks 个块后再开始复制。 seek=blocks 从输出文件开头跳过 blocks 个块后再开始复制。(通常只有当输出文件是磁盘或磁带时才有效)。 count=blocks 仅拷贝 blocks 个块,块大小等于 ibs 指定的字节数。 conv=conversion[,conversion…] 用指定的参数转换文件。 iflag=FLAGS 指定读的方式FLAGS,参见“FLAGS参数说明” oflag=FLAGS 指定写的方式FLAGS,参见“FLAGS参数说明” 其中conv参数,可转换的值如下, ascii 转换 EBCDIC 为 ASCII。 ebcdic 转换 ASCII 为 EBCDIC。 ibm 转换 ASCII 为 alternate EBCDIC。 block 把每一行转换为长度为 cbs 的记录,不足部分用空格填充。 unblock 使每一行的长度都为 cbs ,不足部分用空格填充。 lcase 把大写字符转换为小写字符。 ucase把小写字符转换为大写字符。 swab 交换输入的每对字节。 noerror出错时不停止。 notrunc不截短输出文件。 sync 把每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。 FLAGS参数说明, append -append mode (makes sense only for output; conv=notrunc sug-gested) direct 读写数据采用直接IO方式。 directory 读写失败除非是directory。 dsync 读写数据采用同步IO。 sync 同上,但是针对是元数据。 fullblock 堆积满block(accumulate full blocks of input)(iflag only)。 nonblock 读写数据采用非阻塞IO方式。 noatime 读写数据不更新访问时间。 一看这些参数,有点懵了,直接来点儿硬菜,为了测试磁盘的写能力,可以执行这个,因为/dev/zero是一个伪设备,他只产生空字符流,对他不会产生IO,所以,IO都会集中在of文件中,of文件只用于写,所以这个命令相当于测试磁盘的写能力,写入100000个4k数据块, [root@bisal opt]# time dd if=/dev/zero of=/opt/testrw.dbf bs=4k count=100000 100000+0 records in 100000+0 records out 409600000 bytes (410 MB) copied, 1.92835 s, 212 MB/s real 0m1.929s user 0m0.000s sys 0m1.444sP.S. count是指读多少个bs,可以直接写count=16G,规避文件系统cache,直接读写,不直接使用buffer cache。 如果要测试磁盘读的能力,可执行这个,因为/dev/sda1是一个物理分区,对他的读取会产生IO,/dev/null是伪设备,相当于黑洞,of到该设备不会产生IO,所以,这个命令的IO只发生在/dev/sda1,相当于测试磁盘的读能力, [root@bisal ~]# time dd if=/dev/sda1 of=/dev/null bs=4k ^C140287+0 records in 140286+0 records out 574611456 bytes (575 MB) copied, 12.62 s, 45.5 MB/s real 0m12.621s user 0m0.037s sys 0m12.340s如果要同时测试读写,一个是物理分区,一个是实际的文件,对他们的读写都会产生IO(对/dev/sda1是读,对/opt/testrw.dbf是写,会实际生成文件,因此要确认磁盘空间充足),假设他们都在一个磁盘中,这个命令就相当于测试磁盘的同时读写能力, [root@bisal opt]# time dd if=/dev/sda1 of=/opt/testrw.dbf bs=4k ^C56537+0 records in 56537+0 records out 231575552 bytes (232 MB) copied, 3.891 s, 59.5 MB/s real 0m3.892s user 0m0.000s sys 0m2.522s另外,注意一下,dd只能提供一个大概的测试结果,而且是连续I/O而不是随机I/O,理论上文件规模越大,测试结果越准确。同时,iflag/oflag提供direct模式,direct模式是把写入请求直接封装成I/O指令发到磁盘,非direct模式只是把数据写入到系统缓存就认为I/O成功,并由操作系统决定缓存中的数据什么时候被写入磁盘。 带缓存的读写, 每次清缓存的读写, 不用缓存,直接的读写, 如上提到的/dev/null和/dev/zero,还是有点儿区别,我们经常在脚本中或者crontab定义中使用到/dev/null。 /dev/null,外号叫无底洞,你可以向他输出任何数据,他通吃,并且不会撑着。他是空设备,也称为位桶(bit bucket)。任何写入他的输出都会被抛弃。如果不想让消息以标准输出显示或写入文件,那么可以将消息重定向到位桶。 /dev/zero,是一个输入设备,你可用他来初始化文件。该设备无穷尽地提供0,可以使用任何你需要的数目,他可以用于向设备或文件写入字符串0。主要的用处是用来创建一个指定长度用于初始化的空文件,就像临时交换文件。 例如,禁止标准输出, cat $filename >/dev/null #文件内容丢失,而不会输出到标准输出.禁止标准错误, rm $filename 2>/dev/null #这样错误信息[标准错误]就被丢了禁止标准输出和标准错误的输出, cat $filename 2>/dev/null >/dev/null |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |