博客
关于我
房市静心贴:蛋蛋读NVMe之三
阅读量:58 次
发布时间:2019-02-26

本文共 1539 字,大约阅读时间需要 5 分钟。

NVMe技术深度解析:从数据传输到物理层实现

随着存储技术的飞速发展,NVMe(Non-Volatile Memory Express)作为新一代存储接口,逐渐取代传统的SATA和SAS,成为现代数据中心的重要组成部分。NVMe的核心优势在于其高速度和低延迟,但在技术细节上,NVMe的工作原理依然充满神秘感。本文将深入探讨NVMe中的数据传输机制,揭开其背后的智慧。


数据传输的基本机制

在NVMe系统中,数据的读写过程涉及两个关键角色:Host(主机)和SSD(Solid State Drive,固态硬盘)。从物理层面来看,NVMe命令通过PCIe(并行总线)进行传输,SSD作为目标设备,负责响应Host的命令请求。

Host与SSD的数据传输具有以下特点:

  • 主动性:SSD始终是主动的一方,无论是写入数据还是读取数据,SSD都需要主动向Host的内存中操作。
  • 地址映射:Host需要通过命令明确告诉SSD数据的物理位置。这种地址信息可以通过两种方式传递:PRP(Physical Region Page)SGL(Scatter/Gather List)

  • PRP与SGL:地址传递的两种方式

    在NVMe协议中,PRP和SGL是两种不同的数据传输机制,各有其特点和适用场景。

  • PRP(Physical Region Page)

    • 定位方式:通过64位的物理内存地址,描述一段连续的物理内存空间。
    • 结构特点:地址分为页起始地址和页内偏移,且页内偏移的最后两位固定为0,确保访问对齐。
    • 使用场景:适用于描述连续的内存区域,简单且高效。
  • SGL(Scatter/Gather List)

    • 定位方式:通过链表的方式描述内存空间,可以是连续的也可以是不连续的。
    • 结构特点:每个SGL包含多个SGL Segment,每个Segment由SGL Descriptor描述,描述一段连续的物理内存空间。
    • 灵活性:支持不同大小的内存块,且提供Bit Bucket机制,允许Host注明哪些LBA空间不需要传输。

  • PRP与SGL的对比

    • PRP:简单易懂,适合描述连续的内存空间。
    • SGL:提供更大的灵活性,支持复杂的内存访问模式。
    • 适用场景
      • PRP:用于简单的数据读写操作,尤其是连续内存访问。
      • SGL:用于复杂的数据传输需求,例如混合内存访问模式或不连续的内存块。

    从命令到物理地址:NVMe的层次解析

    在实际操作中,NVMe命令需要通过多层解析才能确定数据的物理存储位置。以写入操作为例:

  • 命令解析:Host发送写入命令,指定LBA(逻辑块地址)和数据传输方式(PRP或SGL)。
  • 地址解析
    • 若使用PRP,Host需要提供PRP List的位置,SSD通过解析PRP List找到真实的物理内存地址。
    • 若使用SGL,Host直接提供数据的物理内存位置,SSD通过SGL Descriptor快速定位。
  • 数据传输:SSD根据物理地址读取或写入数据,完成数据的存取操作。

  • SGL的实际应用场景

    通过一个实际例子可以更直观地理解SGL的作用:

    • 场景:Host需要读取13KB的数据,但实际只需要11KB的有效数据。
    • 细节:11KB数据分布在三个不同的内存块,分别为3KB、4KB和4KB。
    • 解决方案:Host通过SGL Descriptor描述这三个内存块的位置,SSD根据描述快速定位并读取数据。

    结语

    NVMe技术的核心在于高效的数据传输机制,而PRP和SGL正是其重要组成部分。理解这两种机制的区别和适用场景,对于优化存储性能具有重要意义。在深入研究NVMe之前,建议从基础知识入手,逐步掌握其工作原理和应用场景。接下来,我们将继续探讨NVMe读写命令在PCIe层面的实现细节。

    转载地址:http://lbzz.baihongyu.com/

    你可能感兴趣的文章
    npm install 报错 no such file or directory 的解决方法
    查看>>
    npm install报错,证书验证失败unable to get local issuer certificate
    查看>>
    npm install无法生成node_modules的解决方法
    查看>>
    npm install的--save和--save-dev使用说明
    查看>>
    npm node pm2相关问题
    查看>>
    npm run build 失败Compiler server unexpectedly exited with code: null and signal: SIGBUS
    查看>>
    npm run build报Cannot find module错误的解决方法
    查看>>
    npm run build部署到云服务器中的Nginx(图文配置)
    查看>>
    npm run dev 报错PS ‘vite‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。
    查看>>
    npm scripts 使用指南
    查看>>
    npm should be run outside of the node repl, in your normal shell
    查看>>
    npm start运行了什么
    查看>>
    npm WARN deprecated core-js@2.6.12 core-js@<3.3 is no longer maintained and not recommended for usa
    查看>>
    npm 下载依赖慢的解决方案(亲测有效)
    查看>>
    npm 安装依赖过程中报错:Error: Can‘t find Python executable “python“, you can set the PYTHON env variable
    查看>>
    npm.taobao.org 淘宝 npm 镜像证书过期?这样解决!
    查看>>
    npm—小记
    查看>>
    npm介绍以及常用命令
    查看>>
    NPM使用前设置和升级
    查看>>
    npm入门,这篇就够了
    查看>>