在NVMe over PCIe中,I/O命令支持SGL(Scatter Gather List 分散聚合表)和PRP(Physical Region Page 物理(内存)区域页), 而管理命令只支持PRP;而在NVMe over Fabrics中,无论是管理命令还是I/O命令都只支持SGL.NVMe over Fabrics既支持FC网络,又支持RDMA网络.众所周知,在RDMA编程中,SGL(Scatter/Gather List)是最基本的数据组织形式. SGL是一个数组,该数组中的元素被…
使用RDMA, 必然关系到内存区域(Memory Region)的注册问题.在本文中,我们将以mlx5 HCA卡为例回答如下几个问题: 为什么需要注册内存区域? 注册内存区域有嘛好处? 注册内存区域的实现过程 1. 为什么需要注册内存区域? 首先,我们知道,由于DMA设备只访问物理内存地址,因此,DMA引擎需要主机系统内存的物理地址连续,这一点无可非议,因为如果物理地址不连续,即便DMA引擎知道buffer开始的地址(虚拟地址)和buffer长度,也不知道怎么搬数据.试想一下,如果让DMA引擎知…
说明: 之所以要翻译这篇论文,是因为参考此论文可以很好地理解SPDK/NVMe的设计思想. NVMeDirect: A User-space I/O Framework for Application-specific Optimization on NVMe SSDs NVMeDirect: 面向基于NVMe固态硬盘存储应用优化的一种用户空间I/O框架 Hyeong-Jun Kim, Sungkyunkwan University, hjkim@csl.skku.edu Young-Sik L…
Introduction to the Storage Performance Development Kit (SPDK) | SPDK概述 By Jonathan S. (Intel), Updated December 5, 2016 Solid-state storage media is in the process of taking over the data center. Current-generation flash storage enjoys significant a…
源代码及NVMe协议版本 SPDK : spdk-17.07.1 DPDK : dpdk-17.08 NVMe Spec: 1.2.1 基本分析方法 01 - 到官网http://www.spdk.io/下载spdk-17.07.1.tar.gz 02 - 到官网http://www.dpdk.org/下载dpdk-17.08.tar.xz 03 - 创建目录nvme/src, 将spdk-17.07.1.tar.gz和dpdk-17.08.tar.xz解压缩到nvme/src中,然后用Open…
1. NVMe概述 NVMe是一个针对基于PCIe的固态硬盘的高性能的.可扩展的主机控制器接口. NVMe的显著特征是提供多个队列来处理I/O命令.单个NVMe设备支持多达64K个I/O 队列,每个I/O队列可以管理多达64K个命令. 当主机发出一个I/O命令的时候,主机系统将命令放置到提交队列(SQ),然后使用门铃寄存器(DB)通知NVMe设备. 当NVMe设备处理完I/O命令之后,设备将处理结果写入到完成队列(CQ),并引发一个中断通知主机系统. NVMe使用MSI/MSI-X和中断聚合来提…
毫无疑问地,用来取代iSCSI/iSER(iSCSI Extensions for RDMA)技术的NVMe over Fabrics着实让RDMA又火了一把.在介绍NVMe over Fabrics之前,先科普一下RDMA. 1. DMA和RDMA的概念 1.1 什么是DMA? Direct Memory Access(DMA) is a capability provided that allows data to be sent directly from an attached devi…
注: 之所以要中英文对照翻译下面的文章,是因为SPDK严重依赖于DPDK的实现. Introduction to DPDK: Architecture and PrinciplesDPDK概论:体系结构与实现原理 Linux network stack performance has become increasingly relevant over the past few years. This is perfectly understandable: the amount of data…
OFA定义了一组标准的Verbs,并提供了一个标准库libibvers.在用户态实现NVMe over RDMA的Host(i.e. Initiator)和Target, 少不了要跟OFA定义的Verbs打交道.但是,仅仅有libibverbs里的API是不够的,还需要对应的RDMA硬件的用户态驱动支持.在前文中,我们分析了内核态ib_post_send()的实现,理解了内核空间的回调函数post_send()是如何跟mlx5卡的设备驱动函数mlx5_ib_post_send()关联在一起的.本…
OFA定义了一组标准的Verbs,并在用户态提供了一个标准库libibverbs.例如将一个工作请求(WR)放置到发送队列的Verb API是ibv_post_send(), 但是在Linux内核,对应的API则是ib_post_send().本文将使用Linux内核提供的mlx5卡(Mellanox公司生产的一种HCA卡)的驱动(mlx5_ib.ko)分析内核Verb API ib_post_send()的实现原理.分析用到的源代码包有: libibvers源代码: libibverbs-1.…