如何检查硬盘性能

Lui*_*ado 414 performance hard-drive

如何检查硬盘的性能(通过终端或 GUI)。写入速度。读取速度。缓存大小和速度。随机速度。

Pan*_*her 523

终端方式

hdparm 是一个很好的起点。

sudo hdparm -Tt /dev/sda

/dev/sda:
Timing cached reads:   12540 MB in  2.00 seconds = 6277.67 MB/sec
Timing buffered disk reads: 234 MB in  3.00 seconds =  77.98 MB/sec
Run Code Online (Sandbox Code Playgroud)

sudo hdparm -v /dev/sda 也会提供信息。

dd 将为您提供有关写入速度的信息。

如果驱动器没有文件系统(并且只有),请使用of=/dev/sda.

否则,将其挂载到 /tmp 并写入然后删除测试输出文件。

dd if=/dev/zero of=/tmp/output bs=8k count=10k; rm -f /tmp/output

10240+0 records in
10240+0 records out
83886080 bytes (84 MB) copied, 1.08009 s, 77.7 MB/s
Run Code Online (Sandbox Code Playgroud)

图解法

  1. 转到系统 -> 管理 -> 磁盘工具。
    • 或者,通过运行从命令行启动 Gnome 磁盘实用程序 gnome-disks
  2. 在左侧窗格中选择您的硬盘。
  3. 现在单击右侧窗格中的“基准测试 – 测量驱动器性能”按钮。
  4. 一个带有图表的新窗口打开。您会发现 和 两个按钮。一个是“Start Read Only Benchmark”,另一个是“Start Read/Write Benchmark”。当您单击任何按钮时,它会开始对硬盘进行基准测试。

测试

如何对磁盘 I/O 进行基准测试

文章

