目录
什么是SPDK
为什么要引入SPDK?
原因
针对HDD的软件在SSD时代缺点和解决方案
针对HDD的软件在SSD时代缺点
针对SSD,提出SPDK方案
与RDMA的结合
SPDK的设计理念
架构
SPDK的组件构成
典型使用场景
SPDK例子
名词解释
作者:bandaoyu 地址:https://blog.csdn.net/bandaoyu/article/details/
什么是SPDK
SPDK 存储性能开发套件(Storage Performance Development Kit ) —— 针对于支持nvme协议的SSD设备。 SPDK是一种高性能的解决方案。
硬件推动软件革新需求。
Intel发布的,提供了一整套工具和库,以实现高性能、扩展性强、全用户态的存储应用程序。它是继DPDK之后,intel在存储领域推出的又一项颠覆性技术,旨在大幅缩减存储IO栈的软件开销,从而提升存储性能,可以说它就是为了存储性能而生。
为什么要引入SPDK?
原因
因为nvme已经快到一定程度了,很多东西,尤其是软件已经赶不上他了,此时软件反而成为了系统IO的瓶颈。
通俗的讲,以前的HDD 是一个磁头工作,一个CPU伺候它就行,现在的nvme SSD盘 跟内存一样可以并行读写,可以多个CPU同时读写,可以理解成多个”磁头“同时工作。以前那套针对"单磁头"软件还没适配过来落后了,就需要新的软件架构,SPDK就来了。
针对HDD的软件在SSD时代缺点和解决方案
一般来说读写数据的运作方式是这样的:OS kernel请求一组数据,硬盘回应“嗯,没问题”,但是NAND闪存挺慢的,所以需要一点时间。将数据载入到硬盘的缓存中,准备好了就会告诉OS kernel,给CPU发送一个中断信号,“嘿,数据已经准备好了,没问题了,可以来取那组数据了”。
但是如果此时CPU核心正在忙着处理其他事情,或者暂时处于睡眠状态,或者被重新分配到其他任务上的话(这种情况在多核心CPU中是很常见的),那么这个中断信号到不了CPU,那么CPU就不会去取那组数据。
也就是说当CPU在执行大量的计算任务时或者很繁忙的时候,那么读写任务可能受到严重的影响,特别是响应更快的nvme。使用nvme磁盘的系统,在CPU高负载的情况下可能会出现问题。
对此业界给出了一个解决方案,对于超高速设备(比如这里的nvme磁盘,基于RAM的缓存盘)以一种叫做“轮询”的模式运作。这是一种完全不同的模式。说人话就是:系统内核假定设备非常快,快到“不用问准备好了没,问就是准备好了”。(设备速度很快,马上就可以把数据准备好)。
当然如果在比较慢的硬盘(比如机械硬盘)上这么搞会带来很大的性能损耗。因为系统会不停的问“嘿,准备好了吗?嘿,准备好了吗?”,这样一来,IO时延变高了,同时读写带宽也会受影响。但是对于nvme盘,特别是前面提到的超快速的存储设备,这么做是值得的。
而spdk的存在就是提供一种以轮询的方式来访问硬盘的方式,在高速设备上用于取代中断的访问方式。https://www.cnblogs.com/powerrailgun/p/12389660.html?ivk_sa=1024320u
针对HDD的软件在SSD时代缺点
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时间中不可忽视的部分。所以我们必须区优化,使其达到平衡。
原文链接:https://blog.csdn.net/_/article/details/
针对SSD,提出SPDK方案
(SPDK) 提供了一组工具和库,用于编写高性能、可扩展的用户模式存储应用程序。它通过使用一些关键技术实现高性能:
- 将所有必要的驱动程序移动到用户空间,从而避免 syscalls,并允许从应用程序中访问零拷贝。
- 对硬件进行完成轮询,而不是依赖中断,这降低了总延迟和延迟方差。
- 避免 I/O 路径中的所有锁,而是依靠消息传递。
为此SPDK主要运用了两项关键技术:UIO和pooling,使用SPDK的存储系统能轻松达到数百万IOPS。
首先,将设备驱动代码运行在用户态,避免内核上下文切换和中断将会节省大量的处理开销,允许更多的时钟周期被用来做实际的数据存储。无论存储算法(去冗,加密,压缩,空白块存储)多么复杂,浪费更少的时钟周期总是意味着更好的性能和时延。
其次,采用轮询模式改变了传统I/O的基本模型。在传统的I/O模型中,应用程序提交读写请求后进入睡眠状态,一旦I/O完成,中断就会将其唤醒。轮询的工作方式则不同,应用程序提交读写请求后继续执行其他工作,以一定的时间间隔回头检查I/O是否已经完成。这种方式避免了中断带来的延迟和开销,并使得应用程序提高了I/O效率。
概括:要在用户态实施一套基于用户态软件驱动的完整I/O栈。
传统的IO需要syscalls

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