为什么我的硬盘在“ 4K”速度测试中这么慢?


46

我的4K速度有什么问题?为什么这么慢?还是应该这样?

基准测试屏幕截图

这样的速度还好吗?为什么我的4K速度这么慢?


13
这是正常的和预期的。在这种情况下,“ 4K”表示随机读取/写入(以4 KB为块,因此为“ 4K”),机械式HDD会非常出色地执行此操作。那就是您想要SSD的地方。请参阅此处以获得更深入的说明。
鲍勃,

之所以使用4Kb,是因为它是磁盘群集的典型大小,在许多现代HDD上,它是实际扇区(磁盘本身的低层结构)的大小。即,即使请求的数据较小,一次读取或写入中可能一次传输的数据量也最小。有趣的是,到目前为止,此页面上的“否”答案甚至都提到了群集或扇区。
thomasrutter

2
@thomasrutter因为它与答案无关。重要的是该测试涉及随机寻找。(在某种程度上)传输多少数据与磁盘扇区大小的倍数无关(在某种程度上)。重要的部分是测试会传输最少的数据以衡量搜索性能。
米歇尔·约翰逊

该测试是在分区上还是在整个磁盘上?如果您的磁盘具有4K物理扇区但逻辑扇区为1K,并且分区边界未对准跨扇区,则分区级别测试对于4K访问的性能可能会更差。
Toby Speight

现代的分区工具倾向于确保分区在扇区边界上开始和结束。现在甚至只有1MB的粒度。旧的“ 63 512字节扇区”的日子已经一去不复返了,这将对4Kb本机扇区造成问题。
thomasrutter

Answers:


85

你正在运行到是典型的机械硬盘,而固态硬盘的的主要好处之一:硬盘有可怕的随机访问性能。

在CrystalDiskMark中,“ Seq”表示顺序访问,而“ 4K”表示随机访问(一次为4kB,因为单个字节太慢且不切实际1)。


定义

大致而言,您可以使用两种不同的方式访问文件。

顺序访问

顺序访问意味着您一个字节接一个字节地读写文件。例如,如果您正在观看视频,则应从头到尾加载视频。如果要下载文件,则会从头到尾下载文件并将其写入磁盘。

从磁盘的角度来看,它看到诸如“读取块#1,读取块#2,读取块#3,读取字节块#4” 1之类的命令

随机访问

随机访问意味着没有明显的读取或写入模式。这不一定意味着真正的随机性。它的真正含义是“不是顺序的”。例如,如果您要立即启动大量程序,则它们需要读取分散在驱动器周围的大量文件。

从驱动器的角度来看,它看到诸如“读取块#56,读取块#5463,读取块#14,读取块#5”之类的命令。

积木

我已经提到过很多次了。因为计算机处理的是如此大的大小(1 MB〜= 1000000 B),所以如果您必须向驱动器询问每个单独的字节,那么即使顺序访问也效率不高-太多的杂音。实际上,操作系统一次向磁盘请求数据

一个只是一个字节范围;例如,块#1可能是字节#1-#512,块#2可能是字节#513-#1024,依此类推。这些块的大小为512字节或4096字节,具体取决于驱动器。但是,即使在处理块而不是单个字节之后,顺序块访问也比随机块访问要快。


性能

顺序的

顺序访问通常比随机访问快。这是因为顺序访问使操作系统驱动器可以预测接下来将需要什么,并预先加载很大的块。如果您请求的块为“ 1、2、3、4”,则操作系统可能会猜测您接下来将要“ 5、6、7、8”,因此它告诉驱动器读取“ 1、2、3、4”一口气找到5、6、7、8英寸。类似地,驱动器可以一次性读取物理存储,而不是“搜寻1,读取1,2,3,4,搜寻5,读取5,6,7,8”。

哦,我提到要寻求一些东西。由于机械硬盘的物理布局方式,它们的寻道时间很慢:它们由许多重金属化的磁盘组成,其中物理臂来回移动以读取磁盘。这是一个打开的HDD的视频,您可以在其中看到旋转的磁盘和移动的臂。

HDD内部图
图片来自http://www.realtechs.net/data%20recovery/process2.html

这意味着在任何时候,都只能读取臂末端头部下方的数据位。驱动器需要等待两件事:它需要等待机械臂移至磁盘的右环(“轨道”),并且还需要等待磁盘旋转,以便所需的数据处于读取状态头。这称为寻求2。旋转的手臂和活动的手臂都需要花费物理时间才能移动,因此,在不造成损坏风险的情况下,它们不会被加速得太多。

