NVME简单理解(一)

         NVMe是什么:NVMe是一种Host与SSD之间通讯的协议,它在协议栈中隶属高层。

 

NVMe制定了Host与SSD之间通讯的命令,以及命令如何执行的。

NVMe有两种命令,一种叫Admin Command,用以Host管理和控制SSD;另外一种就是I/O Command,用以Host和SSD之间数据的传输。下面是NVMe1.2支持的命令列表:

NVMe支持的Admin Command:

NVMe支持的I/O Command:

跟ATA spec中定义的命令相比,NVMe的命令个数少了很多,完全是为SSD量身定制的。大家现在别纠结于具体的命令,了解一下就好。

NVMe有三种队列命令:Submission Queue (SQ),Completion Queue(CQ)和Doorbell Register (DB)。 SQ和CQ位于Host的内存中,DB则位于SSD的控制器内部。如下图所示:

SQ位于Host内存中,Host要发送命令时,先把准备好的命令放在SQ中,然后通知SSD来取;CQ也是位于Host内存中,一个命令执行完成,成功或失败,SSD总会往CQ中写入命令完成状态。DB则是在Host发送命令时,不是直接往SSD中发送命令的,而是把命令准备好放在自己的内存中,Host就是通过写SSD端的DB寄存器来告知SSD命令已经处理完毕,可以前来检阅。流程如下图所示:

             ①Host写命令到SQ;

             ②Host写DB,通知SSD取指;

             ③SSD收到通知,于是从SQ中取指;

             ④SSD执行指令;

             ⑤指令执行完成,SSD往CQ中写指令执行结果;

             ⑥然后SSD发短信通知Host指令完成;

             ⑦收到短信,Host处理CQ,查看指令完成状态;

             ⑧Host处理完CQ中的指令执行结果通过DB回复SSD:指令执行结果已处理。

 

 

 

 

 

### 配置、读取和解析 NVMe 遥测数据 #### 使用 SPDK 工具配置 NVMe 设备遥测功能 SPDK 提供了套完整的工具集来管理和操作 NVMe 设备。对于配置 NVMe 遥测,可以利用 `rpc.py` 脚本中的特定命令实现。 要启用 NVMe 控制器上的遥测记录功能,可以通过如下 RPC 命令完成: ```bash rpc.py nvme_enable_telemetry -n Nvme0 -e 1 ``` 这条指令会激活指定名称为 `Nvme0` 的控制器的遥测日志收集能力[^1]。 #### 获取并读取 NVMe 遥测数据 旦启用了遥测支持,则可通过发送适当的管理命令给 NVMe 设备以检索实际的数据包。这通常涉及到调用 `nvme_get_log_page` 函数请求类型为 Telemetry Host 或 Controller 数据包的日志页。 通过 SPDK 的 Python RPC 接口执行此操作的方式如下所示: ```python import json from spdk.rpc import Client client = Client() response = client.call('nvme_get_telemetry_data', { "name": "Nvme0", "log_spec_id": 0x7F, # Log Specification Identifier for Telemetry Data Packet }) telemetry_data = response['data'] print(json.dumps(telemetry_data, indent=4)) ``` 上述代码片段展示了如何连接到正在运行的服务端,并发出获取遥测数据的请求;这里假设服务已经启动并且能够接收来自客户端的应用程序呼叫。 #### 解析 NVMe 遥测二进制流 原始遥测数据是以紧凑型二进制格式返回的,因此需要按照官方文档定义的标准结构体来进行解码处理。Python 中可借助于像 `struct` 这样的库函数帮助转换字节序列为易于理解的形式。 下面是简单的例子说明怎样解析部分字段: ```python import struct def parse_telemetry_header(data): (signature,) = struct.unpack_from('>I', data[:4]) version_major, version_minor = struct.unpack_from('<BB', data[4:6]) header_info = { 'Signature': hex(signature), 'Version Major': version_major, 'Version Minor': version_minor } return header_info header_details = parse_telemetry_header(telemetry_data) for key, value in header_details.items(): print(f"{key}: {value}") ``` 这段脚本实现了对遥测头信息的基本解释工作,包括签名验证以及版本号提取等功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值