普京网址 10

你将会学到如何使用dd命令来测试硬盘性能,普京网址:可以用来测试纯读速度.bs是每次读或写的大小

如何使用dd命令测试我的硬盘性能?如何在linux操作系统下检测硬盘的读写速度?

dd命令:做硬盘IO性能测试

一、dd复制转换

1.dd:convert and copy a file 文件转换和复制,复制操作底层(块)

DESCRIPTION:Copy a file, converting and formatting according to the
operands.

2.用法:dd  [OPTION] if=/PATH/FROM/SRC  of=/PATH/TO/DEST

if= :其后面路径是源目标路径

of= :其后是将要复制到的位置,目标路径

[OPTION]

bs=#:block size, 复制单元大小,一次复制多大,默认单位为字节;

count=#:复制多少个bs;

3.磁盘拷贝:dd  if=/dev/sda  of=/dev/sdb

4.MBR备份和损坏

备份MBR:dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1

破坏MBR分区表:dd if=/dev/zero of=/dev/sda bs=512 count=1

破坏MBR中的bootloader:dd if=/dev/zero of=/dev/sda bs=256 count=1

前446字节是bootloader所占空间大小,故损坏部分就会导致整个损坏

5.两个特殊设备:/dev/zero 、/dev/null

/dev/zero:吐零,该设备无穷尽地提供0,(不产生读磁盘IO)

/dev/null: 数据黑洞;类似于回收站

二、dd硬盘IO性能测试

几种常见的DD命令:区别在于内存中写缓存的处理方式

dd bs=128k count=10k if=/dev/zero of=test

dd bs=128k count=10k if=/dev/zero of=test; sync

dd bs=128k count=10k if=/dev/zero of=test conv=fdatasync

dd bs=128k count=10k if=/dev/zero of=test oflag=dsync

wKioL1Z1KgGDda7VAABTcGLbp9w514.png

1.dd bs=128k count=10k if=/dev/zero of=test

(1)dd默认方式不包括“同步(sync)”命令,dd命令完成前并没有让系统真正把文件写到磁盘上。

(2)单纯地把数据读到内存缓冲当中(写缓存[write cache])

(3)展现的只是读取速度,直到dd完成后系统才开始真正往磁盘上写数据

实际运行结果:

普京网址 1

2.dd bs=128k count=10k if=/dev/zero of=test; sync

(1)同上分号隔开的只是先后两个独立的命令

(2)dd命令已经把“写入速度”值显示在屏幕上了,得不到真正的写入速度。

实际运行结果:

普京网址 2

3.dd bs=128k count=10k if=/dev/zero of=test conv=fdatasync

(1)dd命令执行到最后会真正执行一次“同步(sync)”操作

(2)得到的是读取这128M数据到内存并写入到磁盘上所需的时间

(3)比较符合实际情况

实际运行结果:

普京网址 3

4.dd bs=128k count=10k if=/dev/zero of=test oflag=dsync

(1)dd在执行时每次都会进行同步写入操作

(2)每次读取128k后就要先把这128k写入磁盘,然后再读取下面128k

(3)最慢的一种方式了,基本上没有用到写缓存(write cache)

实际运行结果:

普京网址 4

第四种方法是最严格的,可以模拟数据库的插入操作,所以很慢。

也用来测试vps硬盘性能标准,一般来说测试结果,如果超过10M,对正常建站就无影响,超过50M,就是非常好状态。

另外,测试对硬盘有损害。

本文永久更新链接地址:

一、dd复制转换
1.dd:convert and copy a file 文件转换和复制,复制操作底层(块)
DESCRIPTION:Copy a file, converting and for…

  time有计时作用,dd用于复制,从if读出,写到of.if=/dev/zero不产生IO,因此可以用来测试纯写速度.同理of=/dev/null不产生IO,可以用来测试纯读速度.bs是每次读或写的大小,即一个块的大小,count是读写块的数量.

你可以使用以下命令在一个Linux或类Unix操作系统上进行简单的I/O性能测试。

  1.测/目录所在磁盘的纯写速度:

  • dd命令
    :它被用来在Linux和类Unix系统下对硬盘设备进行写性能的检测。
  • hparm命令:它用来在基于 Linux
    的系统上获取或设置硬盘参数,包括测试读性能以及缓存性能等。

  [root@www.linuxidc.com /]# time dd if=/dev/zero bs=1024
count=1000000 of=/1Gb.file

在这篇指南中,你将会学到如何使用dd命令来测试硬盘性能。

  2.测/目录所在磁盘的纯读速度:

普京网址 5

  dd if=/kvm/ftp/other/1Gb.file bs=64k |dd of=/dev/null

使用dd命令来监控硬盘的读写性能:

  • 打开shell终端。
  • 或者通过ssh登录到远程服务器。
  • 使用dd命令来测量服务器的吞吐率(写速度) dd if=/dev/zero
    of=/tmp/test1.img bs=1G count=1 oflag=dsync
  • 使用dd命令测量服务器延迟 dd if=/dev/zero of=/tmp/test2.img bs=512
    count=1000 oflag=dsync

  3.测读写速度(这是什么):

理解dd命令的选项

在这个例子当中,我将使用搭载Ubuntu Linux 14.04 LTS系统的RAID-10(配有SAS
SSD的Adaptec 5405Z)服务器阵列来运行。基本语法为:

dd if=/dev/input.file  of=/path/to/output.file  bs=block-size  count=number-of-blocks  oflag=dsync
## GNU dd语法 ##
dd if=/dev/zero of=/tmp/test1.img bs=1G count=1 oflag=dsync
##另外一种GNU dd的语法 ##
dd if=/dev/zero of=/tmp/testALT.img bs=1G count=1 conv=fdatasync

