Linux 和 Unix 使用 dd 命令测试磁盘 I/O 性能
您可以在 Linux 或类 Unix 系统上使用以下命令进行简单的顺序I/O 性能测试:
教程详细信息 | |
---|---|
难度等级 | 中间的 |
Root 权限 | 是的 |
要求 | Linux 或 Unix 终端 |
类别 | 磁盘管理 |
操作系统兼容性 | AIX • Alma • Alpine • Amazon Linux • Arch • BSD • CentOS • Debian • Fedora • FreeBSD • HP-UX • Linux • macOS • Mint • NetBSD • OpenBSD • openSUSE • Pop!_OS • RHEL • Rocky • Stream • SUSE • Ubuntu • Unix • WSL |
预计阅读时间 | 7 分钟 |
- dd命令:用于在Linux和类Unix系统上监视磁盘设备的写入性能。
- hdparm 命令:用于获取/设置硬盘参数,包括在基于 Linux 的系统上测试磁盘设备的读取和缓存性能。
在本教程中,您将学习如何使用 dd 命令来测试磁盘 I/O 性能。
注意:使用 dd 命令时,请谨慎使用设备名称。错误的 SSD 或硬盘驱动器设备名称可能会抹去您的数据。示例或作者对任何数据丢失概不负责。请始终保留经过验证的备份。
使用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
- 使用 rm 命令删除或移除为测试创建的临时文件:
# rm -v -i /tmp/test1.img
dd 命令对于找出简单的顺序 I/O 性能很有用。
了解 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 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
示例输出:
- if=/dev/zero(if=/dev/input.file):您想要读取的输入文件的名称。
- of=/tmp/test1.img(of=/path/to/output.file):您希望将输入文件写入的输出文件的名称。
- bs=1G( bs=block-size) :设置您希望 dd 使用的块大小。为测试写入了 1 GB。请注意,Linux 需要 1GB 的 RAM 可用空间。如果您的测试系统没有足够的 RAM,请使用较小的 bs 参数(例如 128MB 或 64MB 等)。
- count=1( count=number-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
请注意,服务器吞吐量和延迟时间也取决于服务器/应用程序负载。因此,我建议您在新重启的服务器上以及高峰时间运行这些测试,以更好地了解您的工作负载。您现在可以将这些数字与您的所有设备进行比较。
但为什么服务器吞吐量和延迟时间这么低?
值低并不意味着您正在使用较慢的硬件。值可能较低是因为硬件 RAID10 控制器的缓存。
使用 hdparm 命令查看缓冲和缓存的磁盘读取速度
我建议您运行以下命令 2 到 3 次,执行设备读取计时以进行基准测试和比较:
### Buffered disk read test for /dev/sda ## hdparm -t /dev/sda1 ## OR ## hdparm -t /dev/sda
为了再次执行基准测试和比较目的的缓存读取计时,请运行以下命令 2-3 次(注意选项-T):
## Cache read benchmark for /dev/sda ### hdparm -T /dev/sda1 ## OR ## hdparm -T /dev/sda
或者结合两个测试:
hdparm -Tt /dev/sda
示例输出:
在 Linux 上使用 dd 命令测试读取速度
为了获得准确的读取测试数据,请首先通过运行以下命令在测试前丢弃缓存:
# flush buffers or disk caches # echo 3 | sudo tee /proc/sys/vm/drop_caches time dd if=/path/to/bigfile of=/dev/null bs=8k
- echo 3 | sudo tee /proc/sys/vm/drop_caches:删除 Linux 内核的页面缓存、dentry 和 inode。
- 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 macOS/OS X Unix(Macbook pro)示例
GNU dd 有更多选项,但 OS X/BSD 和类 Unix dd 命令需要按如下方式运行来测试真实磁盘 I/O,而不是内存添加同步选项:
## 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
因此我的 MBP 上的写入速度为 635346520 字节(635.347 MB/s)。
不喜欢命令行工具……?
您可以在基于 Linux 或 Unix 的系统上使用磁盘实用程序 (gnome-disk-utility) 来获取相同的信息。以下屏幕截图取自我的 Fedora Linux v22 VM 和 Ubuntu 20.04 桌面:
图解法
点击“活动”或按“Super”键在活动概览和桌面之间切换。输入“磁盘”
图03:启动Gnome磁盘实用程序
图 4:基准磁盘/分区
图 05:最终基准测试结果
在 Ubuntu 20.04 LTS 下运行磁盘工具:
- 首先,从活动概览中打开磁盘。
- 接下来从左侧窗格的列表中选择磁盘。
- 选择菜单按钮,然后从菜单中选择基准磁盘...。
- 单击“开始基准测试...”并根据需要调整传输速率和访问时间参数。
- 最后单击“开始基准测试”以测试从磁盘读取数据的速度。可能需要管理员权限。输入您的密码或请求的系统管理员帐户的密码。
使用“磁盘”测试硬盘的性能
您推荐使用哪种方法和命令来测试磁盘 I/O 性能?
- 我建议在所有类 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 参数以获得一组良好的结果。
- 仅建议运行 Gnome 2 或 3/4 桌面的 Linux/Unix 笔记本电脑用户使用 GUI 方法。
- 要获得详细的 I/O 性能基准测试,请使用 fio 命令。
- 另外,考虑使用 IOzone。它是一个文件系统基准测试工具。该基准测试会生成并测量各种文件操作。
结论
您学习了如何在 Linux 或 Unix 下使用 dd 来测试简单和连续的 I/O 性能测量。要获得详细的 I/O 性能基准测试,请尝试使用 Unix 或 Linux 的“灵活 I/O 测试器 (FIO)”。请参阅如何在 Linux 上使用 man 命令或 help 命令检查 IDE/SATA 硬盘传输速度和手册页。例如:
$ man 1 dd
$ man 1 hdparm