SATA M.2 SSD 在物理层上使用 SATA,并使用 ATA 作为数据传输的软件协议。
NVMe M.2 SSD 在物理层使用 PCIe,并使用 NVMe 作为数据传输的软件协议。
我被告知这个问题。
当然,PCIe 比 SATA 更快,因此 NVMe SSD 的速度更快。
但为什么它需要新的软件协议?为什么我们不能让 PCIe M.2 SSD 支持 ATA?(*)
我认为更高的速度来自 PCIe,而不是来自 NVMe 协议。我们为什么需要 NVMe?
(*) 我认为 AHCI 不是必需的,因为 SSD 可以通过其 PCI 地址寻址。此外,ATA 可以传输磁盘大小等元数据。
答案1
虽然我再也找不到相关参考资料了,但我记得的一个具体区别是 NVMe 的设计目的是高度平行。我可能记错了,但是:
通过传统 IDE 的 ATA 根本不支持并行命令。
ATA 通过 AHCI 支持 NCQ,允许发出最多 32 条命令(这些命令可能以任何顺序返回数据),尽管并非所有命令都是“可排队的”。SCSI 还支持“标记排队”,允许发出最多 16 条命令。
如果我理解正确的话,这意味着使用固态磁盘(没有“寻道时间”),这些数字足够低,即使是最大大小的队列也会立即处理,并且磁盘会返回到不执行任何操作的状态,直到主机注意到并发出更多请求。
另一方面,NVMe 的设计允许最多 64,000 个排队命令,从而允许 SSD 在需要时保持持续繁忙。
类似的比较可以参见群联(一家 SSD 控制器制造商)的博客,具体来说这张桌子,其中写道:
- AHCI仅支持单个命令队列;NVMe并行支持多个队列。
- AHCI 对连接到同一控制器的所有端口使用单个中断;NVMe 允许多个中断。
- 据我了解,这意味着单个 CPU 核心必须处理来自/到连接到 AHCI 控制器的所有磁盘的所有 I/O,而 NVMe 允许不同的核心同时读取或写入数据。 (但也许大多数 NVMe 磁盘都带有自己的控制器,而 AHCI 控制器通常每个系统一个,或很少两个,这也可能有帮助。)
也可以看看:
- https://sata-io.org/system/files/member-downloads/NVMe%20and%20AHCI_%20_long_.pdf
- 类似的比较可以参见https://phisonblog.com/ahci-vs-nvme-the-future-of-ssds-2/
为什么我们不能让 PCIe M.2 SSD 支持 ATA?(*)
(*) 我认为 AHCI 不是必需的,因为 SSD 可以通过其 PCI 地址来寻址。
即使 SSD 自带控制器(一些早期的 NVMe 前 SSD 确实有!),你仍然需要 AHCI 之类的东西,因为它定义了如何磁盘需要通过其 PCI 地址进行访问,等等。AHCI 与获取磁盘特定信息无关 - 这些信息始终通过 ATA“识别设备”和类似命令完成。但需要就如何将这些命令提交给磁盘以及如何接收响应(特别是 DMA 和队列等)达成一致 - 这就是 AHCI 的目的。
当然,SSD 可以使用 ATA 而不是 AHCI,只要操作系统有相应的驱动程序(就像许多在 AHCI 出现之前),但最终这些“非标准”设备会趋向于一种新的标准协议,无论它被命名为NVMe还是其他。
(尽管 ATA 已经可以在没有 AHCI 的情况下通过传统 PCI IDE 接口或通过网络(如 AoE(以太网上的 ATA))使用,但它在这些用途上并不像 SCSI 那样流行——SCSI 也可以通过不同的传输方式使用,如 SAS、FireWire、Infiniband 和 iSCSI;最后 NVMe 可以通过使用 NVMe-oF 的网络使用。)