这通常会花费非常长的时间,比实际读数要长得多。我们说的是> 5ms只是为了到达请求的字节所在的位置,而该字节的实际读取平均每个顺序读取的字节大约为0.00000625ms(或每个512 B块为0.003125ms)。

随机

另一方面,随机访问没有可预测性的好处。因此,如果您想读取8个随机字节(例如,从块“ 8,34,76,996,112,644,888,341”中读取),则驱动器需要转到“搜索8,读取8,搜索34,读取34,搜索76,读取76,...”。 。请注意,它需要如何针对每个块再次进行搜索?而不是每个顺序的512 B块平均0.003125ms,而是每个块的平均数(5毫秒寻道+ 0.003125毫秒读取)= 5.003125毫秒。那要慢很多很多倍。实际上,速度降低了数千倍。

固态硬盘

幸运的是,我们现在有一个解决方案:SSD。

顾名思义,固态硬盘是固态硬盘。这意味着它没有运动部件。此外,SSD的布局方式意味着(实际上是3)无需查找字节的位置。它已经知道了。因此,SSD在顺序访问和随机访问之间的性能差距要小得多。

仍然存在差距,但这在很大程度上归因于无法预测接下来会发生什么并且无法在请求数据之前预加载该数据。


1更准确地说,出于效率考虑,使用LBA驱动器以512字节(512n / 512e)或4kB(4Kn)的块进行寻址。而且,实际程序几乎永远不会一次只需要一个字节。

2从技术上讲,搜寻仅指手臂的行程。等待数据在头部下方旋转的原因是查找时间之上的旋转延迟

3从技术上讲,由于其他原因(例如磨损平衡),它们确实具有查找表和重新映射,但是与HDD相比,它们可以忽略不计...


@KamilMaciorowski我实际上现在正在重新考虑这种简化,因为它确实使我的寻道+读取时间计算不起作用。那好吧。对于概念而言,它并不是太重要。
鲍勃(Bob)

您应该更正随机部分:Notice how it needs to look for every single byte?替换byteblock(并相应地更改示例)。该驱动器寻找4k部分(可以进一步分散到512bytes块中,但不能低于此部分。它不会在每个字节之间寻找!如果下一个块不在紧随其后,它将在每个块之间寻找(这种情况经常发生)寻找(将磁头绕着磁盘移动,并等待该块在其下方通过)需要很长时间(几毫秒)
Olivier Dulac

2
对4 kiB / 512B的小注释。4kiB也是页面大小,因此,几乎所有内容都如此,因此即使LBA驱动程序读取512 B块,OS $也可能会预读全部4 kiB块。而且我也不认为问题在于HDD需要“查找”除SDD以外的任何字节,而不是其物理旋转到正确位置所需要的。如果您再次访问该块,则由于HDD持续旋转,您需要再次查找它。任何重新映射的块都可能是次要的效果(重新映射的块通常是在一个被破坏的地方,无论如何我都会尽量减少寻道)。
Maciej Piechotka

(可能是完整的旁注-我不确定NAND / NOR,但至少DDR寻址也不是完全随机的,顾名思义,但可以在地址“突发”中使用。在大多数情况下,由于它是64 B,大小为大多数CPU $行的大小,但对于其他应用程序则可能更大。)
Maciej Piechotka

1
@OlivierDulac我仍然认为引入块可能会造成混淆,但是我已经尝试对其进行解释。答案已更新。
鲍勃(Bob)

3

正如其他答案已经指出的那样,“ 4K”几乎可以肯定是指大小为4 KiB的块中的随机访问。

每次要求硬盘(不是SSD)读取或写入数据时,都会涉及两个重大延迟:

  • 寻求等待时间,以使读/写磁头“搜索”到盘片上的正确圆形磁道(或“圆柱体”),包括磁头在磁道上稳定并与存储在盘片上的数据同步所需的任何时间
  • 旋转等待时间,使读/写头下方的旋转磁盘旋转,以使磁道的所需部分(“扇区”)通过磁头下方

对于任何给定的驱动器,这两者的时间量都相对恒定。搜索等待时间是头部可以移动多快以及需要移动多远的函数,而旋转等待时间是磁盘旋转多快的函数。而且,在过去的几十年中它们没有太大变化。制造商实际上通常使用平均搜索时间,例如在广告中;当该地区几乎没有发展时,他们几乎停止这样做。没有制造商,尤其是在竞争激烈的环境中,不希望他们的产品看起来比竞争对手的产品更好。

典型的台式机硬盘转速为7200 rpm,而典型的笔记本电脑驱动器转速约为5000 rpm。这意味着,每秒总共经过120转(台式机驱动器)或约83转(笔记本电脑驱动器)。由于平均而言,在所需扇区通过磁头之前,磁盘将需要旋转半圈,因此这意味着我们可以期望磁盘每秒能够处理大约两倍于许多I / O请求的速度。

  • 要么在磁盘旋转时完成查找(对于当今涉及I / O的硬盘来说,这可能是一个安全的选择),并且查找延迟不超过特定I / O的旋转延迟
  • 或磁头恰好已经在正确的圆柱体上,从而导致驱动器无需搜索(这是上述情况的一种特殊情况,搜索等待时间为零)

因此,如果要求访问(读取或写入)数据的物理位置相对本地化,那么我们应该期望能够以每秒200 I / O的速度执行,从而导致旋转等待时间成为限制因素。在一般情况下,如果数据分散在一个或多个磁盘上,则我们期望驱动器能够以每秒100 I / O的速度执行,这需要大量的查找并将查找延迟作为限制因素。在存储方面,这是“ IOPS硬盘性能”,而不是顺序I / O性能,通常是实际存储系统中的限制因素。(这是SSD如此之快使用的一个重要原因:它们消除了旋转延迟,并且由于读/写头的物理移动成为闪存映射层表中的表查找(以电子方式存储),因此大大减少了查找等待时间。)

当涉及到缓存刷新时,写入通常会比较慢。通常,操作系统和硬盘会尝试对随机写入进行重新排序,以在可能的情况下将随机I / O转换为顺序I / O,以提高性能。如果存在显式的缓存刷新或写入障碍,则为了确保持久性存储中的数据状态与软件预期的一致,将取消此优化。基本上,在不涉及磁盘高速缓存的情况下,读取时会应用相同的推理,这是因为不存在磁盘高速缓存(今天在台式机系统上并不常见),或者由于软件故意绕过磁盘高速缓存(在测量I / O性能时通常会这样做)。这两种情况都将最大潜在IOPS性能降低到了更为悲观的情况,对于7200 rpm驱动器,则降低了120 IOPS。

  • 在每个I / O 4 KiB处达到100 IOPS时,我们的性能约为400 KB / s。
  • 在每个I / O为4 KiB时以200 IOPS的速度运行时,我们可以获得约800 KB / s的性能。

恰好恰好与您的数字完全匹配。小块大小的随机I / O是旋转硬盘绝对的性能杀手,这也是为什么它是一个重要指标的原因。

至于纯顺序I / O,对于现代旋转硬盘而言,150 MB / s的吞吐量并不是完全不合理的。但是很少有现实世界中的I / O严格按顺序执行,因此在大多数情况下,纯粹的顺序I / O性能更多地是一项学术练习,而不是实际性能的指标。


这是一个很好的答案,而且读起来比我的要好得多:)仅需注意,至少Seagate仍在其数据表中指定了平均搜索延迟。WD似乎没有。
鲍勃(Bob)

