当前位置: 首页 > news >正文

Work NVMe协议

文章目录

      • 1. SQ/CQ 存放在主机内存还是盘内存?
      • 2. 队列数量上限
      • 3. 队列深度上限
      • 4. 如何修改队列数量与深度
        • (1)**nvme-cli 一键重建(最简单)**
        • (2)**SET FEATURES (Feature ID=0x07) 动态调队列数**
        • (3)**手动 CREATE/DELETE IO QUEUE(用户态 passthru)**
      • 小结


1. SQ/CQ 存放在主机内存还是盘内存?

  • Admin SQ/CQI/O SQ/CQ 均放在 主机内存(Host Memory)。
    主机在初始化时按队列个数与深度一次性开辟连续(或 PRP/List 描述)内存,SSD 通过 PCIe 读/写这些内存区域完成取指与回写完成信息。

2. 队列数量上限

队列类型数量上限备注
Admin SQ/CQ1 对固定,不能增减
I/O SQ/CQ65 535 对(64 K - 1)理论值;实际受限于 SSD 控制器、主机内存、在线 CPU 数

注:一条 I/O CQ 可被多条 I/O SQ 共享(多对一),也可一对一。


3. 队列深度上限

队列类型深度范围最大深度
Admin SQ/CQ2–4 0964 096
I/O SQ/CQ2–65 53665 536(64 K)

深度值在创建队列时以 “队列条目数 - 1” 形式填入命令字段。


4. 如何修改队列数量与深度

NVMe 规范把“队列数”与“深度”都当成 控制器特性,需通过 Admin 命令 在初始化阶段设定;Linux 下常用三种途径:

(1)nvme-cli 一键重建(最简单)
# 先卸载块设备
echo 1 > /sys/block/nvme0n1/device/remove
# 重新加载,指定队列数与深度
modprobe -r nvme && modprobe nvme nr_io_queues=16 io_queue_depth=1024
  • nr_io_queues:I/O SQ 数量(会等量生成 CQ)
  • io_queue_depth:每条 I/O SQ 的深度

值不能超过 Identify 控制器返回的 MQES 字段。

(2)SET FEATURES (Feature ID=0x07) 动态调队列数
struct nvme_command c = {0};
c.features.opcode = nvme_admin_set_features;
c.features.fid    = 0x07;          // Number of Queues
c.features.dword11 = (nr_cq << 16) | nr_sq;
__nvme_submit_sync_cmd(ctrl->admin_q, &c, &result, NULL, 0);
  • 控制器返回实际能接受的 sq/cq 数量,驱动随后据此创建。
(3)手动 CREATE/DELETE IO QUEUE(用户态 passthru)
# 1. 创建完成队列
nvme admin-passthru /dev/nvme0 -o 0x05 --cdw10=$((qs-1)) --cdw11=1 --cdw12=0 --cdw15=0 \--data-len=0 --namespace-id=0# 2. 创建提交队列
nvme admin-passthru /dev/nvme0 -o 0x01 --cdw10=$((qs-1)) --cdw11=1 --cdw12=0 --cdw15=0 \--data-len=0 --namespace-id=0
  • 0x05 = Create I/O CQ;0x01 = Create I/O SQ
  • qs = 期望深度(填 “深度 - 1”)
  • 顺序必须 先 CQ 后 SQ

小结

  • SQ/CQ 100% 在主机内存;SSD 只保存 Doorbell 寄存器。
  • 理论可建 64 K 对 I/O 队列、单队列深度 64 K;实际值用 nvme id-ctrl 查看 MQES/MAXQ.
  • 数量/深度可通过 内核模块参数SET FEATURES手动 Admin 命令 在初始化阶段调整;运行后想改需先删队列再重建。
http://www.dtcms.com/a/428281.html

相关文章:

  • python5
  • 【Rust GUI开发入门】编写一个本地音乐播放器(13. 实现按键绑定)
  • 旗舰店的网站怎么做上市公司网站的作用
  • Java坐标转换的多元实现路径:在线调用、百度与高德地图API集成及纯Java代码实现
  • 网站搜索功能怎么实现如何建议一个网站
  • [工作流节点4] 分支节点与条件判断 —— 明道云工作流核心逻辑拆分技巧
  • numpy -- 字符串函数 capitalize() 和 title() 简介
  • Aupload + vuedraggable实现 上传的文件可以拖拽排序
  • 邯郸做网站的公司哪家好国家备案网
  • 人工智能与小程序开发:双翼齐飞,重塑数字体验新范式
  • eNSP、HCIA学习笔记
  • 网上书城 网站建设方案高端网站服务范围
  • Geant4实例
  • 网站建设一条龙全包seowordpress动态计时
  • 【Battery】慢速和快速充电的显示逻辑
  • 一个startActivity请求是如何穿越进程边界
  • 怎么看一个网站是用什么程序做的衡水建设网站
  • 网站建设配图微商城网站建设信息
  • 富文本【表格】
  • 【Java数据结构】——堆(找出用于解决最大/最小的n个元素,或者求中位数)
  • Python快速入门专业版(五十一):Python异常处理进阶:try-except-finally与raise语句(资源释放与主动抛异常)
  • 买家秀接口深度开发:从内容解析到情感分析的全链路实现
  • 密钥管理系统KSP在智能水表行业的应用
  • 中国建设银行网站多少汕头网站建设过程
  • 基于STM32与influxDB的电力监控系统-6
  • 【教程】nvidia-smi dmon获取GPU相关的完整信息
  • wordpress 网站上传制作网站的公司叫什么
  • 服装网站建设运营规划扬州网站建设推广
  • 网站后台管理怎么进asp网站服务建设
  • 公司建网站多少钱一个免费网页代理在线