问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

NVMe协议详解:基于PCIe的高性能存储接口

创作时间:
作者:
@小白创作中心

NVMe协议详解:基于PCIe的高性能存储接口

引用
CSDN
1.
https://m.blog.csdn.net/chenzhjlf/article/details/138520384

NVMe(Non-Volatile Memory Express)是一种针对基于PCIe的固态硬盘的高性能、可扩展的主机控制器接口协议。它通过提供多个队列来处理I/O命令,显著提升了数据传输效率和系统性能。本文将详细介绍NVMe协议的核心概念、工作原理以及其在实际应用中的优势。

NVMe协议概述

NVMe协议的主要特点是支持多个队列处理I/O命令。单个NVMe设备可以支持多达64K个I/O队列,每个队列可以管理多达64K个命令。这种设计极大地提高了系统的并发处理能力。

当主机需要发出I/O命令时,会将命令放置到提交队列(SQ),并通过门铃寄存器(DB)通知NVMe设备。设备处理完命令后,会将处理结果写入完成队列(CQ),并引发中断通知主机系统。NVMe还使用MSI/MSI-X和中断聚合技术来优化中断处理性能。

NVMe驱动机制

NVMe驱动是一个C函数库,可以直接链接到应用程序,实现应用与NVMe固态硬盘之间的直接数据传输。这种机制是完全被动的,不会开启额外线程,而是直接执行来自应用程序的函数调用。驱动通过将PCI BAR寄存器映射到本地进程,执行基于内存映射的I/O(MMIO)操作。

NVMe管理界面(NVMe-MI)允许管理控制器通过外部接口与NVMe NVM子系统进行带外通信。NVMe协议的分层结构如下图所示:

NVMe协议的核心组件包括:

  • Submission Queue (SQ):位于主机内存中,用于存放待处理的I/O命令。
  • Completion Queue (CQ):同样位于主机内存中,用于存放命令执行结果。
  • Doorbell Register (DB):位于SSD控制器内部,用于主机通知SSD取命令。

NVMe命令集

NVMe定义了两种类型的命令:

  • Admin Command:用于主机管理和控制SSD,包括创建和删除I/O队列、中止命令等。
  • I/O Command:用于主机和SSD之间的数据传输,包括读写操作。

Admin指令

Admin指令通过Dword0中的8位操作码定义,具体指令包括:

  • 删除I/O SQ
  • 创建I/O SQ
  • 获取日志
  • 删除I/O CQ
  • 创建I/O CQ
  • Identify
  • 撤销
  • 设置features
  • 获取features
  • 异步事件请求
  • 固件激活
  • 固件镜像下载

I/O指令

I/O指令同样通过Dword0中的8位操作码定义,具体指令包括:

  • Flush
  • Write
  • Read
  • Write Uncorrectable
  • Compare
  • Dataset Management

寄存器定义

NVMe寄存器主要分为两部分:

  1. 控制器能力寄存器(CAP):定义内存页大小、支持的I/O指令集等。
  2. 中断相关寄存器(INTMS、INTMC):用于中断管理。
  3. 控制器配置寄存器(CC):定义队列元素大小、仲裁机制等。
  4. 控制器状态寄存器(CSTS):反映控制器状态。
  5. Admin队列属性寄存器(AQA):定义Admin队列大小。
  6. 队列头尾DB寄存器:从0x1000h开始,用于存放每组队列的头尾DB寄存器。

性能优化

要充分发挥NVMe SSD的IOPS性能,需要合理设置队列深度。根据NVMe白皮书建议:

  • 企业级SSD:建议使用16~128个队列
  • 消费级SSD:建议使用2~8个队列

下图展示了不同队列深度对NVMe SSD性能的影响(数据来源:Tom's Hardware):



从图中可以看出,大多数NVMe SSD在队列深度达到128以上时才能达到最佳性能。

总结

NVMe协议通过多队列设计和优化的中断处理机制,显著提升了基于PCIe的固态硬盘的性能。其灵活的命令集和寄存器配置,使得NVMe SSD能够更好地适应各种应用场景,特别是在高并发和高性能需求的环境中展现出明显优势。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号