常见的 SSD 主要分为 SATA和 PCIe 接口,其接口协议对应着 AHCI、NVMe 协议。相比于最原始的 ATA 协议,AHCI 有 2 个特点,第 1 个支持热插拔,第 2 个支持 NCQ(Native Command Queueing)技术,NCQ 最大深度为 32,则使用 fio 进行性能测试时,其 iodepth不得超过 32;
在 HDD 和 SSD 早期,AHCI 控制器接口协议和 SATA 硬盘传输接口足够满足系统的性能需求,性能的瓶颈在硬盘端,随着闪存技术的飞速发展,系统的性能瓶颈由下层(硬盘)转移至上层(接口和协议),SSD 急需要更高效的接口和协议。在此背景下,NVMe横空出世。
NVMe 全称为 Non-Volatile Memory Express,是非易失性存储器标准,运行在PCIe 接口之上的协议标准。
协议的层级关系为:NVMe <---事务层 <--- 数据链路层 <--- 物理层,NVMe作为命令层和应用层协议位于最上层,下面 3 层均为 PCIe。
NVMe协议实际是一个应用层的协议,PCIe规范定义了传输层(事务层)、数据链路层和物理层。
NVMe协议通常情况下是跑在PCIe协议栈上的。
pcie是接口,nvme是协议。
笔记本上pcie接口都是M.2的物理形态,但是M.2固态硬盘不一定都用nvme协议,可能是传统sata硬盘所用的ahci协议。
现在已经有走PCIe通道的M.2接口了,就需要确认有没有NVMe协议相关驱动即可,可以进BIOS看一下,有没有NVMe相关的字眼,比如我的电脑,进到BIOS里面后,会看到如下:
链接:https://www.zhihu.com/question//answer/
下面将从 SATA和 PCIe 接口对比、 AHCI 和 NVMe速率对比、SSD 外形尺寸 3 方面对比 NVMe 和 AHCI的不同之处。
- AHCI 和 PCIe 接口对比
- SATA 和 PCIe 速率对比
当前我们使用 Intel Purley 平台服务器,即 I/O 接口的速度分别 SATA 3.0 和 PCIe 3.0。预计2021 年中旬 Intel 量产Ice lake Xeon处理器,带来的变化之一是 I/O 由 PCIe 3.0 切换至 PCIe 4.0,服务器平台也将由 Purley 切换至 Whitley。
- SSD的外形尺寸
NVMe SSD外形接口形态有:PCIe card slot, M.2, and U.2,其中 U.2专为NVMe设计,有2.5英寸/3.5英寸标准尺寸固态硬盘驱动器。
- 举个例子,S4510 1.92TB 和 P4610 1.6TB 参数对比
从上图可以直观看出,P4610 NVMe SSD 性能顺序和随机读/写性能明显优于 S4510 SATA SSD,具体数据为:顺序读约 5.7 倍、顺序写 3.7 倍、随机读约 6.6 倍、随机写约 5.6 倍。
RDMA(全称:Remote Direct Memory Access)是一种远程直接内存访问技术,在硬件中实现传输层协议,将内存/消息原语接口暴露至用户空间,通过绕过 CPU 和内核网络协议栈来实现网络的高吞吐和低延迟。如今大规模部署 RDMA 的方式主要有 Infiniband 和 RoCE,前者主要用于高性能领域,后者用于互联网公司数据中心较多,本文的实验环境使用 RoCE。无论哪一种 RDMA 实现方式,都向上提供了统一的操作接口,即 RDMA verbs。
实验设备拓扑图:
驱动选择为:MLNX_OFED_LINUX-5.2-1.0.4.0-debian10.3-x86_64.tgz
MLNX_OFED driver
配置过程如下:
背景:两台节点ip分别为:192.168.13.146, 192.168.13.147,使用 ib_send_bw 命令测试(需要指定 ib 设备名,本例中配置 mlx5_3 设备通信)。
Initiator 和 target 连接方式如下图所示,左侧为initiator,其右为target。在NVMe协议中,NVMe 控制器作为与 initiator 进行沟通的实体。通过确定 PCIe port 、NVMe controller 和NVMe namespace,initiator 端可以通过 discover 和 connect 互联命令发现 target 端 NVMe namespace 并将其连接至本地。
引用至《深入浅出SSD》
NVM over Fabrics 协议定义了使用各种事务层协议来实现 NVMe 功能,其中包括 RDMA、FibreChannel等。相比与普通的 NVMe 命令,NVMe over Fabrics 扩展了 NVMe 标准命令和数据传输方式,比如增加了互联命令,discover,connect、Property Get/Set、Authentication Send/Receive等。connect 命令携带 Host NQN、NVM Subsystem NQN 、PCIe port 和 Host identifier 信息可以连接到 target 端 NVMe 控制器。
本文中 NVMe over RoCE 调用关系如下图所示,内核 nvme_rdma 模块相当于胶水层,连接 rdma stack 和 nvme core接口,即 NVMe 队列接口可以对接 RDMA 队列接口,进而调用下层 rdma stack 中 verbs 传输接口。
NVMe over RoCE 调用关系
initiator 端,又称为host/client端,initiator 配置前提:RDMA基础环境已搭建。通过NVMe 互联命令探测和连接target 端 NVMe SSD 即可。
配置前 initiator 和 target 各有 4块 NVMe SSD,使用上述 initator 和 target 配置方法,将 target 上 4 块 NVMe SSD 挂载至 initator,配置后的现象是 initiator 会显示 8 块 NVMe SSD,target 仍然是 4 块。经验证: target 不可以操作被挂载至 initiator 端的 NVMe SSD。配置状态如下图所示:
配置前
配置后
下面对比测试本地 NVMe SSD 和 NVMe over RoCE SSD之间的顺序/随机性能,单盘+ext4文件系统,结论是:通过性能数据表明,NVMe over RoCE方法顺序读性能下降约 14%,随机写和随机读性能分别下降约 6% 和 2%,顺序写性能无影响。
注:NVMe 裸盘测试性能正常,挂载文件系统后性能急剧下降,后续会在文件系统层面研究如何调优。
测试方法:将 NVMe SSD 全盘顺序写2遍后,使用 fio 测试工具
target 中同 1 个子系统(例如:nvme-subsystem-name)可供多个 initiator 连接。target 子系统关联的硬盘为 /dev/nvme0n1,此时 initiator1 和 initiator2 同时连接 target nvme-subsystem-name,挂载分区后的效果是: initiator1 和 initiator2 均可对 /dev/nvme0n1分区正常读写,但不会同步,仅有等待 disconnect ,再次 connect 后才会进行数据同步。
问题1:nvmet 模块无法加载的问题
问题2:在 initiation 端执行 nvme discover 命令时,遇到 报错
nvme 是 NVMe SSD和 NVMe oF 存储命令行管理工具,nvme安装包为 nvme-cli,它依赖Linux内核 IOCTL 系统调用,该调用连接用户层和NVMe驱动层,当用户执行 nvme commands 时,IOCTL 会将命令参数传递至 NVMe common 层,该层代码解析命令并执行命令,将命令封装至 capsule ,进而传递至 NVMe Submission 队列,Controller 处理后将 capsule 传递至 NVMe Completion 队列,应用从 Completion 队列取出 capsule,完成一次通信。
nvme 安装和常用命令
查看 NVMe SSD smartctl 信息
1、刀片仅有 2 个盘位,可以通过 RoCE 连接 NVMe SSD 存储池。
2、读写分离场景,可以使用 NVMe over RDMA 搭建 NFS。
3、NVMe SSD创建多个命名空间,通过 RoCE 供多个租户使用。
创建多个命名空间
到此这篇nvme2.0接口(nvme接口图)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/qdvuejs/23216.html