带有顺序请求选项的 NVME 读/写命令
Posted
技术标签:
【中文标题】带有顺序请求选项的 NVME 读/写命令【英文标题】:NVME read/write command with sequential request option 【发布时间】:2019-11-17 15:24:21 【问题描述】:当 NVME 控制器向 FPGA 发送数据时。 lba 不正常。我们在从 nvme 源磁盘获取具有正确顺序的 lba 时遇到了麻烦。
我正在与 NVMe 合作开发使用三星 SSD 970 PRO 512GB 的项目。 在我们的项目中,我们使用 FPGA 与 NVMe 设备进行通信,但我们的流程遇到了如下问题:
1. FPGA having FIFO buffer mapped with DMAP2P works as destination/from address for NVMe controller to read/write.
2. NVMe driver sends command to NVMe controller, requests a read command with transfer size 4096 lba (2MB).
3. When controller sends data into FPGA. lba is not in order. we got trouble about getting lba with correct order from nvme source disk. (1)
我调查了“数据集管理 (DSM)”,每个读/写命令在 dword 13 内都有“顺序请求”位 [6]。 我确认我们的 NVMe 设备(Samsung 970 Pro)支持 DSM,但看起来它对 NVMe 读取命令中的 lba 传输顺序没有任何影响。
请帮助我澄清每个 NVMe 读取命令中的“顺序请求”选项是什么,正如 NVMe 规范中描述的“命令是顺序读取的一部分 包括多个读取命令”。 是否能够在 NVMe 读取命令中更改 lba 传输顺序? 正如我们所期望的(1)从 NVMe 读取命令(具有大的 lba)中按顺序接收 lba,这可能吗?我们可以为我们的期望做些什么?
【问题讨论】:
写“lba is not in order”是什么意思?请注意,DSM 是建议性的,固件可能会默默地忽略它。 BeginEnd 感谢您的回复。 “lba is not in order” 我的意思是当我发送一个大小为 4096 lba 的 NVMe 读取命令时,目标是 FPGA FIFO 缓冲区。 FPGA接收到的数据不是按顺序排列的,它看起来像lba 1 -> 2 -> 3 -> 5 -> 40 -> 41 -> 6 -> 7 -> 8 -> 20。 【参考方案1】:NVMe 设备是相当复杂的设备,不应被视为原始闪存存储。如果您请求读取存储在 4096 LBA 中的 2MB 数据,您最终可能会读取多个物理芯片。每个芯片可能在内部被划分为更小的逻辑元素。在这个大而长的读取请求期间,每个完整的设备和每个芯片都可能会做一些内务处理,因此某些 LBA 的读取速度可能比其他的快。这完全取决于供应商。如果必须序列化整个请求,这将导致 NVMe 设备必须“缓冲”所有请求的巨大延迟和大量内存。所以我非常怀疑 NVMe 规范中是否存在禁止乱序数据传输的内容。此外,在 NVMe 设备将整个读取报告为已完成之前,您不应假定给定内存范围内的任何有效数据。如果您想序列化 LBA 读取,您应该将您的长请求分成 4096 个单独的请求,并且还可以在每个请求中设置“顺序请求”位。
【讨论】:
感谢您的建议!因为将我的长请求分成4096个单独的请求时传输速度会变慢,也许我会尝试通过物理RAM而不是FIFO来处理缓冲区。以上是关于带有顺序请求选项的 NVME 读/写命令的主要内容,如果未能解决你的问题,请参考以下文章