注: 要进一步搞清楚SSD盘对应的PCI的BAR寄存器的映射,有必要先了解一下UIO(Userspace I/O). UIO(Userspace I/O)是运行在用户空间的I/O技术.在Linux系统中,一般的设备驱动都是运行在内核空间,而在用户空间使用应用程序调用即可.而UIO则是将设备驱动的很少一部分运行在内核空间,而在用户空间实现驱动的绝大多数功能.那么,在内核空间UIO要做的事情就变得很简单,分为两种: 分配和记录设备需要的资源和注册UIO设备 实现必须在内核空间实现的中断处理函数 为了…
说明: 之所以要翻译这篇论文,是因为参考此论文可以很好地理解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()关联在一起的.本…
在多核(SMP)多线程的情况下,如果不知道CPU乱序执行的话,将会是一场噩梦,因为无论怎么进行代码Review也不可能发现跟内存屏障(MB)相关的Bug.内存屏障分为两类: 跟编译有关的内存屏障: 告诉编译器,不要优化我,俺不需要 跟CPU有关的内存屏障: 告诉CPU, 不要乱序执行,谢谢 1. NVMeDirect中的内存屏障 /* nvmedirect/include/lib_nvmed.h */ 38 #define COMPILER_BARRIER() asm volatile("&qu…
使用RDMA, 必然关系到内存区域(Memory Region)的注册问题.在本文中,我们将以mlx5 HCA卡为例回答如下几个问题: 为什么需要注册内存区域? 注册内存区域有嘛好处? 注册内存区域的实现过程 1. 为什么需要注册内存区域? 首先,我们知道,由于DMA设备只访问物理内存地址,因此,DMA引擎需要主机系统内存的物理地址连续,这一点无可非议,因为如果物理地址不连续,即便DMA引擎知道buffer开始的地址(虚拟地址)和buffer长度,也不知道怎么搬数据.试想一下,如果让DMA引擎知…