如何检查硬盘的性能(无论是通过终端还是图形界面)。写入速度。读取速度。缓存大小和速度。随机速度。
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
gnome-disks
来启动Gnome磁盘实用程序。还有其他你想要的吗?
/dev/urandom
和/dev/zero
作为dd
的输入进行测试,因为数据的可压缩性对写入速度有巨大影响。 - Ian Mackinnon/tmp
文件系统通常使用ramdisk。因此,写入/tmp
似乎是在测试您的内存而不是磁盘子系统。 - Zoredachedd if=/dev/zero of=/home/user/file bs=8k count=200k; rm -f /home/user/file
(更改为正确的用户名)。如果使用较小的count
或写入tmp
,结果会不一致且过于理想化。 - Jonatan Öströmdd if=/dev/zero of=/media/your_crypt_mount_point bs=8k count=10k; rm -f /media/your_crypt_mount_point
。 - Pantherdd 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
fio
。它需要阅读手册(man fio
),但它会给你准确的结果。请注意,为了得到准确度,你需要明确你想要测量的内容。以下是一些例子:
使用大块大小和队列深度32进行顺序读取速度测试(这个速度应该接近你在硬盘规格中看到的数字):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
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而言,文件大小并不那么重要。--io_size
和--runtime
参数。请注意,某些介质(例如大多数廉价闪存设备)会因此类测试而受到影响,因为闪存芯片质量差得足以迅速磨损。在我看来,如果任何设备质量不足以处理这种类型的测试,那么不管怎样都不应该用于保存任何有价值的数据。也就是说,不要重复进行1000次以上的大型写入测试,因为所有闪存单元都会有一定程度的磨损。fio
在首次运行时会创建所需的临时文件。它将填充伪随机数据,以避免从试图在基准测试中压缩数据后写入永久存储设备的设备中获得过于优秀的数字。上述示例中的临时文件将被命名为fio-tempfile.dat
,并存储在当前工作目录中。因此,您应该首先切换到要测试的设备上挂载的目录。fio
还支持使用直接媒体作为测试目标,但我强烈建议在尝试之前阅读手册页面,因为一个打字错误可能会覆盖整个操作系统,当使用直接存储介质访问(例如,意外地写入操作系统设备而不是测试设备)时。--numjobs
的值。这个参数定义了读写操作的并发数。上面的例子中,numjobs
都设置为1
,所以测试是关于单线程的读写过程(可能还会使用iodepth
来设置队列深度或QD)。高端的SSD(比如Intel Optane 905p)即使不增加numjobs
的值也能获得很高的数字(比如4
就足够获得最高规格的数字),但是一些“企业级”SSD需要将numjobs
增加到32
-128
的范围才能获得规格上的数字,因为这些设备的内部延迟较高,但总吞吐量非常大。请注意,增加numjobs
的值通常会增加结果中的基准性能数字,但很少反映实际世界中的性能表现。fsync
也看起来很不寻常。我同意fio很有用,但我建议读者仔细调查他们希望使用哪些参数,而不仅仅是从上面回答的20180102版本中逐字复制它们。 - Anon/sys/block/sd?/queue/max_sectors_kb
,因为它可能比实际硬件限制更低,而实际硬件限制通常远远超过上面示例中的2MB。然而,我认为由CPU引起的轻微开销与实际I/O设备的速度相比无关紧要。fsync
对于读取操作来说是一个无操作,所以它不会影响结果 - 我保留它只是为了更容易理解不同命令行之间的差异。你有问题无法满足制造商的规格要求吗? - Mikko Rantalainenmax_sectors_kb
的2的幂值。我将上述示例命令更改为使用1 MB的块大小,因为这似乎适用于真实世界的硬件。而且我还测试了在读取时fsync
并不重要。 - Mikko Rantalaineniodepth
设置为1
,用于随机访问,因为现实世界中的程序通常运行的算法/逻辑不能处理超过1的深度。结果是,如果这样的深度“太低”,则您的I/O设备不好。某些SSD设备确实会受益于超过32的深度。然而,你能指出任何需要读取访问并且能够保持高于32的iodepth的真实工作负载吗?简而言之:如果您想使用高延迟设备复制一些疯狂高的读取基准数,请使用iodepth=256 --numjobs=4
,但永远不要期望在真实环境中看到这样的数字。 - Mikko Rantalainenmax_sectors_kb
将控制块设备向磁盘提交的最大 I/O 大小。这是一个理想的值,因为我们假设 I/O 越大,每个 I/O 需要完成的工作就越少。稍微复杂的是,某些设备会暴露出“持续 I/O 的首选单元”值,如果存在于 /sys/block/<dev>/queue/optimal_io_size
中的值不为零(通常只发生在某些 RAID 设备上),使用该值可能会得到更好的速度。 - Anonoptimal_io_size
的真正意思是应该避免小于此大小的数据传输。例如,一个物理扇区大小为4 KB但逻辑扇区大小为512字节的硬盘可能会报告 optimal_io_size
为 4096
。然而,这并不意味着写大文件的最佳方式是分多个4 KB块写入。相反,它指示如果软件可以避免使用小于 optimal_io_size
的写操作,则设备将工作得更快。 - Mikko Rantalainen/sys/block/<disk>/queue/physical_block_size
与 [...]/logical_block_size
(例如,一个接受512字节(逻辑)I/O的SSD,但其“块”实际上是4096字节大,这意味着它将做额外的工作来应对512字节的I/O)。在这种情况下,optimal_io_size
很少会是0,但是 minimum_io_size
(“首选最小粒度”)可能是4096。当我看到非零的 optimal_io_size
时,它通常很大(例如4MiB),与物理大小相比,并反映了RAID阵列条带大小。 - Anonmax_sectors_kb
,但是没有考虑到 DMA 引擎也可能限制请求的大小。 - Mikko Rantalainen/dev/urandom
,因为它是基于软件的,速度慢得像猪一样。最好从ramdisk中获取一块随机数据。在硬盘测试中,随机性并不重要,因为每个字节都按原样写入(即使在使用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
top
命令。iotop
:sudo apt-get install iotop
sudo iotop
iostat -tmxyz 10
命令,它将每10秒发出一次测量。iotop
非常适合找到导致大量IO的单个进程,但是iostat
更适合确定负载如何分布在实际硬件设备上(例如,如果您使用LVM或RAID)。 - Mikko Rantalainen写入速度
$ 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
读取速度
运行以下命令以清除内存缓存
$ 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
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
更多内容请参考:简单BONNIE++示例。