问题标签 [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.
linux - 回声:写入错误:为 NVMe SSD 设置 io_poll 时参数无效
我以 root 用户身份使用以下命令为 NVMe SSD 设备启用 Linux 内核轮询。
# echo 1 > /sys/block/nvme2n1/queue/io_poll
我收到以下错误:bash: echo: write error: Invalid argument
操作系统详情:Ubuntu 16.04,Linux 内核 5.0.0+。
任何指针?
c++ - 如何快速将无限大小的缓冲区写入 NVMe SSD
我正在开发一个应用程序,其中我有大量数据不断写入 ram,我正在尝试快速从 ram 中读取数据,并将其写入 NVMe SSD,写入完成后,我重新排队 ram 空间以允许它正在写。
我目前的问题是数据无限期地连续写入,所以最终我的 RAM 不足以容纳所有数据,它必须被读出并存储到磁盘中。由于数据量大,写入速度标准很高(1.5G/s)。
我经常看到提到 mmap 来提高 I/O 效率,但主要是读取效率,因为它可以防止将大数据复制到 DRAM。所以我想知道在我的用例中,使用 mmap 将我的 SSD 直接映射为虚拟内存并直接写入它是否比标准 fwrite 更快?
nvme - 如何使用 nvme-cli 测试 NVME 管理命令异步事件请求(操作码 0x0C)?
我已经在 Ubuntu 上安装了nvme-cli,并且想测试驱动器是否真的支持异步事件请求。
我能够在nvme admin-passthru /dev/nvmen1 --opcode=0x0C
没有任何错误的情况下运行,但一段时间后它会因错误(或警告)而超时passthru: Interrupted system call
。
这是否意味着在这种情况下成功注册了异步事件请求?我的理解是异步事件请求永远不应该超时......知道如何通过命令行验证设备是否完全支持此功能?
linux-device-driver - 带有顺序请求选项的 NVME 读/写命令
当 NVME 控制器向 FPGA 发送数据时。lba 不正常。我们在从 nvme 源磁盘获取具有正确顺序的 lba 时遇到了麻烦。
我正在与 NVMe 合作使用三星 SSD 970 PRO 512GB 的项目。在我们的项目中,我们使用 FPGA 与 NVMe 设备进行通信,但我们的过程遇到了如下问题:
我调查了“数据集管理(DSM)”,每个读/写命令在 dword 13 内都有“顺序请求”位 [6]。我确认我们的 NVMe 设备(Samsung 970 Pro)支持 DSM,但看起来它对 NVMe 读取命令中的 lba 传输顺序没有任何影响。
请帮助我澄清每个 NVMe 读取命令中的“顺序请求”选项是什么,因为在 NVMe 规范中描述了“命令是包含多个读取命令的顺序读取的一部分”。是否能够在 NVMe 读取命令中更改 lba 传输顺序?正如我们所期望的(1)从 NVMe 读取命令(具有大的 lba)中按顺序接收 lba,这可能吗?我们能为我们的期望做些什么?
database - 在线性 nvme RAID (RAID 0) 上优化只读工作负载 [for Clickhouse]
所以,我有一个只读工作负载,我计划使用“Clickhouse”数据库来完成。
我想知道可以在现代服务器(Ubuntu 18.0.4)上对(8)个 NVME 上的 RAID 进行哪些优化,以帮助完成此类任务。
似乎为这种情况推荐的大多数 RAID 优化都已过时(例如,将调度程序设置为noop
似乎与 nvme 控制器 ssds 无关)。
我想出的唯一方法是设置 noabarrier 和 noatime ......但除此之外,似乎我能找到的大多数优化都已经过时了。
那么,我可以做些什么来使 NVME 线性 RAID 中的只读工作负载更快?
**注意:我知道这个问题的答案已经“存在”,但它以 10 或 20 年前相关的形式存在,所以请不要将我指向 10 年前的文章/帖子并报告问题作为“重复”,我对与 4.x+ 内核相关的东西特别感兴趣,PCIE 连接的上一代 NVME 设备在线性 RAID 中。
c - linux内核模块找不到“nvme_ns”结构
我正在编写一个模块,在该模块中我使用主要和次要编号访问 nvme 设备。
该函数的代码是
现在,当我尝试访问时my_nvme_ns
,它失败并出现错误
我已经包含了所有相关文件,包括
使用内核 5.0.0
我在这里想念什么?
linux - 您如何读取 SPDK 内部 NVME 设备上的封装温度?
我们正在评估使用 SPDK 作为内部框架来构建带有 NVMe 设备的数据记录器。
磁盘和 SSD 设备具有 smartctl 接口,可为您提供一段时间的封装温度。看起来 smartctl 现在已经足够聪明,可以处理 NVMe 设备了。但是,一旦 SPDK 被“设置”,支持 smartctl 的内核模块就消失了,不再在这些设备上运行。
我在规范中找到对“温度”阈值的引用,但我没有找到“读取当前设备封装温度”。
Linux 下的 SPDK 看起来像是一个不错的性能包,但如果它阻止了获取底层硬件的基本健康信息,那么它就无法启动。
nvme - 如何获取 NVMe 队列属性
我有一个 SSD,我需要知道有多少个队列、它们的长度、多少个 adm 队列、内核等等。
我在 Linux 机器上运行并且我已经安装了nvme-cli
工具。我唯一得到的是:
io - NVMe SSD 上的 GFortran 未格式化 I/O 吞吐量
请帮助我了解如何使用 (G)Fortran 提高顺序的、未格式化的 I/O 吞吐量,尤其是在使用 NVMe SSD 时。
我写了一个小测试程序,见这篇文章的底部。这样做是并行打开一个或多个文件 (OpenMP) 并将一组随机数写入其中。然后它刷新系统缓存(需要root,否则读取测试很可能会从内存中读取)打开文件并从中读取。时间以挂墙时间(试图仅包括与 I/O 相关的时间)来衡量,性能数字以 MiB/s 给出。程序循环直到中止。
我用于测试的硬件是三星 970 Evo Plus 1TB SSD,通过 2 个 PCIe 3.0 通道连接。所以理论上,它应该能够进行 ~1500MiB/s 的顺序读写。预先使用“dd if=/dev/zero of=./testfile bs=1G count=1 oflag=direct”进行测试,结果约为 750MB/s。不太好,但仍然比我用 Gfortran 得到的要好。根据您的要求,dd 无论如何都不应该用于基准测试。这只是为了确保硬件在理论上能够提供更多功能。
随着文件大小的增大,我的代码的结果往往会变得更好,但即使是 1GiB,它的写入速度也会达到 200MiB/s 左右,读取速度为 420MiB/s。使用更多线程(例如 4 个)会稍微提高写入速度,但只能达到 270MiB/s 左右。我确保保持基准运行时间较短,并在测试之间给 SSD 时间放松。
我的印象是,即使只有一个线程,也应该可以使 2 个 PCIe 3.0 通道的带宽饱和。至少在使用未格式化的 I/O 时。该代码似乎不受 CPU 限制,如果我将“值”字段的分配和初始化移出循环,则顶部显示单个内核的使用率低于 50%。考虑到我希望看到至少高出 5 倍的数字,这对于整体性能来说仍然不是好兆头。
我还尝试将 access=stream 用于 open 语句,但无济于事。
那么问题似乎是什么?
我的代码是否错误/未优化?我的期望是不是太高了?
使用的平台:
Opensuse Leap 15.1,内核 4.12.14-lp151.28.36-default
2x AMD Epyc 7551,Supermicro H11DSI,Samsung 970 Evo Plus 1TB (2xPCIe 3.0)
gcc 版本 8.2.1,编译器选项:-ffree-line-length-无 -O3 -ffast-math -funroll-loops -flto
driver - NVMe 命令位于 PCIe BAR 内的什么位置?
根据 NVMe 规范,BAR 对每个队列都有尾部和头部字段。例如:
- 提交队列
y
尾门铃(SQyTDBL
):- 开始:
1000h + (2y * (4 << CAP.DSTRD))
- 结尾:
1003h + (2y * (4 << CAP.DSTRD))
- 开始:
- 提交队列
y
头门铃(SQyHDBL
):- 开始:
1000h + ((2y + 1) * (4 << CAP.DSTRD))
- 结尾:
1003h + ((2y + 1) * (4 << CAP.DSTRD))
- 开始:
有队列本身还是仅仅是指针?它是否正确?如果是队列,我会假设 DSTRD 表示所有队列的最大长度。
此外,该规范还讨论了两个可选区域:主机内存缓冲区 (HMB) 和控制器内存缓冲区 (CMB)。
- HMB:主机 DRAM 中的一个区域(PCIe 根)
- CMB:NVMe 控制器的 DRAM 内的一个区域(SSD 内)
如果两者都是可选的,那么它位于哪里?由于端点 PCIe 仅适用于 BAR 和 PCI 标头,因此除了 BAR 之外,我看不到它们可能位于的任何其他位置。