Linux和Unix使用dd命令测试磁盘I/O性能

时间:2020-01-09 10:40:30  来源:igfitidea点击:

如何在Linux上使用dd命令来测试硬盘驱动器的I/O性能?
如何检查硬盘性能,包括Linux操作系统上的读写速度?
在Linux I/O性能测试下如何使用dd命令?
您可以在Linux或类似Unix的系统上使用以下命令进行"简单的顺序I/O性能测试":

  • dd命令:用于监视Linux和类Unix系统上磁盘设备的写入性能。
  • hdparm命令:它用于获取/设置硬盘参数,包括测试基于Linux的系统上磁盘设备的读取和缓存性能。

在本教程中,您将学习如何使用dd命令测试磁盘I/O性能。

使用dd命令来监视磁盘设备的读写性能:

  • 打开一个shell提示符。
  • 或通过ssh登录到远程服务器。
  • 使用dd命令来测量"服务器吞吐量"(写入速度)。dd if=/dev/zero of=/tmp/test1.img bs=1G count=1 oflag=dsync
  • 使用dd命令测量server delay``dd if =/dev/zero of =/tmp/test2.img bs = 512 count = 1000 oflag = dsync

dd命令有助于找出"简单的顺序I/O性能"。

了解dd命令选项

在此示例中,Im使用在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 syntax ##
##########################################################
##***[Adjust bs and count as per your needs and setup]**##
##########################################################
dd if=/dev/zero of=/tmp/test1.img bs=1G count=1 oflag=dsync
dd if=/dev/zero of=/tmp/test2.img bs=64M count=1 oflag=dsync
dd if=/dev/zero of=/tmp/test3.img bs=1M count=256 conv=fdatasync
dd if=/dev/zero of=/tmp/test4.img bs=8k count=10k
dd if=/dev/zero of=/tmp/test4.img bs=512 count=1000 oflag=dsync
## OR alternate syntax for GNU/dd ##
dd if=/dev/zero of=/tmp/testALT.img bs=1G count=1 conv=fdatasync

请注意,该测试写入了1 GB的数据,该测试的服务器吞吐量为135 MB/s。
其中:

  • if =/dev/zero(if =/dev/input.file):要从中读取数据的输入文件的名称。
  • of=/tmp/test1.img(of=/path/to/output.file):要dd将input.file写入的输出文件的名称。
  • bs=1G(bs=block-size) :设置要让dd使用的块的大小。 1 GB用于测试。请注意,Linux将需要1GB的可用空间。如果您的测试系统没有足够的RAM,请为bs使用较小的参数(例如128MB或64MB等)。
  • count = 1(count = block-of-blocks):您想让dd读取的块数。
  • oflag=dsync(oflag=dsync):对数据使用同步的I/O。不要跳过此选项。该选项消除了缓存,并为您提供了良好而准确的结果
  • conv = fdatasyn:同样,它告诉dd在退出之前要求一次完整的同步。这个选项等同于oflag = dsync

查找服务器等待时间

在此示例中,一千次写入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

请注意,服务器的吞吐量和延迟时间也取决于服务器/应用程序的负载。
因此,我建议您在新重启的服务器上以及高峰时间运行这些测试,以更好地了解您的工作负载。
现在,您可以将这些数字与所有设备进行比较。

但是,为什么服务器的吞吐量和延迟时间如此之低?

较低的值并不表示您使用的是慢速硬件。
由于HARDWARE RAID10控制器缓存,该值可能较低。

使用hdparm命令查看缓冲和缓存的磁盘读取速度

我建议您运行2或3次以下命令,以执行设备读取的计时,以进行基准测试和比较:

### Buffered disk read test for /dev/sda ##
hdparm -t /dev/sda1
## 或者
hdparm -t /dev/sda

要为基准和比较目的执行高速缓存读取的计时,请再次运行2-3次以下命令(注意-T选项):

## Cache read benchmark for /dev/sda ###
hdparm -T /dev/sda1
## 或者
hdparm -T /dev/sda

或结合两个测试:

hdparm -Tt /dev/sda

Linux hdparm命令测试读取和缓存磁盘性能

再次注意,由于文件系统在文件操作上进行缓存,因此您总是会看到很高的读取率。

在Linux上使用dd命令测试读取速度

为了获得准确的读取测试数据,请在运行测试之前先丢弃高速缓存,然后运行以下命令:

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

Linux笔记本电脑示例

运行以下命令:

### Debian Laptop Throughput With Cache ##
dd if=/dev/zero of=/tmp/laptop.bin bs=1G count=1 oflag=direct
 
### Deactivate the cache ###
hdparm -W0 /dev/sda
 
### Debian Laptop Throughput Without Cache ##
dd if=/dev/zero of=/tmp/laptop.bin bs=1G count=1 oflag=direct

Apple OS X Unix(Macbook pro)示例

GNU dd有更多选项,但是OS X/BSD和类Unix dd命令需要按以下方式运行以测试实际磁盘I/O,而不是如下所示的memory add sync选项:

## Run command 2-3 times to get good results ###
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