你还有什么想要的吗?

  • 我建议在测试 SSD 时测试 `/dev/urandom` 以及 `/dev/zero` 作为 `dd` 的输入,因为数据的可压缩性会对写入速度产生巨大影响。 (13认同)
  • 请注意,从 12.10 开始 [它简称为磁盘](https://apps.ubuntu.com/cat/applications/quantal/gnome-disk-utility/),可以通过 Unity 找到。 (6认同)
  • `/tmp` 文件系统现在经常使用 ramdisk。所以写入`/tmp` 似乎是在测试你的内存,而不是你的磁盘子系统。 (5认同)
  • 我的 Ubuntu 12.04 Unity 上没有这样的“系统 ->”。或者至少我还没有找到它。而且我在系统设置中都没有看到该磁盘工具... O_o 但我最终设法运行了它:/usr/bin/palimpsest (3认同)
  • 在 Gnome 上,这已移至应用程序 --> 系统工具 --> 首选项 --> 磁盘工具。对于那些讨厌 Unity 的用户。 (2认同)

Tel*_*ele 122

索米宁是对的,我们应该使用某种同步;但有一个更简单的方法, conv=f​​datasync 将完成这项工作:

dd if=/dev/zero of=/tmp/output conv=fdatasync bs=384k count=1k; rm -f /tmp/output
1024+0records in
1024+0 records out
402653184 bytes (403 MB) copied, 3.19232 s, 126 MB/s
Run Code Online (Sandbox Code Playgroud)

  • 这是使用与其他命令/选项不同的命令/选项的答案。我认为这是一个值得发表自己的帖子的答案。 (28认同)
  • 为什么使用 384k 作为块大小? (2认同)
  • 对写入数据使用零时要小心——一些文件系统和磁盘会有一个特殊的路径(和其他可压缩数据),这会导致人为的高基准数字...... (2认同)

Mik*_*nen 76

如果你想要准确性,你应该使用fio. 它需要阅读手册 ( man fio) 但它会给你准确的结果。请注意,对于任何准确性,您都需要准确指定要测量的内容。一些例子:

大块的顺序读取速度(这应该接近您在驱动器规格中看到的数字):

fio --name TEST --eta-newline=5s --filename=fio-tempfile.dat --rw=read --size=500m --io_size=10g --blocksize=1024k --ioengine=libaio --fsync=10000 --iodepth=32 --direct=1 --numjobs=1 --runtime=60 --group_reporting
Run Code Online (Sandbox Code Playgroud)

大块的顺序写入速度(这应该接近您在驱动器规格中看到的数字):

fio --name TEST --eta-newline=5s --filename=fio-tempfile.dat --rw=write --size=500m --io_size=10g --blocksize=1024k --ioengine=libaio --fsync=10000 --iodepth=32 --direct=1 --numjobs=1 --runtime=60 --group_reporting
Run Code Online (Sandbox Code Playgroud)

随机 4K 读取 QD1(这是对现实世界性能真正重要的数字,除非您确定更清楚):

fio --name TEST --eta-newline=5s --filename=fio-tempfile.dat --rw=randread --size=500m --io_size=10g --blocksize=4k --ioengine=libaio --fsync=1 --iodepth=1 --direct=1 --numjobs=1 --runtime=60 --group_reporting
Run Code Online (Sandbox Code Playgroud)

混合随机 4K 读写 QD1 与同步(这是您应该从驱动器中期望得到的最坏情况数字,通常不到规格表中列出的数字的 1%):

fio --name TEST --eta-newline=5s --filename=fio-tempfile.dat --rw=randrw --size=500m --io_size=10g --blocksize=4k --ioengine=libaio --fsync=1 --iodepth=1 --direct=1 --numjobs=1 --runtime=60 --group_reporting
Run Code Online (Sandbox Code Playgroud)

增加--size参数以增加文件大小。根据驱动器技术和固件,使用更大的文件可能会减少您获得的数量。对于旋转介质,小文件将给出“太好”的结果,因为读取头不需要移动那么多。如果您的设备几乎是空的,使用大到几乎填满驱动器的文件将使您在每次测试中出现最坏的情况。在 SSD 的情况下,文件大小无关紧要。

但是,请注意,对于某些存储介质,文件的大小不如短时间内写入的总字节数重要. 例如,某些 SSD 具有预擦除块的显着更快的性能,或者它可能具有用作写入缓存的小 SLC 闪存区域,并且一旦 SLC 缓存已满,性能就会发生变化(例如,具有 20-50 GB SLC 缓存的三星 EVO 系列) . 再举一个例子,希捷 SMR 硬盘有大约 20 GB 的 PMR 缓存区域,具有相当高的性能,但一旦满了,直接写入 SMR 区域可能会使性能比原来降低 10%。看到这种性能下降的唯一方法是首先尽可能快地写入 20+ GB,然后立即继续进行真正的测试。当然,这一切都取决于您的工作负载:如果您的写入访问是突发的,并且有较长的延迟,允许设备清理内部缓存,则较短的测试序列将更好地反映您的真实世界性能。--io_size--runtime参数。请注意,某些介质(例如,最便宜的闪存设备)会受到此类测试的影响,因为闪存芯片非常差,磨损得非常快。在我看来,如果任何设备差到无法处理此类测试,则无论如何都不应该使用它来保存任何有价值的数据。也就是说,不要重复大写测试 1000 次,因为所有闪存单元在写入时都会有一定程度的磨损。

此外,一些高质量的 SSD 设备可能有更智能的磨损均衡算法,其中内部 SLC 缓存有足够的智能来替换数据,如果数据仍在 SLC 缓存中时被重写。对于此类设备,如果测试文件小于设备的总 SLC 缓存,则完整测试始终仅写入 SLC 缓存,并且您获得的性能数字高于设备支持更大写入的性能。因此,对于此类设备,文件大小再次变得重要。如果您知道您的实际工作负载,最好使用您在现实生活中实际看到的文件大小进行测试。

请注意,这fio将在首次运行时创建所需的临时文件。它将填充随机数据,以避免从试图通过在将数据写入永久存储之前压缩数据来欺骗基准测试的设备获得太多好的数字。临时文件将fio-tempfile.dat在上面的示例中被调用并存储在当前工作目录中。所以你应该首先切换到你要测试的设备上挂载的目录。该fio还支持使用直接媒体作为测试目标,但我肯定建议尝试,由于一个错字可以覆盖你的整个操作系统当人们使用直接存储介质访问(例如不小心写OS设备,而不是测试设备)之前阅读手册页。

如果您有一个好的 SSD 并希望看到更高的数字,请--numjobs在上面增加。这定义了读取和写入的并发性。上面的例子都numjobs设置为 ,1所以测试是关于单线程进程的读写(可能队列深度或 QD 设置为iodepth)。高端 SSD(例如 Intel Optane 905p)即使没有增加numjobs很多也应该获得很高的数字(例如4应该足以获得最高的规格数字)但一些“企业”SSD 需要范围32-128以获得规格数字,因为内部延迟这些设备的数量更高,但整体吞吐量是疯狂的。注意增加numbjobs 设置为高值通常会增加最终的性能数字,但很少以任何方式反映现实世界的性能。

  • 我刚刚重新测试了一些设备。使用上述顺序读取测试(2MB 块大小),我从 Samsung SSD 850 EVO 获得了 280 MB/s 的速度,从 Intel 910 SSD 获得了 1070 MB/s。使用 64k 块大小和其他相同的命令行,我从 850 EVO 获得了 268 MB/s,从 910 SSD 获得了 1055 MB/s。至少对于这种设备,使用 2 MB 块大小似乎可以将结果提高 1-5% 左右,即使它会导致内核将请求拆分到硬件。我想即使进行了内核优化,提交更多系统调用的开销也比在内核内部拆分更糟糕。 (2认同)

小智 60

我不推荐使用,/dev/urandom因为它是基于软件的,而且慢得像猪一样。最好在 ramdisk 上获取大量随机数据。在硬盘上随机测试无关紧要,因为每个字节都是按原样写入的(也在带有 dd 的 ssd 上)。但是如果我们用纯零数据或随机数据测试去重复的 zfs 池,就会有巨大的性能差异。

另一个观点必须是同步时间包含;所有现代文件系统都对文件操作使用缓存。

要真正测量磁盘速度而不是内存,我们必须同步文件系统以消除缓存效应。这可以通过以下方式轻松完成:

time sh -c "dd if=/dev/zero of=testfile bs=100k count=1k && sync"
Run Code Online (Sandbox Code Playgroud)

使用该方法,您将获得输出:

sync ; time sh -c "dd if=/dev/zero of=testfile bs=100k count=1k  && sync" ; rm testfile 
1024+0 records in
1024+0 records out
104857600 bytes (105 MB) copied, 0.270684 s, 387 MB/s

real    0m0.441s
user    0m0.004s
sys 0m0.124s
Run Code Online (Sandbox Code Playgroud)

所以磁盘数据速率仅为 104857600 / 0.441 = 237772335 B/s --> 237MB/s

这比缓存低 100MB/s 以上。

快乐标杆,

  • 对写入数据使用零时要小心 - 一些磁盘(例如 SSD)和一些文件系统会有一个特殊的路径。当使用零缓冲区时,这会导致人为地提高基准数字。其他高度可压缩的数据模式也会扭曲结果...... (6认同)

Lar*_*ars 39

如果要实时监控磁盘读写速度,可以使用iotop工具。

这对于获取有关磁盘如何针对特定应用程序或工作负载执行的信息非常有用。输出将显示每个进程的读/写速度,以及服务器的总读/写速度,类似于top.

安装iotop

sudo apt-get install iotop  
Run Code Online (Sandbox Code Playgroud)

运行:

sudo iotop
Run Code Online (Sandbox Code Playgroud)

此工具有助于了解磁盘在特定工作负载下的性能与更一般和理论测试的对比情况。


小智 28

写入速度

$ dd if=/dev/zero of=./largefile bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 4.82364 s, 223 MB/s
Run Code Online (Sandbox Code Playgroud)

块大小实际上相当大。您可以尝试使用较小的尺寸,例如 64k 甚至 4k。


读取速度

运行以下命令清除内存缓存

$ sudo sh -c "sync && echo 3 > /proc/sys/vm/drop_caches"
Run Code Online (Sandbox Code Playgroud)

现在读取在写测试中创建的文件:

$ dd if=./largefile of=/dev/null bs=4k
165118+0 records in
165118+0 records out
676323328 bytes (676 MB) copied, 3.0114 s, 225 MB/s
Run Code Online (Sandbox Code Playgroud)

  • 对写入数据使用零时要小心——一些文件系统和磁盘会有一个特殊的路径(和其他可压缩数据),这会导致人为的高基准数字...... (2认同)

小智 26

bonnie++ 是我所知道的用于 linux 的终极基准实用程序。

(我目前正在准备一个使用 bonnie++ 的 linux livecd 来测试我们基于 Windows 的机器!)

它负责缓存、同步、随机数据、磁盘上的随机位置、小尺寸更新、大更新、读取、写入等。 比较 USB 密钥、硬盘(旋转)、固态驱动器和基于 ram 的驱动器文件系统对新手来说非常有用。

我不知道它是否包含在 Ubuntu 中,但您可以轻松地从源代码编译它。

http://www.coker.com.au/bonnie++/

  • Bonnie 在磁盘基准测试方面存在缺陷,并且可以轻松生成实际反映系统非磁盘方面的数字,因此如果您选择使用它,则需要高度小心。有关详细信息,请参阅 [Brendan Gregg 的 Active Benchmarking: Bonnie++](http://www.brendangregg.com/ActiveBenchmarking/bonnie++.html)。 (2认同)

nyx*_*xee 15

关于如何使用 bonnie++ 的一些提示

bonnie++ -d [TEST_LOCATION] -s [TEST_SIZE] -n 0 -m [TEST_NAME] -f -b -u [TEST_USER] 
bonnie++ -d /tmp -s 4G -n 0 -m TEST -f -b -u james
Run Code Online (Sandbox Code Playgroud)

更多信息:SIMPLE BONNIE++ 示例