「Linux」- 使用dd(1)测试磁盘IO性能

  CREATED BY JENKINSBOT

内容简介

本文将介绍如何使用dd(1)命令进行磁盘性能测试。

问题背景

由于启动的应用程序较多,内存已经用完,并且交换分区已使用4G空间。而交换分区位于机械硬盘中,当交换分区中的程序被换入内存时,程序加载速度非常慢(也是推测)。

所以,想换到固态分区上试一下,会不会快一些呢?由此,想简单的先测试以下固态硬盘和机械硬盘的读取和写入速度。

硬件信息

设备: ThinkPad T540p
硬盘: 一块固态(256G),一块机械(500G)
内存: 16G(主板最大支持16G)
交换: 交换分区8G,位于机械硬盘上的一个分区。

所用工具

在Linux下,命令dd(1)可用于简单的顺序I/O性能测试。本文提供了”关于应该使用哪些参数的”有价值信息。

本文只介绍了使用dd(1)命令进行“简单的顺序I/O性能测试”。

命令dd可用于简化低层数据复制。在这样做时,通常可以直接访问设备文件。请注意,绝对建议在测试系统上执行下述步骤。错误使用dd会很快导致数据丢失。

其他的附加说明

操作系统缓存的影响

操作系统通常不会立即将文件写入硬盘,而是使用当前未使用的临时内存来进行写入和读取的缓存。因此,为了I/O性能测量不会受这些高速缓存的影响,可以使用dd(1)的oflag选项,该选项以下标志很有趣:

	* direct
	* dsync
	* sync

有关内容参考dd(1)手册中的说明。

测试数据来源

为了测量写入性能,应该从/dev/zero读取要写入的数据。

理想情况下,应将其写入空的硬盘或分区(例如,对于第一个硬盘使用of=/dev/sda,或者第一个硬盘上的第二个分区则使用of=/dev/sda2)。如果无法做到这一点,可以写入文件系统中的普通文件(例如,使用of=/root/testfile)。出于安全原因,我们在以下示例中使用测试文件(即of=/root/testfile)。

由此实现的写入性能将稍慢(因为元数据也将被写入文件系统)。

附加说明

当使用if=/dev/zerobs=1G时,在Linux中将需要1GB的可用RAM空间。如果的测试系统没有足够的可用RAM,请为bs使用较小的参数(例如512MB)。(我默默的关闭了Eclipse,然后我的内存就富余出1G的空间)

为了使结果更接近现实生活,我们建议多次执行所述测试(例如,3-10次)。 通过这样做,可以快速甄别出异常值。 异常值可能包含cron作业,中断、并行处理产生的一般情况,这些都可以短暂地影响性能。一个极端例子是由cron作业并行执行updatedb命令。

测试:写入

直接写入

首先,启用系统缓存(hdparm -W1 /dev/sda),使用1G数据进行写入测试:

	# dd if=/dev/zero of=/root/testfile bs=1G count=1 oflag=direct

然后,关闭系统缓存(hdparm -W0 /dev/sda),使用1G数据进行写入测试:

	# dd if=/dev/zero of=/root/testfile bs=1G count=1 oflag=direct

分别进行了十次测试。

写入延迟

首先,启用系统缓存(hdparm -W1 /dev/sda),写入512个字节一千次:

	# dd if=/dev/zero of=/root/testfile bs=512 count=1000 oflag=direct

然后,关闭系统缓存(hdparm -W1 /dev/sda),写入512个字节一千次:

	# dd if=/dev/zero of=/root/testfile bs=512 count=1000 oflag=direct

分别进行十次测试。

测试:读取

直接读取

TODO 磁盘读取测试

读取延迟

TODO 磁盘读取延迟内容

笔记本测试结果

笔记本环境

机械硬盘:/dev/sda,其中挂载文件系统“/root”目录。因此使用/testfile测试机械硬盘。
固态硬盘:/dev/sdb,其中挂载文件系统“/”目录。使用/root/testfile测试固态硬盘。

固态硬盘

直接写入测试:

	* 启用系统读取和写入缓存(MB/s):424 421 412 422 213 128 270 173 426 342
	* 关闭系统读取和写入缓存(MB/s):110 48.5 149 62.8 63.0 114 94.3 147 66.4 98.4

写入延迟测试:

	* 启动系统缓存(MB/s):13.8 13.2 14.1 13.6 13.4 14.0 13.1 12.3 14.5 14.0
	* 关闭系统缓存(kB/s):261 280 268 281 282 279 272 279 267 281

TODO 直接读取测试:

TODO 读取延迟测试:

机械硬盘

写入测试:

	* 启用系统缓存(MB/s):84.1 82.1 81.5 79.4 80.2 81.3 81.9 78.9 81.7 84.8
	* 关闭系统缓存(MB/s):75.0 79.3 77.6 84.1 76.9 80.0 80.3 78.7 76.2 80.2

延迟测试:

	* 启动系统缓存(kB/s):751 745 671 658 745 658 678 693 749 681
	* 关闭系统缓存(kB/s):57.3 52.3 57.7 54.7 52.4 60.2 57.3 60.2 59.9 58.2

TODO 直接读取测试:

TODO 读取延迟测试:

总结

写的再多也是一份非常简单的测试。标准是什么?指标又是什么?

如果SWAP换出的瓶颈是磁盘IO速度导致的,那更换为固态硬盘一定可以有所改善,但是又如何证明是磁盘IO速度导致的呢?

参考文献

理解Latency和Throughput
如何解决io瓶颈的原理分析?
Wikipedia/Outlier
Operating System Cache