如何检查硬盘性能


Answers:


425

终端方式

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

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

图形方法

  1. 转到系统->管理->磁盘实用程序。
    • 或者,通过运行以下命令从命令行启动Gnome磁盘实用程序 gnome-disks
  2. 在左侧窗格中选择您的硬盘。
  3. 现在,单击右窗格中的“基准–测量驱动器性能”按钮。
  4. 将打开一个包含图表的新窗口。您将找到和两个按钮。一种是“开始只读基准”,另一种是“开始读/写基准”。当您单击任何人按钮时,它将开始对硬盘进行基准测试。

测试

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

文章

您还想要其他东西吗?


10
我建议您在测试SSD时进行测试/dev/urandom以及/dev/zero输入,dd因为数据的可压缩性会对写入速度产生巨大影响。
伊恩·麦金农

3
我的Ubuntu 12.04 Unity上没有这样的“系统->”。或者至少我没有找到它。而且我在系统设置中都没有看到该磁盘工具... O_o但是我最终设法运行了它:/ usr / bin / palimpsest
Fran Marzoa 2012年

6
请注意,从12.10开始,它简称为“磁盘”,可以通过Unity找到。
Paul Lammertsma

1
在Gnome上,它已移至应用程序->系统工具->首选项->磁盘实用程序。对于那些讨厌Unity的用户。
肯·夏普

2
/tmp如今,文件系统经常使用虚拟磁盘。因此,写入/tmp似乎在测试您的内存,而不是磁盘子系统。
Zoredache

99

Suominen是正确的,我们应该使用某种同步;但是有一个更简单的方法,conv = fdatasync将完成此工作:

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

28
这是使用与其他命令/选项不同的答案。我认为这是一个值得发表的答案。
Alaa Ali

2
为什么使用384k作为块大小?
Diego F.Durán2014年

1
@Diego没有理由。这只是一个例子。您可以使用其他任何东西。(大约4k ... 1M之间)当然,更大的块大小将提供更好的性能。当然,当您使用大bs时,请减少计数数量,否则将需要一年时间才能完成。
远摄

它不是通过基准点的工具可靠像IOZONE和sysbench的数字是非常非常低
MSS

1
在使用零写入数据时要小心-一些文件系统和磁盘将具有特殊情况下的路径(以及其他可压缩数据),这将导致人为地提高基准数字……
Anon

50

我不建议使用,/dev/urandom因为它基于软件并且运行缓慢。最好在随机磁盘上获取大块随机数据。在硬盘测试中,随机无关紧要,因为每个字节均按原样写入(在dd的ssd上也是如此)。但是,如果我们使用纯零或随机数据测试去重复的zfs池,则会有巨大的性能差异。

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

要真正衡量磁盘速度而不是内存,我们必须同步文件系统以摆脱缓存效果。可以通过以下方式轻松完成此操作:

time sh -c "dd if=/dev/zero of=testfile bs=100k count=1k && sync"

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

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

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

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

基准测试愉快


3
在使用零写入数据时要小心-有些磁盘(例如SSD)和某些文件系统将使用特殊路径。使用零缓冲区时,这会导致人为地导致较高的基准数字。其他高度可压缩的数据模式也会扭曲结果……
Anon

36

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

这对于获取有关磁盘如何执行特定应用程序或任务的确切信息很有用。输出将显示每个进程的读写速度,以及服务器的总读写速度,与十分相似top

要安装iotop:

sudo apt-get install iotop  

要运行它:

sudo iotop

28

如果需要准确性,则应使用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

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

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

随机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

具有同步功能的混合随机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

增加--size参数以增加文件大小。使用更大的文件可能会减少获取的数量,具体取决于驱动器技术和固件。小文件将为旋转介质提供“太好”的结果,因为读取头不需要移动那么多。如果您的设备快要空了,那么使用足够大的文件来几乎充满驱动器的文件将使您在每次测试时的情况最糟。对于SSD,文件大小没有太大关系。

但是,请注意,对于某些存储介质,文件的大小不如短时间内写入的总字节数重要。例如,某些固态硬盘在使用预擦除的块时可能具有明显更快的性能,或者可能具有较小的SLC闪存区域(用作写缓存),并且一旦SLC缓存已满,性能就会发生变化。再举一个例子,希捷SMR硬盘具有约20 GB的PMR高速缓存区域,该区域具有相当高的性能,但是一旦装满,直接写入SMR区域可能会将性能从原始数据降低10%。看到这种性能下降的唯一方法是首先尽可能快地写入20 GB以上。当然,这全都取决于您的工作量:如果您的写入访问是突发性的,并且存在较长的延迟,从而使设备可以清理内部缓存,较短的测试序列将更好地反映您的实际性能。如果您需要做很多IO,则需要同时增加两个--io_size--runtime参数。请注意,某些介质(例如,大多数闪存设备)会因此类测试而额外磨损。我认为,如果任何设备的性能足以应付此类测试,则无论如何都不应使用它来保存任何有价值的数据。

