如何对硬盘进行基准测试?


Answers:


62

我通常使用hdparm基准测试我的硬盘。您可以对直接读取​​和缓存的读取进行基准测试。您将需要多次运行命令以建立平均值。

例子

这是直接阅读。

$ sudo hdparm -t /dev/sda2

/dev/sda2:
 Timing buffered disk reads: 302 MB in  3.00 seconds = 100.58 MB/sec

这是一个缓存的读取。

$ sudo hdparm -T /dev/sda2

/dev/sda2:
 Timing cached reads:   4636 MB in  2.00 seconds = 2318.89 MB/sec

细节

-t     Perform  timings  of  device reads for benchmark and comparison 
       purposes.  For meaningful results, this operation should be repeated
       2-3 times on an otherwise inactive system (no other active processes) 
       with at least a couple of megabytes of free memory.  This displays  
       the  speed of reading through the buffer cache to the disk without 
       any prior caching of data.  This measurement is an indication of how 
       fast the drive can sustain sequential data reads under Linux, without 
       any filesystem overhead.  To ensure accurate  measurements, the 
       buffer cache is flushed during the processing of -t using the 
       BLKFLSBUF ioctl.

-T     Perform timings of cache reads for benchmark and comparison purposes.
       For meaningful results, this operation should be repeated 2-3
       times on an otherwise inactive system (no other active processes) 
       with at least a couple of megabytes of free memory.  This displays
       the speed of reading directly from the Linux buffer cache without 
       disk access.  This measurement is essentially an indication of the
       throughput of the processor, cache, and memory of the system under 
       test.

使用dd

我也曾经使用dd过这种类型的测试。我要对上述命令进行的一种修改是将此位添加到命令末尾; rm ddfile

$ time sh -c "dd if=/dev/zero of=ddfile bs=8k count=250000 && sync"; rm ddfile

ddfile命令完成后,将删除。注意:这 ddfile是一个暂不需要的文件,当它使HDD处于加载状态时,它dd是写入(of=ddfile)的文件。

超越

如果您需要对硬盘进行更严格的测试,则可以使用Bonnie ++

参考文献


1
我也喜欢hdparm快速基准测试。唯一的缺点是,仅基准测试读取带宽,许多类型的块设备(例如RAID,iSCSI)的性能可能非常不对称。为了比较同一盒子上的“之前”和“之后”性能,dd效果也很好。
Alexios 2014年

@Alexios-是的,感谢您提到这一点。是的,你通常需要至少使用hdparm+ dd或只bonnie++或所有3
SLM

代替可疑的同步,应该使用iflag = direct oflag = direct(例如,具有支持Direct io的文件系统的Linux)。

22

