导语

众所周知在Linux起源之初,文件系统io栈针对机械盘进行了众多优化,包括page、cache等多种优化方式。内核采用中断的方式进行DMA将数据从内核态拷贝回用户态,再交由用户程序处理,这是机械硬盘时代的io处理方式。
而随着nvme-ssd的出现,如果再采用此种方式就会导致大量的硬盘空闲,浪费硬盘性能。为了帮助上游的应用厂商以及存储厂商更好的发挥ssd磁盘的性能,intel开发了一套基于nvme-ssd的开发套件,SPDK。
SPDK的目标是通过使用Intel的网络,处理,存储技术,将固态存储介质出色的功效发挥到极致。相对于传统IO方式,SPDK运用了两项关键技术:UIO和pooling。
首先,将设备驱动代码运行在用户态,避免内核上下文切换和中断将会节省大量的处理开销,允许更多的时钟周期被用来做实际的数据存储。无论存储算法(去冗,加密,压缩,空白块存储)多么复杂,浪费更少的时钟周期总是意味着更好的性能和时延。这并不是说内核增加了不必要的开销;相反,内核增加了一些与通用计算用例相关的开销,因而可能不适合专用的存储栈。上文也提及到SPDK实际上是为nvme-ssd开发的一套开发组件,并不适用于机械硬盘。
其次,采用轮询模式改变了传统I/O的基本模型。在传统的I/O模型中,应用程序提交读写请求后进入睡眠状态(阻塞),一旦I/O完成,中断就会将其唤醒。
轮询的工作方式则不同,应用程序提交读写请求后继续执行其他工作(立即返回),以一定的时间间隔回头检查I/O是否已经完成(poll_cq处理完成wc,如果没有wc立即返回)。
这种方式避免了中断带来的延迟和开销,并使得应用程序提高了I/O效率。
在机械硬盘时代,中断开销只占整个I/O时间的很小的百分比,因此给系统带来了巨大的效率提升。(因为更多的是读写数据的过程)
然而,在固态设备时代,持续引入更低时延的持久化设备,中断开销成为了整个I/O时间中不可忽视的部分。这个问题在更低时延的设备上只会越来越严重。系统已经能够每秒处理数百万个I/O,所以消除数百万个事务的这种开销,能够快速地复制到多个core中。数据包和数据块被立即分发,因为等待花费的时间变小,使得时延更低,一致性时延更多(抖动更少),吞吐量也得到了提高。

SPDK


驱动层:
NVMe driver:SPDK的基础组件,高度优化且无锁的驱动提供了前所未有的高扩展性,高效性和高性能

块设备层:
NVMe over Fabrics(NVMe-oF)initiator:本地SPDK NVMe驱动和NVMe-oF initiator共享一套公共的API。本地远程API调用及其简便
Ceph RBD:将rbd设备作为spdk的后端存储。
Blobstore Block Device:基于SPDK技术设计的Blobstore块设备,应用于虚机或数据库场景。由于spdk的无锁机制,将享有更好的性能。
Linux AIO:spdk与内核设备(如机械硬盘)交互。

存储服务层:
bdev:通用的块设备抽象。连接到各种不同设备驱动和块设备的存储协议,类似于文件系统的VFS(实际块存储为块设备层的某一种)。在块层提供灵活的API用于额外的用户功能(磁盘阵列,压缩,去冗等)。
Blobstore:SPDK实现一个高精简的类文件的语义(非POSIX)。这可为数据库,容器,虚拟机或其他不依赖于大部分POSIX文件系统功能集(比如用户访问控制)的工作负载提供高性能支撑。

存储协议层
iSCSI target:现在大多使用原生iscsi
vhost-scsi target:KVM/QEMU的功能利用了SPDK NVMe驱动,使得访客虚拟机访问存储设备时延更低,使得I/O密集型工作负载的整体CPU负载有所下降。
NVMe-oF target:实现了新的NVMe-oF规范。虽然这取决于RDMA硬件,NVMe-oF target可以为每个CPU核提供高达40Gbps的流量。

原文地址:http://www.cnblogs.com/lygin/p/16918137.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性