@鲍勃,谢谢。我实际上是指广告和类似内容;我已经编辑了答案以澄清这一点。我认为可以肯定地说,很少有人阅读数据表,尽管这样做对许多人来说可能是一个发人深省的经历……
CVn

2

4K指的随机I / O。这意味着要求磁盘在测试文件中的随机位置访问小块(大小为4 KB)。这是硬盘驱动器的弱点。跨磁盘不同区域访问数据的能力受到磁盘旋转速度和读写磁头移动速度的限制。顺序I / O可以方便地访问连续的块,因为驱动器可以在磁盘旋转时简单地读取或写入这些块。

固态驱动器(SSD)的随机I / O不会出现此类问题,因为它要做的就是查找数据存储在基础内存中的位置(通常是NAND闪存,可以是3D XPoint甚至是DRAM)并读取或在适当的位置写入数据。SSD完全是电子的,不需要等待旋转的磁盘或移动的读写头来访问数据,因此在这方面,它们比硬盘驱动器快得多。因此,升级到SSD可以大大提高系统性能。

旁注:SSD上的顺序I / O性能通常也比硬盘驱动器高得多。典型的SSD具有与闪存控制器并行连接的多个NAND芯片,并且可以同时访问它们。通过在这些芯片上分布数据,可以实现类似于RAID 0的驱动器布局,从而大大提高了性能。(请注意,许多更新的驱动器,尤其是价格便宜的驱动器,都使用一种称为TLC NAND的NAND类型,在写入数据时趋向于变慢。TLC NAND的驱动器通常使用较小的更快NAND缓冲区来为较小的写入操作提供更高的性能,但可以一旦缓冲区已满,速度就会大大降低。)


IIRC,一些NVMe SSD甚至使用DRAM缓存。
timuzhti

1
大多数都做。低端无盘固态硬盘还算不错。
Journeyman Geek
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.