NVMe over Fabric方案与测试结果分享

Memblaze对NVMe over Fabric的研究早已开始,2015年的FMS2015上,Memblaze就已经联合Mellanox演示了一个NVMe over Fabric的解决方案。而不久之前,Memblaze CTO路向峰拟写了《为了部落:NVMe over Fabric诞生记》系列文章,系统的介绍了NVMe over Fabric技术细节、市场前景及RDMA等内容。这篇文章将简述一个NVMe over Fabric方案的环境组成,并列举具体方案的性能测试结果。

简单的说NVMe over Fabric是将NVMe的数据包通过基于RDMA的网络进行传输,NVMe over Fabric把NVMe协议在单系统时代提供的高性能的优势进一步发挥到了NVMe存储系统互连结构中。在这种结构里,基于NVMe over Fabric的主机可以通过互连结构访问到任何一个数据中心的存储节点,可以说NVMe over Fabric是下一代数据中心存储的一个重点发展方向。

有了长时间的理论研究,尤其在NVMe over Fabric1.0规范发布之后,Memblaze已经将NVMe over Fabric落地在解决方案上,关于NVMe over Fabric的部署及实际方案能够达到的性能,Memblaze的最新白皮书《Export Memblaze PBlaze4 NVMe SSD by NVMe Over Fabric Or NVMe Over Fabric in SPDK》给出了一个明确的答案。(点击下载本白皮书

本次NVMe over Fabric的环境信息:

Server: 2* PowerEdge R730xd( Intel(R) Xeon(R) CPU E5-2630 v3 @ 2.40GHz, 8 core,128GB DRAM)
Storage: Memblaze 3.2T PBlaze4 U.2 Disk (20W Power Limit)
OS: CentOS 4.7.0-rc2+
DPDK: dpdk-stable-16.07.1
RoCE Modes: RoCE v1
HCA: Mellanox ConnectX-3 Pro (Firmware version:2.36.5150)
NVMe Over Fabric Target of Linux Kernel: nvmet.ko (DEFDD1F71C669E1679530B9)
NVMe Over Fabric Target Driver of Linux Kernel: nvmet-rdma (865E9D5BA7A00E6EC149124)
NVMe Over Fabric Client: nvme-cli (nvme version 0.9.77.gc5e4)
NVMe Over Fabric Client Host Driver: nvme-rdma.ko (1E2A340FDC19F7E5BF87F8C)
fio测试配置(bs/rw/numjobs/iodepth等测试参数根据具体的测试案例进行配置):
ioengine=libaio
random_generator=tausworthe64
direct=1
thread=1
norandommap
randrepeat=0
测试的基本项目及操作:

测试项目

测试描述

基于Linux内核驱动的本地NVMe SSD测试

使用Linux内核的NVMe驱动,使用fio测试NVMe SSD的性能。

NVMe over Fabric测试

使用nvme-cli连接Linux内核的NVMe over fabric target,使用客户端服务器上的fio进行测试

 4KB随机读延迟分析

4KB Random Read(1 Outstanding IO)

Linux Kernel Local Test (NVMe Driver)

NVMeOF Test (Target of Linux Kernel)

Avg. Latency (us)

98.56

109.50

99.00% IO Latency Under (us)

121

131

4KB随机读的测试中可以看到,在低压力下(1outstanding IO),同样是内核驱动,NVMe over Fabric环境下IO延迟比Linux本地IO延迟高出10 us,约为总延迟的10%。而这是在40GbE环境下,当网络带宽提升至100GbE,网络延迟将进一步降低。
在高压力(256 outstanding IO)场景下,NVMe over Fabric对于延迟的影响同样比较小。为了让结果更为精确,这里将这个测试条件下的IOPS数据也加上来。

4KB Random Read (256 Outstanding IO)

Linux Kernel Local Test(NVMe Driver)

NVMeOF Test(Target of Linux Kernel)

IOPS

714,643

701,184

Avg. Latency (us)

354.18

359.75

99.00% IO Latency Under (us)

1,176

884

可以看出,在高压力下,本地系统IOPS比NVMe over Fabric要高,但是在延迟上两者处于同一水平。可以证明NVMe over Fabric对于降低网络延迟有着显著效果。

最后,看下4KB随机写的测试结果。

4KB Random Write(256 Outstanding IO)

Linux Kernel Local Test(NVMe Driver)

NVMe over Fabric Test(Target of Linux Kernel)

IOPS

163,112 IOPS

163,120 IOPS

Avg. Latency

1.56 ms

1.56 ms

99.00% IO Latency Under

10 ms

10 ms

99.99% IO Latency Under

27.26 ms

27.01 ms

上面表格中的数据展示了4KB随机写测试中的数据,可以看到本地的IOPS和延迟两个指标与NVMe over Fabric环境下的结果近乎相同。这意味着在写操作中,基于NVMe over fabric的远程网络延迟几乎是可以忽略不计的。
NVMe over Fabric能够有效的降低网络的延迟,使得NVMe SSD的优势能够充分发挥,避免远程访问时路径过长造成延迟过大。随着NVMe SSD技术的进一步发展,系统的性能将进一步提升,届时100GbE等新的以太网将更为普及,整个数据中心的性能也将跳到一个新的阶段。
### NVMe over Fabrics 技术原理实现 #### 1. 基础概念 NVMe over Fabrics (简称 NVMe-oF) 是一种基于网络的存储访问技术,允许主机通过高速网络连接到远程存储设备,如同它们是本地 PCIe 设备一样工作。该技术的核心目标是在不改变现有硬件基础设施的情况下提供高性能和低延迟的数据传输能力。 这种技术的关键在于其架构设计,它将传统的 NVMe 协议扩展到了更广泛的网络环境中[^2]。具体来说,NVMe-over-Fabrics 使用了一种分层模型来定义协议栈的不同部分,其中核心组件包括: - **NVMe 接口**:负责处理命令和服务请求。 - **传输绑定规范**:描述如何将 NVMe 的服务映射到具体的传输机制上[^1]。 此外,Fabric 被定义为一个局域网内的 RDMA 网络,这使得数据能够在节点之间高效传递而无需额外的 CPU 干预[^3]。 #### 2. 实现方式 为了使 NVMe 运行在网络环境下,NVMe-over-Fabric 构建在现有的传输层协议之上,而不是重新发明一套全新的底层通信方法。这意味着它可以无缝集成进当前广泛部署的技术框架中,比如 RoCE 或 iWARP 等 RDMA 解决方案[^4]。 以下是几个主要方面的实现细节: ##### (1)协议适配 不同的 Fabric 类型可能采用各自的专用协议来进行消息交换。例如,在以太网上运行时可能会利用 TCP/IP 来承载 NVMe 流量;而在 InfiniBand 上则会依赖 SRP(SCSI Remote Protocol)。无论哪种情况,都需要确保这些基础协议能够满足 NVMe 所需的功能特性,如队列管理、错误恢复等。 ##### (2)性能优化 由于引入了网络因素,必然会对整体吞吐率造成一定影响。为此,开发人员采取了一系列措施减少开销并提升效率: - 利用零拷贝技术和内存注册降低 CPU 和带宽消耗; - 支持多路径 I/O 提高可靠性及负载均衡效果; - 集成端到端 QoS 控制策略保障服务质量。 ##### (3)互操作性考量 随着越来越多厂商加入支持行列,标准化变得尤为重要。目前已有多个知名科技企业表态认可 NVMe-oF/TCP 方向,并积极参相关制定过程[^5]。此举有助于促进生态系统健康发展,同时也让用户拥有更多选择余地去匹配各自业务需求场景的最佳实践组合。 ```python # 示例代码展示简单的 NVMe-oF 客户端初始化逻辑 import nvmeof_client_library as ncl def initialize_nvme_of_client(target_ip, target_port): client = ncl.NVMeOFClient() connection_params = { 'target_address': f"{target_ip}:{target_port}", 'protocol_type': 'tcp', # 可替换为其他支持类型 roce/iwarp etc. } try: client.connect(connection_params) print("Connection established successfully.") except Exception as e: print(f"Failed to establish connection: {str(e)}") initialize_nvme_of_client('192.168.1.100', 4420) ``` 以上脚本片段演示了一个基本的 Python 函数用来建立指向指定 IP 地址和端口号的目标服务器之间的链接关系。实际应用当中还需要考虑更多的配置选项以及异常处理流程等内容。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值