Answers:
我通常使用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
过这种类型的测试。我要对上述命令进行的一种修改是将此位添加到命令末尾; 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 ++。
hdparm
快速基准测试。唯一的缺点是,仅基准测试读取带宽,许多类型的块设备(例如RAID,iSCSI)的性能可能非常不对称。为了比较同一盒子上的“之前”和“之后”性能,dd
效果也很好。
hdparm
+ dd
或只bonnie++
或所有3
(这是一个非常热门的一个问题-你可以看到它的变化https://stackoverflow.com/q/1198691,https://serverfault.com/q/219739/203726和https://askubuntu.com/q / 87035/740413)
有没有比[基准测试]更好的方法[基准磁盘]?
是的,但是它们将花费更长的时间运行,并且需要有关如何解释结果的知识-没有一个数字可以一次告诉您所有信息,因为以下因素会影响您应进行的测试类型:
等等。
以下是最容易在顶部运行,在底部更难/更彻底/更好地运行的工具的简短列表:
Greg-获取Jens的FIO代码。它做得正确,包括编写实际的伪随机内容,该内容显示磁盘是否执行了某些“重复数据删除”(也称为“针对基准进行优化”):
[ https://github.com/axboe/fio/ ]
还有其他可疑之处-忘记bonnie或其他传统工具。
如果您不愿意阅读所有这些内容,我只推荐IOPS工具。它将根据块大小告诉您实际速度。
否则-做IO基准测试时,我会看以下事情:
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使用率。
如果您已安装PostgreSQL,则可以使用其出色的pg_test_fsync基准。它基本上可以测试您的写入同步性能。
在Ubuntu上,您可以在这里找到它: /usr/lib/postgresql/9.5/bin/pg_test_fsync
很棒的是,该工具将向您展示为什么企业级SSD值得额外花费。
postgresql-contrib
软件包形式提供。
您可以使用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的速率)。
有点粗糙,但这很关键:
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
获取文件样本。)