如何检查硬盘的性能(通过终端或 GUI)。写入速度。读取速度。缓存大小和速度。随机速度。
答案1
终端方法
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
图解法
- 打开“磁盘”应用程序。(在旧版本的 Ubuntu 中,转到系统 -> 管理 -> 磁盘实用程序)
- 或者,通过运行以下命令从命令行启动 Gnome 磁盘实用程序
gnome-disks
- 或者,通过运行以下命令从命令行启动 Gnome 磁盘实用程序
- 在左侧窗格中选择您的硬盘。
- 现在单击右侧窗格中三个点菜单按钮下的“基准磁盘...”菜单项。
- 一个带有图表的新窗口打开。单击“开始基准测试...”。(在旧版本中,您将看到两个按钮:一个用于“开始只读基准测试”,另一个用于“开始读/写基准测试”。单击任意按钮时,都会开始对硬盘进行基准测试。)
如何对磁盘 I/O 进行基准测试
您还想要什么吗?
答案2
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
答案3
如果你想要准确,你应该使用fio
。需要阅读手册(man fio
),但它会给你准确的结果。请注意,对于任何准确性,你都需要准确指定要测量的内容。一些例子:
大块 QD32 的顺序读取速度(该数字应该接近您在驱动器规格中看到的数字):
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
大块 QD32 的顺序写入速度(该数字应该接近您在驱动器规格中看到的数字):
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,文件大小并不那么重要。
但是请注意,对于某些存储介质来说,文件并不像短时间段内写入的总字节数。例如,某些 SSD 使用预擦除块时性能明显更快,或者它可能具有用作写入缓存的小型 SLC 闪存区域,并且一旦 SLC 缓存已满,性能就会发生变化(例如三星 EVO 系列具有 20-50 GB 的 SLC 缓存)。再举一个例子,Seagate SMR HDD 具有大约 20 GB 的 PMR 缓存区域,性能相当高,但一旦已满,直接写入 SMR 区域可能会将性能降低到原来的 10%。而看到这种性能下降的唯一方法是先尽可能快地写入 20+ GB,然后立即继续进行实际测试。当然,这一切都取决于您的工作负载:如果您的写入访问是突发性的,并且延迟时间较长,允许设备清理内部缓存,则较短的测试序列将更好地反映您的实际性能。如果您需要进行大量 IO,则需要同时增加--io_size
和--runtime
参数。请注意,某些介质(例如大多数便宜的闪存设备)将无法进行此类测试,因为闪存芯片非常差,磨损非常快。在我看来,如果任何设备差到无法进行此类测试,那么无论如何都不应该用它来保存任何有价值的数据。也就是说,不要重复进行数千次大型写入测试,因为所有闪存单元在写入时都会有一定程度的磨损。
此外,一些高质量的 SSD 设备可能具有更智能的磨损均衡算法,其中内部 SLC 缓存具有足够的智能,可以在数据仍在 SLC 缓存中时重新写入数据,从而就地替换数据。对于此类设备,如果测试文件小于设备的总 SLC 缓存,则完整测试始终仅写入 SLC 缓存,并且您获得的性能数字高于设备可以支持的较大写入。因此,对于此类设备,文件大小再次开始变得重要。如果您知道实际工作量,最好使用您在现实生活中实际看到的文件大小进行测试。如果您不知道预期的工作量,使用填充存储设备约 50% 的测试文件大小应该会为所有存储实现产生良好的平均结果。当然,对于 50 TB 的 RAID 设置,使用 25 TB 的测试文件进行写入测试将需要相当长的时间!
请注意,fio
将在首次运行时创建所需的临时文件。它将填充伪随机数据,以避免从试图通过在将数据写入永久存储之前压缩数据来作弊的设备获得过好的数字。临时文件将fio-tempfile.dat
在上述示例中调用并存储在当前工作目录中。因此,您应该首先更改为安装在要测试的设备上目录。它还fio
支持使用直接媒体作为测试目标,但我绝对建议在尝试之前阅读手册页,因为当使用直接存储媒体访问时(例如,意外写入 OS 设备而不是测试设备),拼写错误可能会覆盖整个操作系统。
如果您拥有优质的 SSD 并希望看到更高的数字,请增加--numjobs
以上值。这定义了读取和写入的并发性。以上所有示例都设置numjobs
为,1
因此测试是关于单线程进程读取和写入(可能使用队列深度或 QD 设置iodepth
)。高端 SSD(例如 Intel Optane 905p)即使不增加numjobs
太多也应该获得高数字(例如4
应该足以获得最高的规格数字),但一些“企业级”SSD 需要达到范围32
-128
才能获得规格数字,因为这些设备的内部延迟更高,但整体吞吐量非常高。请注意,增加到numbjobs
高值通常会增加结果基准性能但很少能以任何方式反映现实世界的表现。
Intel 905p 可以完成上述“混合随机 4K 读写 QD1 同步”测试,性能如下:[r=149MiB/s,w=149MiB/s][r=38.2k,w=38.1k IOPS]
。如果您在 Optane 级硬件以外的任何其他硬件上尝试该测试,性能会大大降低。接近 100 IOPS,而不是 Optane 可以达到的 38000 IOPS。
答案4
如果你想实时监控磁盘读写速度,可以使用iotop工具。
这对于获取有关磁盘在特定应用程序或工作负载下的性能的信息非常有用。输出将显示每个进程的读/写速度以及服务器的总读/写速度,类似于top
。
安装iotop
:
sudo apt-get install iotop
运行:
sudo iotop
与更一般和理论的测试相比,此工具有助于了解磁盘在特定工作负载下的表现。