问题标签 [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.
file - 用脚本读取数百万行的最快方法
我需要在过滤它们后制作一个脚本来获取数据。
问题是总文件大小应该是 50GB 左右。
我想尽可能快地过滤数据
我想到了两种解决方案:
-MySQL数据库
-内存数据库
正如我所听到的那样,MySQL 应该是一个非常糟糕的解决方案,因为我有很多数据要读取,而且速度可能非常糟糕。
另一方面,我认为内存数据库可能是一个非常好的解决方案,
在脚本启动时加载 50GB 的内容,然后根据这篇文章读取 trought 内存会快得多(以及其他一些说相同内容的人)
https://www.quora.com/Is-the-M-2-SSD-approaching-RAM-speeds
有人可以确认我的选择是正确的,如果不是,最好的解决方案是什么。我可以在 CSHARP、NODEJS、VB、GOLANG MAYBE 中做内存数据库系统吗?
linux-kernel - NVME磁盘驱动程序中“blk_rq_map_user”函数的作用是什么?
我正在尝试了解 nvme linux 驱动程序。我现在正在处理函数nvme_user_submit_cmd,我在这里部分报告:
这ubuffer
是指向虚拟地址空间中某些数据的指针(因为它来自ioctl
用户应用程序的命令)。
接下来blk_rq_map_user
我期待某种mmap
机制将用户空间地址转换为物理地址,但我无法理解该函数正在做什么。供参考,这里是调用链:
blk_rq_map_user
-> import_single_range -> blk_rq_map_user_iov
遵循这些功能只会给我带来更多的困惑,我需要一些帮助。
我认为这个函数正在做某种 mmap 的原因是(除了名称)这个地址将是struct request
in 的一部分struct request queue
,最终将由 NVME 磁盘驱动程序处理(https://lwn.net/ Articles/738449/),我的猜测是磁盘在满足请求时需要物理地址。
但是我不明白这个映射是如何完成的。
c - 无法将命令写入 nvmeq->sq_cmds[nvmeq->sq_tail]
在 linux-5.4/drivers/nvme/host/pci.c 中,我创建了一个并希望使用以下行nvme_command
将此命令写入:nvmeq->sq_cmds[nvmeq->sq_tail]
但是当printk
我nvmeq->sq_cmds[nvmeq->sq_tail]
. (3次有正确数据,但大部分时间没有数据)
首先,因为我绕过了块层,所以我创建了PER_CPU
变量并得到了nvme_queue
执行的时间nvme_alloc_queue()
。我曾经怀疑原因是
nvme_queue
没有成功获取到,但是我可以printk
每个队列的nvmeq->qid
和nvmeq->q_depth
。所以我排除了这个原因。
以下是我的代码:
printk
的每个成员我都可以cmd
,所以写的nvme_command
是正确的,但是memcpy
操作memcpy(&nvmeq->sq_cmds[nvmeq->sq_tail], &cmd, sizeof(cmd));
失败了。
io - BFQ 调度器会支持 blkio 权重吗
对于磁盘调度程序 CFQ,可以根据blkio.weight
. 但是,对于大多数 NVMe 调度程序来说,这是不可能的,例如,deadline 或 kypler。
我听说 BFQ 是一个新的 NVMe 调度程序。我们可以定制blkio.weight
吗?如果目前不支持,我们将来可以获取该功能吗?
linux - nvmet over tcp - 随机负命名空间
我在 Linux 服务器上运行 nvmet-tcp。我正在尝试将 nvme 设备从服务器传递到客户端。它实际上工作正常。首先,我会在服务器上加载 nvmet 和 nvmet-tcp
然后我会创建一个子系统
并设置所有参数。之后,我会转到 /sys/kernel/config/nvmet/subsystems/test/nvmet 中的命名空间文件夹
随后,标准配置
并启用所有这些:
After—激活端口(正确配置后)
那会启动端口,它会工作得很好。在主机上,我将连接:
唯一的问题是,当我列出命名空间时,我得到了一个额外的“-1”命名空间。
事实上,一切都很好,以至于我能够即时创建一个新的命名空间,主机会看到它并自动将它安装为一个单独的磁盘。但我不知道如何调试/处理首先安装在那里的 -1 磁盘。
有人可以建议吗?
linux - Linux 上的 NVMe 设备需要很长时间才能出现
我在支持 NVMe 设备的 SAN 环境中使用 Linux 主机(SLES 15 SP2,内核版本为 5.3.18-24.78-default),因此可以动态添加/删除设备。
我注意到,当我为我的 linux 主机配置了 4000 多个 NVMe 设备并添加更多设备时,内核会立即通过在 dmesg 中添加以下消息来识别添加了一个设备 -
但是,实际的 sysfs 和 /dev 等设备文件只有在延迟之后才会出现,而且有时这个延迟会大于一分钟。
我想了解为什么会出现这种延迟,有没有办法调整它。此外,这种延迟是否取决于 CPU/可用内存/使用情况?
如果有人可以提供帮助或指点,那就太好了。
感谢和问候
operating-system - 操作系统如何检测磁盘容量的实时调整大小?
我看到了以下讨论并有一些问题: live resize of a NVMe drive
如果 nvme 设备的物理容量发生变化(例如,从 10GB 到 20GB),操作系统如何在不重新启动的情况下检测到它?
在上面的链接中,重新扫描 pci 总线是解决方案。
当执行重新扫描时,操作系统是否要求 nvme 设备更新其元信息(例如,容量等)?
操作系统具体如何与磁盘交互?(如何从磁盘读取更改的设备参数,而不是内存中的旧设备参数?)
c - 如何在非管理员模式下获取 SSD 类型 NVME 的硬盘序列号
我尝试了多种方法来获取正确的硬盘序列号,这些方法是通过使用智能界面并在笔记本电脑中安装驱动程序时从管理员模式获取的,但它们都无法获取实际的硬盘序列号。
实际序列号:S65VNE0NC41799
非管理员模式下的序列号:3635_5630_4EC4_1799_0025_3845_0000_0001。
下面给出用于获取 HDD 序列号的代码。
我通过这种方式得到了错误的硬盘序列号,那么在 NVME SSD 中获取硬盘序列号的确切方法是什么。
storage - 使用模拟器和数据包捕获了解 NVMe
我正在热身 NVMe 协议,并想了解使用伪设备(目标)的典型启动序列,其中 linux 机器(VM)作为启动器并实时捕获 NVMe 数据包(使用类似 wireshark 的东西)。
有人可以推荐一个涵盖所有内容的好博客吗?
c++ - 如何在 Linux 下以 C/C++ 向 NVMe 磁盘写入 10GB/s
我正在考虑用 C/C++ 设计一个在 Linux 下运行的应用程序,目前是 Ubuntu 20.04。应用程序应该能够以大约 1-10GB/s 的速率连续存储数据,最好是在文件系统上,但这不是强制性的。为此,我在系统中有四个 NVMe 磁盘组织为软件 RAID0,理论上最大传输速率应约为 12GB/s。
首先,我尝试在另一个 NVMe 和 RAID 之间处理一个文件,速率仅为 1-2GB/s 左右。然后我编写了一个简单的 c/c++ 程序,它使用标准的“write”命令,但没有任何改进。
然后我意识到 Ubuntu 中有一个工具gnome-disks。当我进行读写基准测试时,我达到了大约 10-11GB/s。我意识到该实用程序不使用文件系统,而是从它自己的磁盘写入和写入,并使用 NVMe 磁盘可以并行执行操作的事实。
查看 gnome-disks 的源代码,在我看来,该实用程序也在使用“write”来写入磁盘。通过查看 gnome-disks 中的 strace,我猜想 write 被 poll、writev 和可能的 recvmsg 取代。
在 c/c++ 中应该如何使用 NVMe 磁盘以获得良好的性能(gnome-disks 是如何做到的?)?libnvme、SPDK、aio、udisks2 等库?
更新 2022-02-09:
感谢所有输入!我刚刚制作了一个使用 pwritev2 而不是 write 的简短程序。这带来了巨大的进步,我现在的写入速度达到了 12GB/s 左右。代码如下。通过提供您要测试的设备的路径来编译它并运行,例如 speed /dev/md/raid0
该程序会破坏设备上的数据,所以要小心。