问题标签 [nvme]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
nvme - 4K 数据传输可以使用多少个 SGL 描述符?
似乎 NVMe 规范对此几乎没有限制。理论上,我可以为 4K 数据传输创建一个包含 4K 描述符的段,例如
它看起来不切实际,但仍然不违反规范,对吗?
qemu - 如何从另一台设备访问 pci 设备
我正在 qemu 中创建新的 PCI 设备,它是部分 DMA 和部分 NVMe 控制器。
我需要从我的新设备中获取 NVMe 设备的物理地址以使用
dma_memory_read(...)
是否有获取新设备地址的功能?
没有物理地址我可以使用其他功能吗?
还有另一种方法可以通过指针吗?
driver - 如何使用安装在设备中的 nvme linux 驱动程序调用 pcie 函数
我是 linux 设备驱动程序的新手。我熟悉 pcie 和 nvme 的 linux 驱动程序代码。我已经加载了 linux nvme 驱动程序并且能够通过 nvme cli 发送读、写命令。加载 nvme 驱动程序后,有没有办法将 pcie commads(改变速度,车道)发送到设备。对现有 nvme 驱动程序代码有哪些更改?主要目标是移植一堆 pcie 测试用例以与 nvme 读/写并行运行。
caching - ARM v7 缓存行为和使用
我正在调整 u-boot 以支持 Cyclone V SX PCIe + NVMe。我通过对版本 2020.10 socfpga fork 的一系列黑客攻击使其工作。
我有两个问题需要解决:
u-boot 似乎并不理解 PCI 地址空间和主机地址空间不一定相同,当 nvme 获取分配给 PCIe 端口的地址时,PCI 驱动程序假定读取的地址直接映射到主存储器。它没有。它完全映射到另一个地址。我有一个黑客来处理这个问题。我将尝试向 u-boot 中的设备树实用程序添加一项功能,以在不破坏现有功能的情况下进行地址转换。
在 NVMe 执行命令后,nvme 驱动程序处理清除和无效缓存以获取对内存的更改的方式存在重大问题。门铃寄存器需要在轮询期间在传出时清除并在传入时无效,也就是说,在各种方面几乎完全错误。
这是我需要指导的地方。
u-boot 中有两位代码用于处理缓存清除/失效。一个是arm v7核心代码的一部分,另一个是pl310控制器代码。arm v7 代码认为缓存行是 64 字节,pl310 代码认为缓存行是 32 字节。什么?
nvme 代码正在使用这两个代码。我认为清除通过 pl310 和无效通过 arm v7,但我可能在这一点上倒退了,我还在学习,很容易把它们混在一起。
nvme 驱动程序的问题很简单:它要求清除未缓存对齐的地址范围,并且两个代码都阻塞并做错了事情,最终不会清除或使需要清除和无效的缓存无效。在 pl310 的情况下,它对起始地址进行四舍五入并且不做任何事情,在 arm v7 代码的情况下,如果开始和停止,在将它们对齐到 64 字节边界后,是相同的,代码确实没有什么。
我通过在 nvme 代码中强制对齐到 64 个字节来解决这个问题,并确保它通过在 stop 上添加一个来清除缓存,如果它与 arm v7 调用的情况下的 start 相同。
如果你还在关注我。谢谢,我真的很感激。
解决此问题的正确方法是什么。这些代码都不是我的。在我看来,缓存代码中存在错误。pl310 不应该在起始地址上加一,也许它应该在停止地址上加一,这取决于 for 循环的编写方式。用于在 arm v7 代码中失效的 for 循环应至少运行一次,以确保它清除起始位置。所以无效循环应该是<=,而不是<。
如果有人感兴趣,我可以发布此代码,请告诉我。
但最大的问题是:为什么有两种方法可以清除/使缓存无效,为什么两者都被使用?在我看来,由于 Cyclone V 使用 pl310 缓存控制器,它的代码应该用于清除和无效。这是通过#define 配置的,用于确定调用了哪些代码,并且告诉我这也应该修复。
意见?选项?想法?
我是开放的,请让我知道你的想法。
python - NVME 通过 Tensorflow 读取神经网络训练数据的速度上限
当使用 4 个线程的 SSD 训练具有 200gb 训练数据的神经网络时,每个 worker 读取大约 130mb/s(这是合理的,因为 SSD 的读取上限约为 550mb/s,4*130=520)并且每个 CPU 核心是以大约 50% 的容量运行。
我跑来hdparm
验证我的 SSD 的读取速度上限和检查的数字(517mb/s ~ 520mb/s)
我想如果我提高读取速度上限,我会加快训练速度,所以我得到了一个最大读取速度为 3.4gb/s (WD_BLACK SN750) 的 NVME。当训练数据存储在那里时,每个线程的速度为 180mb/s,每个 CPU 内核的运行速度为 65-70%。
显然我没有利用新存储的所有读取速度(180*4 = 720mb/s)
我想也许它有缺陷所以我跑了hdparm
......
...并且它运行的数量比神经网络训练线程更高。不完全是 3.4gb/s,但仍然更大!(1.4gb/s > 720mb/s)。
为什么它没有以 CPU 赶上的最大速率尽可能快地读取?如何消除这个新瓶颈?NVME 是否有一些我不知道的奇怪情况?
这是培训电话
谢谢!
raspberry-pi - 树莓派 CM4 UBoot NVME 访问
有没有人有一个有效的 UBoot 配置来从运行在 Raspberry Pi CM4 上的 UBoot 访问 NVME 驱动器?
我已经编译了所有内容,并且 UBoot 正在正确检测我的 NVME:
但它不调用 nvme_uclass_post_probe() ,因此它不创建任何块设备。
从 UBoot 命令行运行命令“nvme scan”,我在 nvme_submit_sync_cmd() 中遇到了超时。-> 超时。
我正在使用带有最新固件“S5Z42109”的金士顿 A2000 SDD。
有人有想法吗?谢谢。
amazon-ec2 - NVMe EBS 卷:在 /dev/nvme1n1 增加 /home 分区,但 growpart 不起作用
我向我的 aws 卷添加了 50G 的存储空间,以便将 /home 分区的大小调整为 50G。
我运行以下命令:
有什么建议么?我习惯于使用 vmware/LVM。AWS 架构对我来说很新。我错过了哪些步骤?
linux - 如何在 /sys/kernel/config/nvmet/ports 下创建软链接(符号链接)?
由于我正在尝试在服务器上配置 NVMet-RDMA 目标,因此我想通过以下命令创建符号链接(根据https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html /managing_storage_devices/overview-of-nvme-over-fabric-devicesmanaging-storage-devices#setting-up-nvme-rdma-target-using-nvmetcli_nvme-over-fabrics-using-rdma):
但是此命令返回诸如“参数无效”之类的错误。我应该怎么办?
ioctl - nvme-cli 发送 io-passthru,data_len 等于 max_sectors_kb,显示“passthru:无效参数”
我有一个三星 970 EVO Plus,max_sectors_kb 是 1280,max_hw_sectors_kb 是 2048,我想发送命令“nvme io-passthru /dev/nvme0 -n 1 -o 2 -4 0 -5 0 -6 2560 -l 1310720 - r”在一个命令中读取 1280k 数据,但它显示“passthru: Invalid argument”。在哪里限制命令发送到设备?
rpc - 如何实现:主机A将数据写入其本地nvme磁盘,然后主机B通过远程访问磁盘读取值?
如果我们使用 spdk_rpc,A 和 B 是否使用相同的逻辑地址(命名空间)?我们是否需要使用命名空间共享来解决这个问题?(或多路径 I/O?)