日期:2014-05-16  浏览次数:20823 次

Linux time命令、dd命令、测试硬盘读写速度、磁盘备份恢复
time命令常用于测量一个命令的运行时间,注意不是用来显示和修改系统时间的(这是date命令干的事情)。它不仅仅是测量运行时间,还可以测量内存、I/O等的使用情况。一个程序在运行时使用的系统资源通常包括CPU、Memory和I/O等,其中CPU资源的统计包括实际使用时间(real time)、用户态使用时间(the process spent in user mode)、内核态使用时间(the process spent in kernel mode)。但是简单的使用time命令并不能得到内存和I/O的统计数据
命令格式:
time <command> [<arguments...>]

例子:time find . -name "mysql.sh"
在命令执行完成之后就会打印出CPU的使用情况:
real    0m14.837s <== 实际使用时间(real time)
user    0m0.030s  <== 用户态使用时间(the process spent in user mode)
sys     0m0.120s  <== 内核态使用时间(the process spent in kernel mode)
注1:real远大于user加上sys,因为find需要遍历各个目录,需要大量的I/O操作,而磁盘I/O通常是最慢的环节,因此大部分时间find进程都在等待磁盘I/O完成。
注2:使用-p参数时,就直接打印所需时间的数值,单位为秒,而不是更友好的格式,包括分钟、秒钟的显示方式。

Linux系统中time命令其实不止一个:
执行type -a time命令
time is a shell keyword
time is /usr/bin/time
通过这条命令我们可以发现我们常用的time其实是一个Shell关键字,还有一个外部命令/usr/bin/time(外部命令功能更强大)

例子:使用外部time命令输出内存、IO等更加多的信息 /usr/bin/time -v find . -name "mysql.sh"

time命令输出信息的重定向:time命令的输出信息是打印在标准错误输出上的
方法1: 将time命令和将要执行的命令行放到一个shell代码块中,也就是一对大括号。如下,注意分隔符、空格的使用。
{ time command-line; } 2>file
方法2: 使用子Shell的方式。如下,这里time紧贴着小括号(也可以的,命令行结束也不必带分号。当然最好还是用第一种方式,毕竟启动一个子shell是要多占些资源的。
(time command-line) 2>file

dd命令:Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换
dd 的主要选项:
  • if=file: 输入文件名,缺省为标准输入。
  • of=file: 输出文件名,缺省为标准输出。
  • count=blocks: 仅拷贝 blocks 个块,块大小等于 ibs 指定的字节数。
  • bs=bytes: 同时设置读写块的大小为 bytes ,可代替 ibs 和 obs 。
  • ibs=bytes: 一次读入 bytes 个字节(即一个块大小为 bytes 个字节)。
  • obs=bytes: 一次写 bytes 个字节(即一个块大小为 bytes 个字节)。
  • cbs=bytes: 一次转换 bytes 个字节,即转换缓冲区大小。
  • skip=blocks: 从输入文件开头跳过 blocks 个块后再开始复制。
  • seek=blocks: 从输出文件开头跳过 blocks 个块后再开始复制。(通常只有当输出文件是磁盘或磁带时才有效)。
  • conv=conversion[,conversion...]: 用指定的参数转换文件。
  • conv = ASCII 把EBCDIC码转换为ASCII码。
  • conv = ebcdic 把ASCII码转换为EBCDIC码。
  • conv = ibm 把ASCII码转换为alternate EBCDIC码。
  • conv = blick 把变动位转换成固定字符。
  • conv = ublock 把固定们转换成变动位
  • conv = ucase 把字母由小写变为大写。
  • conv = lcase 把字母由大写变为小写。
  • conv = notrunc 不截短输出文件。
  • conv = swab 交换每一对输入字节。
  • conv = noerror 出错时不停止处理。
  • conv = sync 把每个输入记录的大小都调到ibs的大小(用ibs填充)。


结合time、dd命令测试硬盘读写速度:
  • /dev/null:是一个伪设备,相当于回收站,of到该设备不会产生IO
  • /dev/zero:是一个伪设备,它只产生空字符流,对它不会产生IO
  • 测试磁盘写能力:time dd if=/dev/zero of=test.dbf bs=8k count=300000
  • 测试磁盘读能力:time dd if=/dev/sda1 of=/dev/null bs=8k
  • 测试同时读写能力:time dd if=/dev/sda1 of=test1.dbf bs=8k

磁盘备份恢复:
  • 将本地的/dev/hdx整盘备份到/dev/hdy :dd if=/dev/hdx of=/dev/hdy
  • 将/dev/hdx全盘数据备份到指定路径的image文件:dd if=/dev/hdx of=/path/to/image
  • 备份/dev/hdx全盘数据,并利用gzip工具进行压缩,保存到指定路径:dd if=/dev/hdx | gzip >/path/to/image.gz
  • 将备份文件恢复到指定盘:dd if=/path/to/image of=/dev/hdx
  • 将压缩的备份文件恢复到指定盘 :gzip -dc /path/to/image.gz | dd of=/dev/hdx

参考:linux time 命令详解