此外,某些高质量的SSD设备可能具有更智能的损耗平衡算法,其中内部SLC缓存具有足够的智能,可以替换测试中在相同地址空间(即测试文件)中要重写的数据。小于总SLC缓存)。对于此类设备,文件大小再次变得重要。如果您需要实际的工作量,则最好使用实际会看到的文件大小进行测试。否则,您的数字可能看起来太好了。

请注意,这fio将在首次运行时创建所需的临时文件。它将填充随机数据,以避免在将数据写入永久存储之前对其进行压缩来从欺骗作弊的设备中获取过多的数据。临时文件将fio-tempfile.dat在上面的示例中调用,并存储在当前工作目录中。因此,您应该首先更改到要测试的设备上安装的目录。

如果您拥有良好的SSD,并且希望看到更多的SSD,请增加--numjobs以上数量。这定义了读写的并发性。上面的示例均已numjobs设置为,1因此测试是关于单线程进程的读写(可能是通过设置了队列iodepth)。高端SSD(例如Intel Optane)即使不增加numjobs很多也应该获得高数量(例如4应该足以获得最高规格数),但是某些“企业” SSD需要32- 128获得规格号,因为那些固态硬盘的内部延迟设备更高,但总体吞吐量很疯狂。


1
我只是重新测试了一些设备。使用上述顺序读取测试(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%,即使这会导致内核将请求拆分给硬件。我想即使使用内核优化,提交更多系统调用的开销也比在内核内部拆分更糟糕。
Mikko Rantalainen

1
经过进一步测试,似乎我使用小于2的幂获得了最高的顺序吞吐量max_sectors_kb。我将上面的示例命令更改为使用1 MB的块大小,因为这似乎适用于实际的硬件。而且我还测试fsync了阅读的重要性。
米科·兰塔莱宁

1
根据驱动器的连接方式,您可能会发现iodepth太低。您将必须在以下位置观察Linux实际向设备发送的内容以及它的工作深度……
Anon

1
我之所以iodepth选择1进行随机访问,正是因为现实世界中的程序经常运行的算法/逻辑深度不能大于1。因此,如果这种深度“太低”,则您的I / O设备就不好了。的确,某些SSD设备将受益于高于32的深度。但是,您能否指出任何需要读取访问并且能够保持高于32的深度的实际工作负载?TL; DR:如果您想用高延迟设备重现一些疯狂的高读取基准数字,请使用,iodepth=256 --numjobs=4但不要指望真正看到这样的数字。
Mikko Rantalainen '18

1
大多数“现实世界”程序实际上并没有直接提交I / O(o_),更不用说异步了,因此我们所有的示例都处在异常的工作量中,以推动极限基准测试领域(正如他们所说,最好的基准测试是您的实际工作负载)。话虽这么说,诸如运行多个繁忙的虚拟机之类的事情很容易就能产生疯狂的高深度工作负载,但是从磁盘角度来看,I / O经常看起来是随机的,并且是一个简单的示例,说明您可以从诸如此类的事物中看到巨大的加速NVMe。PS:将数字设置得过高会降低吞吐量,因此会有一个甜蜜点……
Anon

25

bonnie ++是我所知道的Linux终极基准测试实用程序。

(我目前正在准备与bonnie ++一起使用的Linux livecd,以使用它来测试基于Windows的计算机!)

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

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

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


Bonnie在进行磁盘基准测试方面存在缺陷,可以轻松生成实际反映系统非磁盘方面的数字,因此如果您选择使用它,则需要格外小心。有关详细信息,请参见Brendan Gregg的Active Benchmarking:Bonnie ++
Anon

22

写速度

$ 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

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


读取速度

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

$ sudo sh -c "sync && echo 3 > /proc/sys/vm/drop_caches"

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

$ 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

使用零作为写数据时要小心-一些文件系统和磁盘将具有特殊情况下的路径(以及其他可压缩数据),这将导致人为地提高基准数字……
Anon

14

关于如何使用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

更多信息:SIMPLE BONNIE ++ Example


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.