也学习了一段时间的spdk,对spdk的大体有些了解,这里记录粗浅理解,以后继续加强完善和学习。
为什么要引入SPDK?
1、现在的硬盘SSD从性能、功耗以及密度上都相比传统机械硬盘HDD存在巨大的优势。
2、以前的linuxIO栈针对HDD做了诸多优化:page cache等;内核采用中断方式进行DMA(外部设备不通过CPU而直接与系统内存交换数据的接口技术)。而现在ssd的出现,这样的优化会使ssd的硬盘存在空缺,不能充分利用。
3、以前的方式会存在大量的内核上下文切换和中断,造成大量的延迟和开销。现在spdk采用将设备驱动代码放在用户态,避免内核上下文切换。spdk采用轮询模式代替传统的IO模型。
- 在传统的I/O模型中,应用程序提交读写请求后进入睡眠状态,一旦I/O完成,中断就会将其唤醒。
- 轮询的工作方式则不同,应用程序提交读写请求后继续执行其他工作,以一定的时间间隔回头检查I/O是否已经完成。
传统的方式:中断开销只占整个I/O时间【io读取慢】的很小的百分比,因此给系统带来了巨大的效率提升。
现在的方式:持续引入更低时延的持久化设备,中断开销成为了整个I/O时间中不可忽视的部分。所以我们必须区优化,使其达到平衡。
什么是SPDK
首先要明确spdk是一个框架,而不是一个分布式系统,spdk的基石(官网用了bedrock 这个词)是用户态(user space)、轮询(polled-mode)、异步(asynchronous)、无锁(lockless)的NVMe驱动,其提供了零拷贝、高并发直接从用户态访问ssd的特性。其最初的目的是为了优化块存储落盘。但随着spdk的持续演进,大家发现spdk可以优化存储软件栈的各个方面。
很多分布式存储系统都在思考如何吸纳spdk框架,或是采用spdk代表的高性能存储技术,来优化整条IO链路。
[2]什么是SPDK,以及什么场景需要它
[3]What is SPDK
最后
我学习spdk的目标是,利用其去调用rocksdb,运行在用户态,这些spdk设计之初就有了,我需要做的是灵活使用它,它现在肯定没有优化完全,所以存在哪些地方需要改进也需要完善。
spdk只是开了个头,当然了解这些肯定不够,还需要一些基础知识,我已知需要了解的清单如下:
- 学习linux的IO栈,了解为什么引入SPDK和nvme(以前是机械硬盘,现在是高性能的存储方式了)
- 了解CockroachDB的整体架构,目标方便后面讲技术嵌入到当前框架;
- rocksdb
- nvme
SPDK的指导原则是通过消除每一处额外的软件开销来提供最少的时延和最高的效率。