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

深入理解nvme hardware queue pair

hardware queue pair是什么

hardware queue pair是我们理解nvme/spdk的牛鼻子,只有深入理解才可能把nvme用好。

从nvme控制器寄存器的角度看

顾名思义,就是一些硬件寄存器组成的队列。

空队列

深入理解nvme hardware queue pair

满队列

深入理解nvme hardware queue pair

  • 问题:
    能否并发入队、出队?不行

submission hardware queue entry

每个entry如下表所示:

深入理解nvme hardware queue pair

  • 入队:

host software 提交命令到tail entry, 通过操作submission hardware queue tail doorbell register;
深入理解nvme hardware queue pair

  • 出队:
    hardware 依次取head entry 去处理

completion hardware hardware queue entry

每个entry的主要fileds 如下:

深入理解nvme hardware queue pair

  • 入队
    hardware 处理完上面取到的nvme command之后,把对应的完成的信息放在completion queue head entry;

  • 出队
    host software 被中断或主动轮询到上面有新的entry 添加之后,去completion queue tail 去取最近提交的命令的处理结果。

这个主要是操作completion queue doorbell 寄存器去实现:
深入理解nvme hardware queue pair

queue pair

nvme控制器内部有多个submission hardware queue,也有多个completion hardware queue。 提交、执行 NVME command的时候,需要使用上面两种hardware queue中的entry,成对使用。

从nvme控制器架构的角度看

hardware queue pair 是抽取"nvme command"的水车。设计到NVME 指令的提交/执行和完成。

概览

下面是一张经典的图:
深入理解nvme hardware queue pair

NVME command提交

深入理解nvme hardware queue pair

NVME已完成命令的处理

深入理解nvme hardware queue pair

spdk对hardware queue pair的封装

IO请求提交函数

  • spdk_nvme_ns_cmd_read
  1. 生产request
    _nvme_ns_cmd_rw(ns, qpair, &payload, ....)

  2. 提交请求
    nvme_qpair_submmit_request()

    2.1 nvme_transport_qpair_submit_request(qpair, request)
    2.1.1 nvme_pcie_qpair_submit_request (qpair, request)
    2.1.1.1 nvme_pcie_qpair_build_contig_request(qpair, req, tr);
    2.1.1.2 nvme_pcie_qpair_submit_tracker(qpair, tr)

nvme_pcie_qpair_submit_tracker(struct spdk_nvme_qpair *qpair, struct nvme_tracker *tr)
{
        struct nvme_request     *req;
        struct nvme_pcie_qpair  *pqpair = nvme_pcie_qpair(qpair);
        struct nvme_pcie_ctrlr  *pctrlr = nvme_pcie_ctrlr(qpair->ctrlr);

        req = tr->req;
        assert(req != NULL);
        req->timed_out = false;
        if (spdk_unlikely(pctrlr->ctrlr.timeout_enabled)) {
                req->submit_tick = spdk_get_ticks();
        } else {
                req->submit_tick = 0;
        }

        pqpair->tr[tr->cid].active = true;

        /* Copy the command from the tracker to the submission queue. */
        nvme_pcie_copy_command(&pqpair->cmd[pqpair->sq_tail], &req->cmd);

        if (spdk_unlikely(++pqpair->sq_tail == pqpair->num_entries)) {
                pqpair->sq_tail = 0;
        }

        if (spdk_unlikely(pqpair->sq_tail == pqpair->sq_head)) {
                SPDK_ERRLOG("sq_tail is passing sq_head!\n");
        }

        spdk_wmb();
        if (spdk_likely(nvme_pcie_qpair_update_mmio_required(qpair,
                        pqpair->sq_tail,
                        pqpair->sq_shadow_tdbl,
                        pqpair->sq_eventidx))) {
                g_thread_mmio_ctrlr = pctrlr;
                spdk_mmio_write_4(pqpair->sq_tdbl, pqpair->sq_tail); // <---
                g_thread_mmio_ctrlr = NULL;
        }
}

通过上面code path可以看到,spdk nvme 需要操作硬件寄存器,并且一路无锁和原子操作。需要上层保护。

IO完成查询函数

spdk_nvme_qpair_process_completions

同上类似操作对应的cq_hdbel,无锁和原子操作,需要上层保护,防止并发修改doorbell 寄存器。

如何用好多个hardware queue pair

需要管理好实际应用中hardware queue pair和线程、处理器核的对应关系,避免多个线程同时访问某个hardware queue。

转载于:https://blog.51cto.com/xiamachao/2380622

相关文章:

  • 家具建材行业电商平台解决方案
  • SAP soamanager发布的Webservice服务,调用时出现http500报错
  • 日常英语---九、冒险岛link技能导读
  • 日常英语---四、vis.js是什么
  • springboot activiti 整合项目框架源码 shiro 安全框架 druid 数据库连接池
  • flutter在2019年会有怎样的表现?
  • python大佬进阶学习路线
  • 学习ActiveMQ(三):发布/订阅模式(topic)演示
  • 【本人秃顶程序员】Java面试 32个核心必考点完全解析
  • 加一度分享竞价工作自检清单,升职加薪指日可待
  • windows下nginx的安装及使用(转载)
  • Mobx初探
  • 【云吞铺子】性能抖动剖析(二)
  • react-nativeAndroid打包报错:Daemon: AAPT2 aapt2-3.2.1-4818971-osx Daemon #0
  • 查看文件权限
  • docker容器内的网络抓包
  • Flannel解读
  • HTTP--网络协议分层,http历史(二)
  • JS函数式编程 数组部分风格 ES6版
  • Linux中的硬链接与软链接
  • node学习系列之简单文件上传
  • Promise面试题,控制异步流程
  • spring boot下thymeleaf全局静态变量配置
  • 彻底搞懂浏览器Event-loop
  • 给新手的新浪微博 SDK 集成教程【一】
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 如何优雅地使用 Sublime Text
  • 一起参Ember.js讨论、问答社区。
  • 转载:[译] 内容加速黑科技趣谈
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • (5)STL算法之复制
  • (floyd+补集) poj 3275
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (南京观海微电子)——COF介绍
  • (学习日记)2024.02.29:UCOSIII第二节
  • (转)Oracle存储过程编写经验和优化措施
  • (转载)hibernate缓存
  • ***详解账号泄露:全球约1亿用户已泄露
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NET 表达式计算:Expression Evaluator
  • .Net 高效开发之不可错过的实用工具
  • .NET 使用 XPath 来读写 XML 文件
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • :中兴通讯为何成功
  • @Bean注解详解
  • @RequestBody与@ModelAttribute
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • []指针