输出样例:

普京网址 6

图01: 使用dd命令获取的服务器吞吐率

请各位注意在这个实验中,我们写入一个G的数据,可以发现,服务器的吞吐率是135
MB/s,这其中

  • if=/dev/zero (if=/dev/input.file) :用来设置dd命令读取的输入文件名。
  • of=/tmp/test1.img
    (of=/path/to/output.file):dd命令将input.file写入的输出文件的名字。
  • bs=1G (bs=block-size) :设置dd命令读取的块的大小。例子中为1个G。
  • count=1 (count=number-of-blocks):dd命令读取的块的个数。
  • oflag=dsync (oflag=dsync)
    :使用同步I/O。不要省略这个选项。这个选项能够帮助你去除caching的影响,以便呈现给你精准的结果。
  • conv=fdatasyn: 这个选项和oflag=dsync含义一样。

在下面这个例子中,一共写了1000次,每次写入512字节来获得RAID10服务器的延迟时间:

dd if=/dev/zero of=/tmp/test2.img bs=512 count=1000 oflag=dsync

输出样例:

1000+0 records in
1000+0 records out
512000 bytes (512 kB) copied, 0.60362 s, 848 kB/s

请注意服务器的吞吐率以及延迟时间也取决于服务器/应用的负载。所以我推荐你在一个刚刚重启过并且处于峰值时间的服务器上来运行测试,以便得到更加准确的度量。现在你可以在你的所有设备上互相比较这些测试结果了。

  dd if=/vat/test of=/oradata/test1 bs=64k

为什么服务器的吞吐率和延迟时间都这么差?

低的数值并不意味着你在使用差劲的硬件。可能是硬件
RAID10的控制器缓存导致的。

使用hdparm命令来查看硬盘缓存的读速度。

我建议你运行下面的命令2-3次来对设备读性能进行检测,以作为参照和相互比较:

### 有缓存的硬盘读性能测试——/dev/sda ###
hdparm -t /dev/sda1
## 或者 ##
hdparm -t /dev/sda

然后运行下面这个命令2-3次来对缓存的读性能进行对照性检测:

## Cache读基准——/dev/sda ###
hdparm -T /dev/sda1
## 或者 ##
hdparm -T /dev/sda

或者干脆把两个测试结合起来:

hdparm -Tt /dev/sda

输出样例:

普京网址 7

图02: 检测硬盘读入以及缓存性能的Linux hdparm命令

请再次注意,由于文件文件操作的缓存属性,你将总是会看到很高的读速度。

  理论上复制量越大测试越准确.

使用dd命令来测试读取速度

为了获得精确的读测试数据,首先在测试前运行下列命令,来将缓存设置为无效:

flush
echo 3 | sudo tee /proc/sys/vm/drop_caches
time time dd if=/path/to/bigfile of=/dev/null bs=8k

dd 是 Linux/UNIX
下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。

笔记本上的示例

运行下列命令:

### 带有Cache的Debian系统笔记本吞吐率###
dd if=/dev/zero of=/tmp/laptop.bin bs=1G count=1 oflag=direct

###使cache失效###
hdparm -W0 /dev/sda

###没有Cache的Debian系统笔记本吞吐率###
dd if=/dev/zero of=/tmp/laptop.bin bs=1G count=1 oflag=direct

dd 命令通用语法格式如下:

苹果OS X Unix(Macbook pro)的例子

GNU dd has many more options but OS X/BSD and Unix-like dd command need
to run as follows to test real disk I/O and not memory add sync option
as follows:

GNU dd命令有其他许多选项,但是在 OS X/BSD 以及类Unix中,
dd命令需要像下面那样执行来检测去除掉内存地址同步的硬盘真实I/O性能:

## 运行这个命令2-3次来获得更好地结果 ###
time sh -c "dd if=/dev/zero of=/tmp/testfile bs=100k count=1k && sync"

输出样例:

1024+0 records in
1024+0 records out
104857600 bytes transferred in 0.165040 secs (635346520 bytes/sec)

real    0m0.241s
user    0m0.004s
sys 0m0.113s

本人Macbook Pro的写速度是635346520字节(635.347MB/s)。

dd if=path/to/input_file of=/path/to/output_file bs=block_size
count=number_of_blocks

不喜欢用命令行?

你可以在Linux或基于Unix的系统上使用disk
utility(gnome-disk-utility)这款工具来得到同样的信息。下面的那个图就是在我的Fedora
Linux v22 VM上截取的。

命令简介

图形化方法

点击“Activites”或者“Super”按键来在桌面和Activites视图间切换。输入“Disks”

普京网址 8

图03: 打开Gnome硬盘工具

在左边的面板上选择你的硬盘,点击configure按钮,然后点击“Benchmark
partition”:

普京网址 9

图04: 评测硬盘/分区

最后,点击“Start Benchmark…”按钮(你可能需要输入管理员用户名和密码):

普京网址 10

图05: 最终的评测结果

如果你要问,我推荐使用哪种命令和方法?

  • 我推荐在所有的类Unix系统上使用dd命令(time sh -c “dd if=/dev/zero
    of=/tmp/testfile bs=100k count=1k && sync)
  • 如果你在使用GNU/Linux,使用dd命令 (dd if=/dev/zero
    of=/tmp/testALT.img bs=1G count=1 conv=fdatasync)
  • 确保你每次使用时,都调整了count以及bs参数以获得更好的结果。
  • GUI方法只适合桌面系统为Gnome2或Gnome3的Linux/Unix笔记本用户。

主要选项(指定数字的地方若以下列字符结尾乘以相应的数字: b=512, c=1,
k=1024, w=2, xm=number m):

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                读写数据不更新访问时间

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章