Answers:
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
您还想要其他东西吗?
/dev/urandom
以及/dev/zero
输入,dd
因为数据的可压缩性会对写入速度产生巨大影响。
/tmp
如今,文件系统经常使用虚拟磁盘。因此,写入/tmp
似乎在测试您的内存,而不是磁盘子系统。
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
我不建议使用,/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以上。
基准测试愉快
如果需要准确性,则应使用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
获得规格号,因为那些固态硬盘的内部延迟设备更高,但总体吞吐量很疯狂。
max_sectors_kb
。我将上面的示例命令更改为使用1 MB的块大小,因为这似乎适用于实际的硬件。而且我还测试fsync
了阅读的重要性。
iodepth
选择1
进行随机访问,正是因为现实世界中的程序经常运行的算法/逻辑深度不能大于1。因此,如果这种深度“太低”,则您的I / O设备就不好了。的确,某些SSD设备将受益于高于32的深度。但是,您能否指出任何需要读取访问并且能够保持高于32的深度的实际工作负载?TL; DR:如果您想用高延迟设备重现一些疯狂的高读取基准数字,请使用,iodepth=256 --numjobs=4
但不要指望真正看到这样的数字。
bonnie ++是我所知道的Linux终极基准测试实用程序。
(我目前正在准备与bonnie ++一起使用的Linux livecd,以使用它来测试基于Windows的计算机!)
它负责缓存,同步,随机数据,磁盘上的随机位置,小尺寸更新,大更新,读取,写入等。比较USB密钥,硬盘(旋转),固态驱动器和基于ram的硬盘文件系统对于新手可能非常有用。
我不知道它是否包含在Ubuntu中,但是您可以轻松地从源代码编译它。
写速度
$ 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
关于如何使用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。