问题标签 [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.

0 投票
2 回答
2764 浏览

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+。

任何指针?

命令参考:https ://itpeernetwork.intel.com/tuning-performance-intel-optane-ssds-linux-operating-systems/#gs.1yu3o1

https://lwn.net/Articles/663543/

0 投票
1 回答
912 浏览

c++ - 如何快速将无限大小的缓冲区写入 NVMe SSD

我正在开发一个应用程序,其中我有大量数据不断写入 ram,我正在尝试快速从 ram 中读取数据,并将其写入 NVMe SSD,写入完成后,我重新排队 ram 空间以允许它正在写。

我目前的问题是数据无限期地连续写入,所以最终我的 RAM 不足以容纳所有数据,它必须被读出并存储到磁盘中。由于数据量大,写入速度标准很高(1.5G/s)。

我经常看到提到 mmap 来提高 I/O 效率,但主要是读取效率,因为它可以防止将大数据复制到 DRAM。所以我想知道在我的用例中,使用 mmap 将我的 SSD 直接映射为虚拟内存并直接写入它是否比标准 fwrite 更快?

0 投票
1 回答
1158 浏览

nvme - 如何使用 nvme-cli 测试 NVME 管理命令异步事件请求(操作码 0x0C)?

我已经在 Ubuntu 上安装了nvme-cli,并且想测试驱动器是否真的支持异步事件请求。

我能够在nvme admin-passthru /dev/nvmen1 --opcode=0x0C没有任何错误的情况下运行,但一段时间后它会因错误(或警告)而超时passthru: Interrupted system call

这是否意味着在这种情况下成功注册了异步事件请求?我的理解是异步事件请求永远不应该超时......知道如何通过命令行验证设备是否完全支持此功能?

0 投票
1 回答
896 浏览

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,这可能吗?我们能为我们的期望做些什么?

0 投票
0 回答
74 浏览

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 中。

0 投票
0 回答
159 浏览

c - linux内核模块找不到“nvme_ns”结构

我正在编写一个模块,在该模块中我使用主要和次要编号访问 nvme 设备。

该函数的代码是

现在,当我尝试访问时my_nvme_ns,它失败并出现错误

我已经包含了所有相关文件,包括

使用内核 5.0.0

我在这里想念什么?

0 投票
1 回答
125 浏览

linux - 您如何读取 SPDK 内部 NVME 设备上的封装温度?

我们正在评估使用 SPDK 作为内部框架来构建带有 NVMe 设备的数据记录器。

磁盘和 SSD 设备具有 smartctl 接口,可为您提供一段时间的封装温度。看起来 smartctl 现在已经足够聪明,可以处理 NVMe 设备了。但是,一旦 SPDK 被“设置”,支持 smartctl 的内核模块就消失了,不再在这些设备上运行。

我在规范中找到对“温度”阈值的引用,但我没有找到“读取当前设备封装温度”。

Linux 下的 SPDK 看起来像是一个不错的性能包,但如果它阻止了获取底层硬件的基本健康信息,那么它就无法启动。

0 投票
0 回答
678 浏览

nvme - 如何获取 NVMe 队列属性

我有一个 SSD,我需要知道有多少个队列、它们的长度、多少个 adm 队列、内核等等。

我在 Linux 机器上运行并且我已经安装了nvme-cli工具。我唯一得到的是:

0 投票
1 回答
146 浏览

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

0 投票
1 回答
1150 浏览

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 之外,我看不到它们可能位于的任何其他位置。