「Storage」- 通过 dd 命令,存储性能测试(废弃)

  CREATED BY JENKINSBOT

问题描述

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

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

该笔记将记录:我们使用 dd 命令进行磁盘进行性能测试的过程,以及相关问题的解决办法;

解决方案

# 12/05/2022

在很多存储相关的性能测试文章或讨论中,其建议不要通过 dd 来测试磁盘性能:
1)dd 的 IO 队列深度浅,不一定能够模拟足够的 IO 负载来精准测试磁盘性能;
2)用于产生数据的特殊设备(/dev/urandom, /dev/random, /dev/zero)也不一定能够快速产生足够数据。

针对存储相关的性能测试建议:
1)通过专用的测试工具(如 fio/blktrace 等)性能测试工具来测试磁盘性能;
2)要具备相关的知识背景,并能够正确理解参数含义,而非对相关知识模糊懵懂;

在编写这篇笔记时,我们并不具备存储相关的知识,所幸该文章也并未完成。鉴于我们已经了解到 dd 在性能测试方面的局限性,先如今我们也不打算进一步完善该笔记。

环境信息

笔记本环境

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

所用工具

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

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

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

操作系统缓存的影响

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

简单进行性能测试,可以直接使用 dd(1) 命令:

# 在开始进行测试之前,需要先丢弃缓存:
# 该命令清空 pagecache, dentries, inodes 缓存;
echo 3 | sudo tee /proc/sys/vm/drop_caches && sudo sync

测试数据来源

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

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

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

附加说明

当使用if=/dev/zero和bs=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

# 分别进行了十次测试,且启用系统读取和写入缓存(MB/s),结果如下:
# 固态:424 421 412 422 213 128 270 173 426 342
# 机械:84.1 82.1 81.5 79.4 80.2 81.3 81.9 78.9 81.7 84.8

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

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

# 分别进行了十次测试,且关闭系统读取和写入缓存(MB/s),结果如下:
# 固态:110 48.5 149 62.8 63.0 114 94.3 147 66.4 98.4
# 机械:75.0 79.3 77.6 84.1 76.9 80.0 80.3 78.7 76.2 80.2

写入延迟

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

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

# 启动系统缓存,分别进行十次测试,结果如下:
# 固态(MB/s):13.8 13.2 14.1 13.6 13.4 14.0 13.1 12.3 14.5 14.0
# 机械(kB/s):751 745 671 658 745 658 678 693 749 681

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

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

# 关闭系统缓存(kB/s),分别进行十次测试,结果如下:
# 固态:261 280 268 281 282 279 272 279 267 281
# 机械:57.3 52.3 57.7 54.7 52.4 60.2 57.3 60.2 59.9 58.2

测试:读取

直接读取

WIP 磁盘读取测试

读取延迟

WIP 磁盘读取延迟内容

测试结果总结

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

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

参考文献

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