为什么 SSD 上的 NVMe 连接不能加快非顺序访问速度?

为什么 SSD 上的 NVMe 连接不能加快非顺序访问速度?

如果你要以五倍的速度(SATA SSD 的)传输 1GB 文件,或者以五倍的速度传输 1,000 个 1MB 文件,这有什么关系呢?它应该始终是 SSD 速度的五倍。

但在现实生活中,非顺序访问相对于 SATA SSD 只有很小的优势。

编辑

由于答案集中在大文件和小文件之间的差异上,让我澄清一下我的问题:

  • 是的,小文件会有开销。
  • 是的,他们会浪费时间阅读那些会被忽略的数据。
  • 但这与我的问题无关,因为每次读写(包括那些讨厌的小 MFT 写作等……)将(或者更确切地说应该)看到 x5 速度增益。

说浪费了驱动器访问并不能改变这一点。我不是问为什么 1GB 不如 1000 个 1MB 快。我问的是为什么:

(1GB_NVMe/1GB_SSD)!=(1000x1MB_NVMe/1000x1MB_SSD)

答案1

这里的问题是,虽然由于使用闪存,NVMe 和 SSD 总体上比旋转生锈更快,但 NVMe 每秒传输数 GB 数据的能力是由于闪存围绕控制器的排列方式。

快速闪存设备实际上使用了一种类似于 RAID0 的方案,这些方案本身就是快速闪存芯片。每个芯片本身可以处理一定的速度,但与其同类芯片捆绑在一起可以通过同时将数据写入和读取到多个设备来实现更高的总速度。

实际上,大型传输可以利用传输并行性并从多个芯片请求多个块,从而将原本 8 次寻道时间减少为一次寻道(跨多个芯片),同时传输量也更大。控制器将具有缓冲和排队功能,以便能够按顺序将数据流向所需的任何方向。

各个闪存芯片本身也可以配置为提前读取几个块以供将来的请求,并且(对于写入)将其缓存在一个小的内部缓冲区中,以进一步减少未来请求的延迟。

处理大量小文件的问题在于,它最终会破坏用于实现单个大规模传输的所有智能。控制器必须在闪存设备之间排队,请求数据块,等待响应,查看队列中的下一个项目,请求该数据等等。

如果正在读取或写入的数据位于另一个芯片上,那么它可能能够使用多个通道,但如果很多请求在一段时间内都出现在同一个芯片上,那么它可能很多那么你最终看到的是单个闪存芯片的性能,而不是整个芯片阵列

因此,数千次小的读取或写入实际上只能显示 NVMe 设备一小部分的性能,而不是设备在所谓“完美”条件下的全部能力。

答案2

复制许多文件涉及在 主文件表 (MFT) 它是 NTFS 文件系统的一个组成部分(具有 NTFS 以外其他文件系统的等效组件)。

这意味着创建文件首先需要搜索 MFT 中的名称,以避免重复,然后分配空间,复制文件,最后完成 MFT 中的条目。

正是这种簿记开销大大减慢了许多文件的复制速度。开销包括匹配操作系统中的工作、更新 RAM 表、计算机中断、系统调用等。关闭文件还会导致操作系统将其刷新到磁盘,这会花费时间并干扰数据的顺利复制,从而使 NVMe 无法实现更接近其潜力的性能。

注意:许多文件复制速度慢的问题并非 NVMe 独有。我们看到任何类型的快速磁盘(无论是机械磁盘、SSD、SATA 还是 NVMe)都存在完全相同的问题。在我看来,这证明问题出在操作系统对这种情况的处理效率低下,可能是因为缓存算法和/或磁盘驱动程序效率低下。

相关内容