
</p><p style="letter-spacing:.05em;"> </p><p style="letter-spacing:.05em;">常见的 SSD 主要分为 SATA和 PCIe 接口,其接口协议对应着 AHCI、NVMe 协议。相比于最原始的 ATA 协议,<strong>AHCI</strong> 有 2 个特点,第 1 个支持热插拔,第 2 个支持 NCQ(Native Command Queueing)技术,NCQ 最大深度为 32,则使用 fio 进行性能测试时,其 iodepth不得超过 32;</p><p style="letter-spacing:.05em;">在 HDD 和 SSD 早期,AHCI 控制器接口协议和 SATA 硬盘传输接口足够满足系统的性能需求,性能的瓶颈在硬盘端,随着闪存技术的飞速发展,系统的性能瓶颈由下层(硬盘)转移至上层(接口和协议),SSD 急需要更高效的接口和协议。在此背景下,NVMe横空出世。</p><p style="letter-spacing:.05em;"><strong>NVMe</strong> 全称为 Non-Volatile Memory Express,是非易失性存储器标准,运行在PCIe 接口之上的协议标准。</p><p style="letter-spacing:.05em;">协议的层级关系为:NVMe <---事务层 <--- 数据链路层 <--- 物理层,NVMe作为命令层和应用层协议位于最上层,下面 3 层均为 PCIe。</p><p style="letter-spacing:.05em;"><img src="https://s2.51cto.com/images/blog//0_6182ba2bd56d.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184" style="width: 495px; height: 495px; visibility: visible;" alt='【协议】NVMe over RoCE 初探 SATA、PCIe 接口和AHCI、NVMe 协议_sed' /></p><p style="letter-spacing:.05em;">NVMe协议实际是一个应用层的协议,PCIe规范定义了传输层(事务层)、数据链路层和物理层。</p><p style="letter-spacing:.05em;">NVMe协议通常情况下是跑在PCIe协议栈上的。</p><p style="letter-spacing:.05em;">pcie是接口,nvme是协议。</p><p style="letter-spacing:.05em;">笔记本上pcie接口都是M.2的物理形态,但是M.2固态硬盘不一定都用nvme协议,可能是传统sata硬盘所用的ahci协议。</p><p style="letter-spacing:.05em;">现在已经有走PCIe通道的M.2接口了,就需要确认有没有NVMe协议相关驱动即可,可以进BIOS看一下,有没有NVMe相关的字眼,比如我的电脑,进到BIOS里面后,会看到如下:</p><p style="letter-spacing:.05em;"> 链接:https://www.zhihu.com/question//answer/</p><p style="letter-spacing:.05em;"> </p><p style="letter-spacing:.05em;"><img src="https://s2.51cto.com/images/blog//0_6182ba2bf363c54428.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184" style="width: 675px; height: 507px; visibility: visible;" alt='【协议】NVMe over RoCE 初探 SATA、PCIe 接口和AHCI、NVMe 协议_nvme_02' /></p><p style="letter-spacing:.05em;">下面将从 SATA和 PCIe 接口对比、 AHCI 和 NVMe速率对比、SSD 外形尺寸 3 方面对比 NVMe 和 AHCI的不同之处。</p><ul><li>AHCI 和 PCIe 接口对比</li></ul><ul><li>SATA 和 PCIe 速率对比</li></ul><p style="letter-spacing:.05em;">当前我们使用 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。</p><ul><li>SSD的外形尺寸</li></ul><p style="letter-spacing:.05em;"><img src="https://s2.51cto.com/images/blog//0_6182ba2c181d.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184" style="width: 675px; height: 343px; visibility: visible;" alt='【协议】NVMe over RoCE 初探 SATA、PCIe 接口和AHCI、NVMe 协议_nvme_03' /></p><p style="letter-spacing:.05em;">NVMe SSD外形接口形态有:PCIe card slot, M.2, and U.2,其中 U.2专为NVMe设计,有2.5英寸/3.5英寸标准尺寸固态硬盘驱动器。</p><ul><li>举个例子,S4510 1.92TB 和 P4610 1.6TB 参数对比</li></ul><p style="letter-spacing:.05em;">从上图可以直观看出,P4610 NVMe SSD 性能顺序和随机读/写性能明显优于 S4510 SATA SSD,具体数据为:顺序读约 5.7 倍、顺序写 3.7 倍、随机读约 6.6 倍、随机写约 5.6 倍。</p><p style="letter-spacing:.05em;">RDMA(全称:Remote Direct Memory Access)是一种远程直接内存访问技术,在硬件中实现传输层协议,将内存/消息原语接口暴露至用户空间,通过绕过 CPU 和内核网络协议栈来实现网络的高吞吐和低延迟。如今大规模部署 RDMA 的方式主要有 Infiniband 和 RoCE,前者主要用于高性能领域,后者用于互联网公司数据中心较多,本文的实验环境使用 RoCE。无论哪一种 RDMA 实现方式,都向上提供了统一的操作接口,即 RDMA verbs。</p><p style="letter-spacing:.05em;">实验设备拓扑图:</p><p style="letter-spacing:.05em;"><img src="https://s2.51cto.com/images/blog//0_6182ba2c2965b99469.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184" style="width: 675px; height: 230px; visibility: visible;" alt='【协议】NVMe over RoCE 初探 SATA、PCIe 接口和AHCI、NVMe 协议_linux_04' /></p><p style="letter-spacing:.05em;"> </p><div></div><p style="letter-spacing:.05em;"> </p><p style="letter-spacing:.05em;">驱动选择为:MLNX_OFED_LINUX-5.2-1.0.4.0-debian10.3-x86_64.tgz</p><p style="letter-spacing:.05em;"><img src="https://s2.51cto.com/images/blog//0_6182ba2c4209a35386.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184" style="width: 675px; height: 318px; visibility: visible;" alt='【协议】NVMe over RoCE 初探 SATA、PCIe 接口和AHCI、NVMe 协议_linux_05' /></p><p style="letter-spacing:.05em;">MLNX_OFED driver</p><p style="letter-spacing:.05em;">配置过程如下:</p><p style="letter-spacing:.05em;"> </p><div></div><p style="letter-spacing:.05em;"> </p><p style="letter-spacing:.05em;">背景:两台节点ip分别为:192.168.13.146, 192.168.13.147,使用 ib_send_bw 命令测试(需要指定 ib 设备名,本例中配置 mlx5_3 设备通信)。</p><p style="letter-spacing:.05em;"> </p><div></div><p style="letter-spacing:.05em;"> </p><p style="letter-spacing:.05em;">Initiator 和 target 连接方式如下图所示,左侧为initiator,其右为target。在NVMe协议中,NVMe 控制器作为与 initiator 进行沟通的实体。通过确定 PCIe port 、NVMe controller 和NVMe namespace,initiator 端可以通过 discover 和 connect 互联命令发现 target 端 NVMe namespace 并将其连接至本地。</p><p style="letter-spacing:.05em;"><img src="https://s2.51cto.com/images/blog//0_6182ba2c58a.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184" style="width: 675px; height: 341px; visibility: visible;" alt='【协议】NVMe over RoCE 初探 SATA、PCIe 接口和AHCI、NVMe 协议_命名空间_06' /></p><p style="letter-spacing:.05em;">引用至《深入浅出SSD》</p><p style="letter-spacing:.05em;">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 控制器。</p><p style="letter-spacing:.05em;">本文中 NVMe over RoCE 调用关系如下图所示,内核 nvme_rdma 模块相当于胶水层,连接 rdma stack 和 nvme core接口,即 NVMe 队列接口可以对接 RDMA 队列接口,进而调用下层 rdma stack 中 verbs 传输接口。</p><p style="letter-spacing:.05em;"><img src="https://s2.51cto.com/images/blog//0_6182ba2c6a.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184" style="width: 675px; height: 415px; visibility: visible;" alt='【协议】NVMe over RoCE 初探 SATA、PCIe 接口和AHCI、NVMe 协议_sed_07' /></p><p style="letter-spacing:.05em;">NVMe over RoCE 调用关系</p><p style="letter-spacing:.05em;"> </p><div></div><p style="letter-spacing:.05em;"> </p><p style="letter-spacing:.05em;">initiator 端,又称为host/client端,initiator 配置前提:RDMA基础环境已搭建。通过NVMe 互联命令探测和连接target 端 NVMe SSD 即可。</p><p style="letter-spacing:.05em;"> </p><div></div><p style="letter-spacing:.05em;"> </p><p style="letter-spacing:.05em;">配置前 initiator 和 target 各有 4块 NVMe SSD,使用上述 initator 和 target 配置方法,将 target 上 4 块 NVMe SSD 挂载至 initator,配置后的现象是 initiator 会显示 8 块 NVMe SSD,target 仍然是 4 块。经验证: target 不可以操作被挂载至 initiator 端的 NVMe SSD。配置状态如下图所示:</p><p style="letter-spacing:.05em;"><img src="https://s2.51cto.com/images/blog//0_6182ba2c7ec.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184" style="width: 675px; height: 221px; visibility: visible;" alt='【协议】NVMe over RoCE 初探 SATA、PCIe 接口和AHCI、NVMe 协议_linux_08' /></p><p style="letter-spacing:.05em;">配置前</p><p style="letter-spacing:.05em;"><img src="https://s2.51cto.com/images/blog//0_6182ba2c97bc080510.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184" style="width: 675px; height: 327px; visibility: visible;" alt='【协议】NVMe over RoCE 初探 SATA、PCIe 接口和AHCI、NVMe 协议_linux_09' /></p><p style="letter-spacing:.05em;">配置后</p><p style="letter-spacing:.05em;">下面对比测试本地 NVMe SSD 和 NVMe over RoCE SSD之间的顺序/随机性能,<strong>单盘+ext4文件系统</strong>,结论是:通过性能数据表明,NVMe over RoCE方法顺序读性能下降约 14%,随机写和随机读性能分别下降约 6% 和 2%,顺序写性能无影响。</p><p style="letter-spacing:.05em;">注:NVMe 裸盘测试性能正常,挂载文件系统后性能急剧下降,后续会在文件系统层面研究如何调优。</p><p style="letter-spacing:.05em;">测试方法:将 NVMe SSD 全盘顺序写2遍后,使用 fio 测试工具</p><p style="letter-spacing:.05em;"> </p><div></div><p style="letter-spacing:.05em;"> </p><p style="letter-spacing:.05em;">target 中同 1 个子系统(例如:nvme-subsystem-name)可供多个 initiator 连接。target 子系统关联的硬盘为 /dev/nvme0n1,此时 initiator1 和 initiator2 同时连接 target nvme-subsystem-name,挂载分区后的效果是: initiator1 和 initiator2 均可对 /dev/nvme0n1分区正常读写,但不会同步,仅有等待 disconnect ,再次 connect 后才会进行数据同步。</p><p style="letter-spacing:.05em;">问题1:nvmet 模块无法加载的问题</p><p style="letter-spacing:.05em;"> </p><div></div><p style="letter-spacing:.05em;"> </p><p style="letter-spacing:.05em;">问题2:在 initiation 端执行 nvme discover 命令时,遇到 报错</p><p style="letter-spacing:.05em;"> </p><div></div><p style="letter-spacing:.05em;"> </p><p style="letter-spacing:.05em;">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,完成一次通信。</p><p style="letter-spacing:.05em;"><strong>nvme 安装和常用命令</strong></p><p style="letter-spacing:.05em;"> </p><div></div><p style="letter-spacing:.05em;"> </p><p style="letter-spacing:.05em;"><strong>查看 NVMe SSD smartctl 信息</strong></p><p style="letter-spacing:.05em;"> </p><div></div><p style="letter-spacing:.05em;"> </p><p style="letter-spacing:.05em;">1、刀片仅有 2 个盘位,可以通过 RoCE 连接 NVMe SSD 存储池。</p><p style="letter-spacing:.05em;"> </p><div></div><p style="letter-spacing:.05em;"> </p><p style="letter-spacing:.05em;">2、读写分离场景,可以使用 NVMe over RDMA 搭建 NFS。</p><p style="letter-spacing:.05em;"> </p><div></div><p style="letter-spacing:.05em;"> </p><p style="letter-spacing:.05em;">3、NVMe SSD创建多个命名空间,通过 RoCE 供多个租户使用。</p><p style="letter-spacing:.05em;"> </p><div></div><p style="letter-spacing:.05em;"> </p><p style="letter-spacing:.05em;"><img src="https://s2.51cto.com/images/blog//0_6182ba2ca.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184" style="width: 483px; height: 319px; visibility: visible;" alt='【协议】NVMe over RoCE 初探 SATA、PCIe 接口和AHCI、NVMe 协议_块设备_10' /></p><p style="letter-spacing:.05em;">创建多个命名空间</p><p style="letter-spacing:.05em;"> </p>
讯享网

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/190089.html