![定义](https://linux22.com/image/1548216/%E5%AE%9A%E4%B9%89.png)
我的 4K 速度有什么问题?为什么这么慢?还是本来就应该是这样的?
这个速度可以吗?为什么我的 4K 速度这么慢?
答案1
您遇到的情况是机械硬盘的典型问题,也是固态硬盘的主要优势之一:硬盘具有糟糕的随机存取性能。
在 CrystalDiskMark 中,“Seq”表示顺序的而“4K”意味着随机的访问(每次以 4kB 的块为单位,因为单个字节太慢且不现实1)。
定义
大致而言,有两种不同的方式来访问文件。
顺序访问
顺序访问意味着您或多或少地一个字节接一个字节地读取或写入文件。例如,如果您正在观看视频,您将从头到尾加载视频。如果您正在下载文件,它将从头到尾下载并写入磁盘。
从磁盘的角度来看,它看到的命令像“读取块#1,读取块#2,读取块#3,读取字节块#4” 1。
随机访问
随机的访问意味着读取或写入没有明显的模式。这并不一定意味着真正随机;它实际上意味着“非连续”。例如,如果您同时启动许多程序,它们将需要读取分散在驱动器上的大量文件。
从驱动器的角度来看,它看到的命令包括“读取块#56、读取块#5463、读取块#14、读取块#5”
区块
我已经多次提到块。由于计算机处理的是这么大的数据(1 MB ~= 1000000 B),因此,如果必须向驱动器询问每个字节,即使是顺序访问也是低效的 - 有太多的喋喋不休。实际上,操作系统请求块每次从磁盘读取数据。
A堵塞只是一个字节范围;例如,块 #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 的视频,您可以看到旋转的磁盘和移动的臂。
图片来源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 块需要 5.003125 毫秒,而不是平均每个连续 512 B 块需要 0.003125 毫秒。这就是很多很多慢了好几倍。事实上,慢了数千倍。
固态硬盘
幸运的是,我们现在有一个解决方案:SSD。
SSD,固态硬盘顾名思义,固体状态。这意味着它有无活动部件此外,SSD 的布局方式意味着(实际上3)无需查找字节的位置;它已经知道。这就是为什么 SSD 在顺序访问和随机访问之间的性能差距要小得多。
仍然存在差距,但这在很大程度上可以归因于无法预测接下来会发生什么,并且预加载在被请求之前获取该数据。
1更准确地说,出于效率原因,LBA 驱动器以 512 字节 (512n/512e) 或 4kB (4Kn) 为单位进行寻址。此外,实际程序几乎从来不需要每次只使用一个字节。
2从技术上讲,寻找仅指手臂行程。等待数据在头部下方旋转是旋转潜伏期在寻道时间之上。
3从技术上讲,它们确实具有查找表并出于其他原因进行重新映射,例如磨损均衡,但与 HDD 相比,这些完全可以忽略不计......
答案2
正如其他答案所指出的那样,“4K”几乎肯定是指以 4 KiB 大小的块进行的随机访问。
每次要求硬盘(不是 SSD)读取或写入数据时,都会涉及两个显著的延迟:
- 寻道延迟,即读/写磁头“寻道”到盘片上正确的圆形磁道(或“柱面”)所需的时间,包括磁头在磁道上稳定下来并与盘片上存储的数据同步所需的时间
- 旋转延迟,即读/写头下方的旋转盘片的旋转时间,使得磁道的所需部分(“扇区”)通过磁头下方
对于任何给定的驱动器来说,这两者都是相对恒定的时间。寻道延迟与磁头移动速度和需要移动距离有关,而旋转延迟与盘片旋转速度有关。此外,在过去的几十年里它们没有发生太大的改变。制造商实际上过去常常使用平均寻道时间,例如在广告中;当该地区发展不大或没有发展时,他们几乎不再这样做。没有哪个制造商,特别是在竞争激烈的环境中,希望自己的产品看起来不比竞争对手的产品好。
典型的台式机硬盘转速为 7200 rpm,而典型的笔记本电脑驱动器转速可能约为 5000 rpm。这意味着它每秒总共旋转 120 圈(台式机驱动器)或约 83 圈(笔记本电脑驱动器)。由于一般磁盘需要旋转半圈,所需扇区才能通过磁头下方,这意味着我们可以预期磁盘每秒能够处理大约两倍的 I/O 请求,假设
- 寻道要么在磁盘旋转时进行(对于当今的硬盘来说,这可能是一种安全的选择,因为 I/O 涉及寻道),和寻道延迟不长于特定 I/O 的旋转延迟
- 或者头部恰好已经位于正确的气缸上方,造成驱动器不需要寻道(这是上述情况的特殊情况,寻道延迟为零)
因此,如果要求访问的数据(用于读取或写入)在物理上相对局部化,则我们应该能够以每秒 200 次 I/O 的速度执行,从而导致旋转延迟成为限制因素。在一般情况下,如果数据分散在一个或多个盘片上,则我们预计驱动器能够以每秒 100 次 I/O 的速度执行,这需要相当多的寻道,并导致寻道延迟成为限制因素。在存储方面,这是“每秒输入/输出次数硬盘的“性能”;这通常是实际存储系统的限制因素,而不是顺序 I/O 性能。(这是 SSD 使用速度更快的一个重要原因:它们消除了旋转延迟,并大大减少了寻道延迟,因为读/写头的物理移动变成了闪存映射层表中的表查找,这些表以电子方式存储。)
当涉及缓存刷新时,写入速度通常会变慢。通常,操作系统和硬盘会尝试重新排序随机写入,以尽可能将随机 I/O 转换为顺序 I/O,以提高性能。如果有显式缓存刷新或写屏障,这种优化被消除,目的是确保持久存储中的数据状态与软件预期一致。基本上,在没有磁盘缓存的情况下读取时也适用相同的推理,要么是因为不存在磁盘缓存(目前在桌面式系统中并不常见),要么是因为软件故意绕过它(这在测量 I/O 性能时经常发生)。这两种情况都会将最大潜在 IOPS 性能降低到更悲观的情况,或者对于 7200 rpm 驱动器,降低到 120 IOPS。
- 在 100 IOPS、每 I/O 4 KiB 的情况下,我们获得大约 400 KB/s 的性能。
- 在 200 IOPS、每 I/O 4 KiB 的情况下,我们获得大约 800 KB/s 的性能。
这恰好与您的数字几乎完全匹配。小块大小的随机 I/O 绝对是旋转硬盘的性能杀手,这也是为什么它是一个相关指标。
至于纯顺序 I/O,150 MB/s 范围内的吞吐量对于现代旋转硬盘来说完全不合理。但现实世界中很少有严格顺序的 I/O,因此在大多数情况下,纯顺序 I/O 性能更像是一种学术活动,而不是真实性能的指标。
答案3
4K 是指随机输入/输出。这意味着要求磁盘在测试文件中的随机点访问小块(大小为 4 KB)。这是硬盘的一个弱点;访问磁盘不同区域数据的能力受到磁盘旋转速度和读写头移动速度的限制。顺序 I/O其中访问连续块的过程要容易得多,因为驱动器可以在磁盘旋转时简单地读取或写入块。
固态硬盘 (SSD) 不存在随机 I/O 问题,因为它只需查找底层内存(通常是 NAND 闪存,可以是 3D XPoint 甚至 DRAM)中存储数据的位置,然后在适当的位置读取或写入数据。SSD 完全是电子的,不需要等待旋转磁盘或移动读写头来访问数据,这使得它们在这方面比硬盘快得多。正是出于这个原因,升级到 SSD 可以显著提高系统性能。
附注:SSD 上的顺序 I/O 性能通常也比硬盘高得多。典型的 SSD 有多个 NAND 芯片与闪存控制器并行连接,并且可以同时访问它们。通过在这些芯片上分布数据,可以实现类似于 RAID 0 的驱动器布局,从而大大提高性能。(请注意,许多较新的驱动器,尤其是较便宜的驱动器,使用一种称为 TLC NAND 的 NAND,这种类型的 NAND 在写入数据时往往很慢。带有 TLC NAND 的驱动器通常使用较快 NAND 的小缓冲区来为较小的写入操作提供更高的性能,但一旦该缓冲区已满,速度就会急剧下降。)