(这是一个非常热门的一个问题-你可以看到它的变化https://stackoverflow.com/q/1198691https://serverfault.com/q/219739/203726https://askubuntu.com/q / 87035/740413

有没有比[基准测试]更好的方法[基准磁盘]?

是的,但是它们将花费更长的时间运行,并且需要有关如何解释结果的知识-没有一个数字可以一次告诉您所有信息,因为以下因素会影响您应进行的测试类型:

  • 您是否对随机,顺序或两者结合的I / O性能感兴趣?
  • 您是从磁盘读取还是向磁盘写入(或两者混合)?
  • 您是否担心延迟,吞吐量或两者兼而有之?
  • 您是否要了解同一硬盘的不同部分的性能(通常将速度更快地移近旋转磁盘的中心)?
  • 您是否对使用磁盘时给定文件系统的性能感兴趣,或者想要通过直接对块设备进行I / O来使结果更接近磁盘的原始性能?
  • 您是否对特定大小的I / O的性能感兴趣?
  • 您是同步还是异步提交I / O?
  • 您要提交多少I / O(以错误的方式提交的I / O太少,所有I / O都可以缓存,因此您需要测试RAM的速度而不是磁盘的速度)?
  • 您正在写入的数据内容的可压缩性如何(例如,仅零数据是高度可压缩的,并且某些文件系统/磁盘甚至具有专用于仅零数据的特殊快速路径,导致其他内容无法获得数字)?

等等。

以下是最容易在顶部运行,在底部更难/更彻底/更好地运行的工具的简短列表:

  1. dd(顺序读取或写入,仅显示吞吐量,可以配置为使用文件系统或块设备,可以配置为绕过块缓存/等待I / O真正完成)
  2. hdparm(仅顺序读取,仅显示吞吐量,从不使用文件系统,可以配置为绕过块缓存,缓存测试仅重新读取起始的2 MB)
  3. GNOME磁盘实用程序的基准测试(易于运行,从不使用文件系统,图形化,但需要完整安装GNOME,为不同类型的I / O提供延迟和吞吐量数字,但写入工作负载实际上是按样本大小进行读/写/ fsync)。
  4. fio(几乎可以做任何事情并给出详细的结果,但需要配置并理解如何解释所述结果)。这是Linus所说的:

    Greg-获取Jens的FIO代码。它做得正确,包括编写实际的伪随机内容,该内容显示磁盘是否执行了某些“重复数据删除”(也称为“针对基准进行优化”):

    [ https://github.com/axboe/fio/ ]

    还有其他可疑之处-忘记bonnie或其他传统工具。

来源:Linus Torvalds在Google Plus上对Greg Kroah-Hartman的评论


11

使用IOPS工具

如果您不愿意阅读所有这些内容,我只推荐IOPS工具。它将根据块大小告诉您实际速度。


否则-做IO基准测试时,我会看以下事情:

  • 块大小/缓存/ IOPS /直接vs缓冲/异步vs同步
  • 读/写
  • 线程数
  • 潜伏
  • CPU利用率

  • 您将使用哪种块大小:如果您要从磁盘读/写1 GB磁盘,那么执行一次I / O操作将很快。但是,如果您的应用程序需要以非顺序的块(在整个I / O中称为随机I / O,尽管它不是随机的)以512字节的块大小在整个硬盘上进行写入,则外观会有所不同。现在,数据库会做随机I / O的数据量和顺序I / O的日志卷由于其性质。因此,首先您需要弄清楚要测量的内容。如果要复制与安装Linux不同的大型视频文件。

    这种块大小会影响您执行的I / O操作数。例如,如果您执行8个顺序读(或写,只是不混合)操作,则OS的I / O调度程序将合并它们。如果没有,则控制器的缓存将进行合并。如果您读取8个512字节或一个4096字节块的连续块,则实际上没有区别。一个例外-如果您设法进行直接同步IO,并在请求下一个512字节之前等待512字节。在这种情况下,增加块大小就像添加缓存。

    另外,您还应该知道存在同步和异步IO:使用同步IO,在当前请求返回之前,您将不会发出下一个IO请求。使用异步IO,您可以请求例如10个数据块,然后在它们到达时等待。离散数据库线程通常将使用同步IO记录日志,使用异步IO记录数据。IOPS工具通过测量从512字节开始的所有相关块大小来解决这一问题。

  • 您会读还是写:通常阅读比写作快。但是请注意,缓存的读写方式大不相同:

    • 对于写操作,数据将被移交给控制器,并且如果进行高速缓存,它将在数据存储在磁盘上之前进行确认,除非高速缓存已满。使用工具iozone,您可以绘制精美的高原效果图(CPU缓存效果和缓冲区缓存效果)。写入的内容越多,缓存的效率就越低。

    • 对于读取,读取的数据在第一次读取后被保存在缓存中。首次读取花费的时间最长,并且在正常运行期间缓存变得越来越有效。值得注意的缓存是CPU缓存,OS的文件系统缓存,IO控制器的缓存和存储的缓存。IOPS工具仅测量读取。这允许它“在各处读取”,并且您不希望它写而不是读。

  • 您将使用多少个线程:如果使用一个线程(将dd用于磁盘基准测试),则性能可能会比使用多个线程差很多。IOPS工具考虑了这一点,并在多个线程上读取。

  • 延迟对您来说有多重要:从数据库来看,IO延迟变得非常重要。在确认之前,任何插入/更新/删除SQL命令都将在提交时写入数据库日志(数据库行话中的“ log”)。这意味着完整的数据库可能正在等待此IO操作完成。我在这里展示如何使用iostat工具测量平均等待时间。

  • CPU利用率对您来说有多重要:CPU可能很容易成为应用程序性能的瓶颈。在这种情况下,您必须知道每个读/写字节消耗了多少CPU周期,并朝该方向进行优化。这可能意味着要根据您的测量结果决定是否使用PCIe闪存。同样,iostat工具可以通过IO操作粗略估计CPU使用率。


1
iops脚本很好,我真的很困惑,尽管它不在apt或pip上。它确实可以工作。
ThorSummoner

iops工具似乎已被放弃。此外,它仅测量读取,不打印任何统计数字(例如stddev /定量数字)。
maxschlepzig

iops工具很简单,这就是实现可比性所需要的。基本上,它是读取的syscall的包装,是对文件(一切都是文件)随机进行的。相信它或阅读源代码-它已经完成,并且代码不需要更新。想一想-您是否真的想要另一种工具,例如IOMeter,该工具具有数千行代码,每个代码行应引起争议?而您如何处理新版本?您是否需要重新进行所有基准测试?
Thorsten Staerk

8

如果您已安装PostgreSQL,则可以使用其出色的pg_test_fsync基准。它基本上可以测试您的写入同步性能。

在Ubuntu上,您可以在这里找到它: /usr/lib/postgresql/9.5/bin/pg_test_fsync

很棒的是,该工具将向您展示为什么企业级SSD值得额外花费。


2
在Debian上,它以postgresql-contrib软件包形式提供。
TranslucentCloud

4

您可以使用fio- 多线程IO生成工具。它由多个发行版打包,例如Fedora 25,Debian和OpenCSW。

fio工具非常灵活,可以轻松地用于基准测试各种IO方案-包括并发方案。该软件包随附一些示例配置文件(例如/usr/share/doc/fio/examples)。它可以正确地测量事物,即它还可以打印一些数字的标准差和定量统计数据。其他一些流行的基准测试工具不关心的事情。

一个简单的示例(一系列简单的场景:顺序/随机X读/写):

$ cat fio.cfg
[global]
size=1g
filename=/dev/sdz

[randwrite]
rw=randwrite

[randread]
wait_for=randwrite
rw=randread
size=256m

[seqread]
wait_for=randread
rw=read

[seqwrite]
wait_for=seqread
rw=write

电话:

# fio -o fio-seagate-usb-xyz.log fio.cfg
$ cat fio-seagate-usb-xyz.log
[..]
randwrite: (groupid=0, jobs=1): err= 0: pid=11858: Sun Apr  2 21:23:30 2017
  write: io=1024.0MB, bw=16499KB/s, iops=4124, runt= 63552msec
clat (usec): min=1, max=148280, avg=240.21, stdev=2216.91
 lat (usec): min=1, max=148280, avg=240.49, stdev=2216.91
clat percentiles (usec):
 |  1.00th=[    2],  5.00th=[    2], 10.00th=[    2], 20.00th=[    7],
 | 30.00th=[   10], 40.00th=[   11], 50.00th=[   11], 60.00th=[   12],
 | 70.00th=[   14], 80.00th=[   16], 90.00th=[   19], 95.00th=[   25],
 | 99.00th=[ 9408], 99.50th=[10432], 99.90th=[21888], 99.95th=[38144],
 | 99.99th=[92672]
bw (KB  /s): min= 7143, max=371874, per=45.77%, avg=15104.53, stdev=32105.17
lat (usec) : 2=0.20%, 4=15.36%, 10=6.58%, 20=69.35%, 50=6.07%
lat (usec) : 100=0.49%, 250=0.07%, 500=0.01%, 750=0.01%
lat (msec) : 4=0.01%, 10=1.20%, 20=0.54%, 50=0.08%, 100=0.03%
lat (msec) : 250=0.01%
  cpu          : usr=1.04%, sys=4.79%, ctx=4977, majf=0, minf=11
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
 submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
 complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
 issued    : total=r=0/w=262144/d=0, short=r=0/w=0/d=0, drop=r=0/w=0/d=0
 latency   : target=0, window=0, percentile=100.00%, depth=1
randread: (groupid=0, jobs=1): err= 0: pid=11876: Sun Apr  2 21:23:30 2017
  read : io=262144KB, bw=797863B/s, iops=194, runt=336443msec
[..]
bw (KB  /s): min=  312, max= 4513, per=15.19%, avg=591.51, stdev=222.35
[..]

请注意,该[global]部分具有全局默认值,其他部分可以覆盖这些默认值。每个部分都描述了一个作业,该部分的名称是该作业的名称,可以自由选择。默认情况下,并行启动不同的作业,因此,上面的示例使用wait_for密钥显式序列化了作业执行 。另外,fio使用的块大小为4 KiB-也可以更改。该示例直接将原始设备用于读取和写入作业,因此,请确保使用正确的设备。该工具还支持在现有文件系统上使用文件/目录。

其他工具

hdparm实用程序提供了一个非常简单的读取基准,例如:

# hdparm -t -T /dev/sdz

它不能替代诸如fio之类的最新基准测试工具,而应仅用于首次真实性检查。例如,要检查外部USB 3驱动器是否被错误地识别为USB 2设备(您将看到〜100 MiB / s与30〜30 MiB / s的速率)。


1
此答案本质上是摘要答案unix.stackexchange.com/a/138516/134856的不同版本(但扩展了fio部分)。我很痛苦,因为它确实提供了一个fio摘要,但是它很长,您可以摆脱链接到fio.readthedocs.io/en/latest/fio_doc.html#job-file-format ...
Anon

PS:我建议将direct = 1添加到作业的全局部分,这样您就可以绕过Linux的页面缓存,而只能看到磁盘的速度(但是由于iodepth只有1 ... [插入有关提交磁盘I / O的讨论] )。全局使用stonewallfio.readthedocs.io/en/latest/…)也更容易使所有作业按顺序运行。
Anon

1

正如在此间指出,在这里,你可以使用gnome-disks(如果你使用Gnome)。

单击您要测试的驱动器,然后单击“其他分区选项”(滚轮)。然后Benchmark Partition。您将获得平均读取/写入(以MB / s为单位)和平均访问时间(以毫秒为单位)。我觉得很舒服。


1

有点粗糙,但这很关键:

find <path> -type f -print0 | cpio -0o >/dev/null

您可以使用此技术做一些有趣的事情,包括缓存所有/lib/usr/bin文件。您还可以将其用作基准测试工作的一部分:

find / -xdev -type f -print0 | 
sort -R --from0-file=- | 
timeout "5m" cpio -0o >/dev/null

找到根目录上的所有文件名,对其进行随机排序,然后将其复制到缓存中最多1分钟。cpio的输出告诉您复制了多少块。重复3次以获取平均每分钟阻止次数。(请注意,查找/排序操作可能需要很长时间-比副本要长得多。最好缓存查找/排序并用于split获取文件样本。)

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.