SPDK 存储性能开发套件(Storage Performance Development Kit )

SPDK官网:https://spdk.io/

什么是SPDK

针对于支持nvme协议的SSD设备,Intel发布的,提供了一整套工具和库,以实现高性能、扩展性强、全用户态的存储应用程序

为什么要引入SPDK

因为nvme已经快到一定程度了,很多东西,尤其是软件已经赶不上他了,此时软件反而成为了系统IO的瓶颈。

通俗的讲,以前的HDD 是一个磁头工作,一个CPU伺候它就行,现在的nvme SSD盘 跟内存一样可以并行读写,可以多个CPU同时读写,可以理解成多个”磁头“同时工作。以前那套针对"单磁头"软件还没适配过来落后了,就需要新的软件架构,SPDK就来了。

https://www.cnblogs.com/powerrailgun/p/12389660.html?ivk_sa=1024320u

针对HDD的软件在SSD时代缺点

HDD:机械硬盘

2、以前的linuxIO栈针对HDD做了诸多优化:page cache等;内核采用中断方式进行DMA(外部设备不通过CPU而直接与系统内存交换数据的接口技术)。

而现在ssd的出现,这样的优化会使ssd的硬盘存在空缺(OS kernel请求数据-->等待对方准备后的过程:去做别的事情/休眠 -->取数据。ssd很快,根本不需要OS kernel 做这个过程来等待),不能充分利用。

3、以前的方式会存在大量的内核上下文切换和中断,造成大量的延迟和开销。

现在spdk采用将设备驱动代码放在用户态,避免内核上下文切换。spdk采用轮询模式代替传统的IO模型。

​ 在传统的I/O模型中,应用程序提交读写请求后进入睡眠状态,一旦I/O完成,中断就会将其唤醒。 ​

轮询的工作方式则不同,应用程序提交读写请求后继续执行其他工作,以一定的时间间隔回头检查I/O是否已经完成。(因为SSD很快,这样一来 “请求后进入睡眠再醒来过程太慢”)

传统的方式:中断开销只占整个I/O时间【io读取慢】的很小的百分比,因此给系统带来了巨大的效率提升。 现在的方式:持续引入更低时延的持久化设备,中断开销成为了整个I/O时间中不可忽视的部分。所以我们必须区优化,使其达到平衡。

针对SSD提出SPDK方案

(SPDK) 提供了一组工具和库,用于编写高性能、可扩展的用户模式存储应用程序。它通过使用一些关键技术实现高性能:

将所有必要的驱动程序移动到用户空间,从而避免 syscalls,并允许从应用程序中访问零拷贝。 对硬件进行完成轮询,而不是依赖中断,这降低了总延迟和延迟方差。 避免 I/O 路径中的所有锁,而是依靠消息传递。 为此SPDK主要运用了两项关键技术:UIO和pooling,使用SPDK的存储系统能轻松达到数百万IOPS。

首先,将设备驱动代码运行在用户态,避免内核上下文切换和中断将会节省大量的处理开销,允许更多的时钟周期被用来做实际的数据存储。无论存储算法(去冗,加密,压缩,空白块存储)多么复杂,浪费更少的时钟周期总是意味着更好的性能和时延。

其次,采用轮询模式改变了传统I/O的基本模型。在传统的I/O模型中,应用程序提交读写请求后进入睡眠状态,一旦I/O完成,中断就会将其唤醒。轮询的工作方式则不同,应用程序提交读写请求后继续执行其他工作,以一定的时间间隔回头检查I/O是否已经完成。这种方式避免了中断带来的延迟和开销,并使得应用程序提高了I/O效率。

概括:要在用户态实施一套基于用户态软件驱动的完整I/O栈。


本文章使用limfx的vscode插件快速发布