什么是SPDK,以及什么场景需要它

  • 1. 前言
  • 2. 什么是spdk
  • 3. spdk的设计理念
  • 3. 使用spdk加速NVMe存储
  • 4. spdk bdev
  • 5. spdk应用场景
  • 6. 总结
  • 7. 参考链接

1. 前言

有关spdk网上已经有了很多文章,笔者只是想结合自己日常工作对spdk的理解,阐述为什么是spdk是一个高性能的解决方案,以及什么场景适合用spdk。本文不会特别深入某个具体技术细节,有关具体的技术实现,笔者会放在文末的参考连接中。

2. 什么是spdk

首先要明确spdk是一个框架,而不是一个分布式系统,spdk的基石(官网用了bedrock 这个词)是用户态(user space)、轮询(polled-mode)、异步(asynchronous)、无锁(lockless)的NVMe驱动,其提供了零拷贝、高并发直接从用户态访问ssd的特性。其最初的目的是为了优化块存储落盘。但随着spdk的持续演进,大家发现spdk可以优化存储软件栈的各个方面。

很多分布式存储系统都在思考如何吸纳spdk框架,或是采用spdk代表的高性能存储技术,来优化整条IO链路。

3. spdk的设计理念

spdk主要通过引入以下技术,实现其高性能方案。

  1. 将存储用到的驱动转移到用户态,从而避免系统调用带来的性能损耗,顺便可以直接使用用户态内存落盘实现零拷贝
  2. 使用polling模式
    1. 轮询硬件队列,而不像之前那样使用中断模式,中断模式带来了不稳定的性能和延时的提升
    2. 任何业务都可以在spdk的线程中将轮询函数注册为poller,注册之后该函数会在spdk中周期性的执行,避免了epoll等事件通知机制造成的overhead。
  3. 避免在IO链路上使用锁。使用无锁队列传递消息/IO
    • spdk设计的主要目标之一就随着使用硬件(e.g. SSD,NIC,CPU)的增多而获得性能的线性提升,为了达到这目的,spdk的设计者就必须消除使用更多的系统资源带来的overhead,如:更多的线程、进程间通信,访问更多的存储硬件、网卡带来的性能损耗。
    • 为了降低这种性能开销,spdk引入了无锁队列,使用lock-free编程,从而避免锁带来的性能损耗。
    • spdk的无锁队列主要依赖的dpdk的实现,其本质是使用cas(compare and swap)实现了多生产者多消费者FIFO队列。有关无锁队列的实现可以看这篇文章

通俗的来讲spdk运行时会占用满指定的CPU core,其本质就是一个大的while死循环,占满一个cpu core。去连续的跑用户指定的poller,轮询队列、网络接口等等。因此,spdk编程最基本的准则,就是避免在spdk核上出现进程上下文切换。其会打破spdk高性能框架,造成性能降低甚至不能工作。

进程上下文切换会因为很多原因导致,大致列举如下,我们在spdk编程时切忌要避免。笔者就曾遇到因为spdk线程中一个不起眼的系统调用mmap进入了内核,导致整个spdk进程不可服务直到宕机。

  • cpu时间片耗尽
  • 进程在系统资源不足(比如内存不足)时,要等到资源满足后才可以运行,这个时候进程也会被挂起,并由系统调度其他进程运行。
  • 进程主动调用sleep等函数让出cpu使用权。
  • 当有优先级更高的进程运行时,为了保证高优先级进程的运行,当前进程会被挂起,由高优先级进程来运行。
  • 硬件中断会导致CPU上的进程被挂起,转而执行内核的中断服务程序。

3. 使用spdk加速NVMe存储

spdk希望通过在用户态直接访问NVMe SSD,而不经过kernel nvme 驱动(bypass kernel)。

spdk将NVMe SSD从内核驱动解绑,再绑定到vfio或者uio驱动上。虽然这两个启动本身不会对nvme设备做任何初始化操作。但它给了SPDK直接访问nvme设备的能力,后续的初始化和下发命令都由spdk负责。所以spdk访问NVMe SSD的调用基本上都是和nvme命令对应的,如admin cmd spdk_nvme_ctrlr_cmd_set_featurespdk_nvme_ctrlr_cmd_get_log_page,和io cmd spdk_nvme_ctrlr_alloc_io_qpairspdk_nvme_ns_cmd_read等等。当然,iouring已经和这里的io cmd有点像了:)

4. spdk bdev

spdk在上述加速访问NVMe存储的基础上,提供了块设备(bdev)的软件栈,这个块设备并不是linux系统中的块设备,spdk中的块设备只是软件抽象出的接口层。

spdk已经提供了各种bdev,满足不同的后端存储方式、测试需求。如NVMe (NVMe bdev既有NVMe物理盘,也包括NVMeof)、内存(malloc bdev)、不落盘直接返回(null bdev)等等。用户也可以自定义自己的bdev,一个很常见的使用spdk的方式是,用户定义自己的bdev,用以访问自己的分布式存储集群。

spdk通过bdev接口层,统一了块设备的调用方法,使用者只要调用不同的rpc将不同的块设备加到spdk进程中,就可以使用各种bdev,而不同修改代码。并且用户增加自己的bdev也很简单,这极大的拓展了spdk的适用场景。

讲到这里,各位同学应该明白了,spdk目前的的应用场景主要是针对块存储,可以说块存储的整个存储的基石,再其之上我们又构建了各种文件存储、对象存储、表格存储、数据库等等,我们可以如各种云原生数据库一样将上层的分布式系统直接构建在分布式块存储、对象存储之上,也可以将其他存储需要管理的元数据、索引下推到块层,直接用spdk优化上层存储,比如目前的块存储使用lba作为索引粒度管控,我们可以将索引变为文件/对象,在其之上构建文件/对象存储系统。

5. spdk应用场景

spdk最直接的使用方式是作为存储引擎加速访问NVMe SSD。在此之上spdk又抽象了bdev层,各种业务通过绑定bdev,可以将块存储设备通过某种方式暴露给用户,这就是我们下面要讲到的各种应用场景。

企业使用块存储的目的,就是将后端存储(可以是本地盘,也可以是分布式存储集群)暴露给用户,它的实现形式如公有云、私有云等等我们暂且不讨论。单就表现方式来讲,我们有很多方法将这个块设备暴露给用户,笔者主要接触到如下几种:

  1. 使用网络存储协议如iSCSI/nbd/NVMeof,在用户使用的主机上建立client(iscsi/nvmeof协议中称之initiator),访问块设备
  2. 通过virtio虚拟化的方式,使用将某种块设备在host os上提供给虚拟机,这其中又有不同的设备device对用不同的驱动,其IO链路也各不相同,如vhost-user-blk,vfio-pci,virtio-blk等等
  3. bare-metal/smart-nic/DPU通过建立pf/vf,模拟NVMe/virtio块设备

前两种方式,spdk都提供有对应的后端驱动,如iSCSI targetNVMe-oF targetvhost target等。第三类方式不同厂商具体实现方式有所不同,未必开源。我们使用spdk作为这些后端驱动,接收客户端的IO并进行处理,其好处是可以利用到spdk高性能存储框架,也就是之前提到的user spacepolled-modeasynchronouslockless。spdk官网有很多测试文档介绍使用spdk和其他开源实现的性能比较,还是较为可观的。

6. 总结

笔者已经使用spdk两年了,总体来说还是较为满意的,spdk社区提供了各种手段供大家交流,spdk的中国团队也经常出一些技术文章、技术视频的等等。并且spdk一路走来,一直在吸纳、支持各种软件、硬件新特性。我们通过学习spdk,可以接触到存储技术栈的各个方面。所以我认为作为一个存储人,无论是否在工作中使用到spdk,都必须了解spdk背后的各种高性能存储技术。

7. 参考链接

  1. Storage Performance Development Kitsspdk官方文档
  2. 虚拟化技术 - 概览 [一]
  3. 20.01 SPDK NVMe-oF RDMA Performance Report

什么是SPDK,以及什么场景需要它相关推荐

  1. 干货分享 | spdk技术简介和一些实践经验

    01 导读 与机械硬盘相比,NVMe-ssd在性能.功耗和密度上都有巨大的优势,并且随着固态存储介质的高速发展,其价格也在大幅下降,这些优势使得NVMe-ssd在分布式存储中使用越来越广泛.由于NVM ...

  2. 七月SDNLAB一期一会网络和存储知识分享精彩回顾

    本文转载自SDNLAB 近期,Intel.SDNLAB联合推出了四期"一期一会"的分享内容,没来得及观看直播的小伙伴不用担心,小编整理了一下这几期的主要内容和视频回看,便于大家一起 ...

  3. SPDK+NVMe SSD对接Virtio支撑红包场景性能

    原文链接:http://mp.weixin.qq.com/s/nP62NpX0NAo4BZhpkAWaQg 本文转载自云栖社区,原文标题<红包场景下,高性能本地存储技术将硬件性能发挥到极致> ...

  4. 【华为云技术分享】避坑指南:关于SPDK问题分析过程

    [前言] 这是一次充满曲折与反转的问题分析,资料很少,代码很多,经验很少,概念很多,当内核态,用户态,DIF,LBA,大页内存,SGL,RDMA,NVME和SSD一起迎面而来的时候,问题是单点的意外, ...

  5. 存储IO加强型实例I1+D1 ——为极致存储性能要求场景而生

    企业客户广泛使用数据库.分布式缓存.ELK(Elasticsearch.Logstash和Kibana)日志分析和大数据等系统,对小IO随机读写IOPS和延时,以及大IO存储吞吐Throughput等 ...

  6. 边缘计算在视频直播场景的应用与实践

    9月24日,火山引擎开发者社区第九期 Meetup 圆满落幕,来自腾讯云.七牛云.火山引擎的技术专家从抖音同款 RTC 能力.直播系统架构.边缘计算服务.视频云存储等方面为大家详细介绍直播创新玩法下的 ...

  7. 在虚拟机上使用SoftRoCE部署SPDK NVMe-oF

    背景介绍 为什么我们需要在虚拟机上部署SPDK NVMe-oF呢?原因很明显:因为随着主机拥有越来越强大的内核,我们能更有效地利用内核资源:而对于NVMe-oF功能测试用例,不需要太多计算和内存资源, ...

  8. Rocksdb加SPDK改善吞吐能力建设

    01 背景说明 rocksdb是一个被广泛采用的KV系统,其功能已经逐渐演变成很多上层应用的一个基础组件,像Ceph的bluestore,nebula的点边存储,还有tikv系统,底层都是依赖rock ...

  9. SPDK RBD bdev性能调优

    前言    在前文[1]中,我们简述了SPDK中RBD bdev模块以及所依赖的librbd接口的调用方法.本文就SPDK RBD bdev结合Ceph RBD的使用进行更为深入的探讨,并结合实际的应 ...

最新文章

  1. Java调用jar包测试
  2. 详解Linux 五种IO模型
  3. 福州公交车与拖拉机相撞1人死亡
  4. javascript中Array的操作
  5. 移动页面自适应手机屏幕宽度HTML5开发
  6. 教资科目一要背的内容 0303
  7. 计算机网络的自我介绍和评价,计算机网络自我介绍范文
  8. CSDN资源分享分红2元,哈哈
  9. Java集合中List,Set以及Map等集合体系详解(史上最全)
  10. vs2008 sp1 C++ 发布程序 .
  11. Veil-Evasion安装及使用
  12. 机器学习实战(Machine Learning in Action)学习笔记————04.朴素贝叶斯分类(bayes)...
  13. 最全Python绘制饼形图(饼状图)
  14. 2022-2028全球与中国长曲棍球装备市场现状及未来发展趋势
  15. 【Web Development - AnnihilateSword】03 - Intermediate HTML
  16. ASO技巧:有效利用100个字符,aso优化技巧大aso技巧
  17. [arduino][u8g2][12864] oled—u8g2库使用说明(例子是12864液晶屏)
  18. 告别传统开店模式,借鉴餐饮理发店经营思路,谁都可以当甩手掌柜
  19. 欧姆龙 PLC CP1E 与电子称重仪表“柯力XK3101”Modbus RTU通信,稍微更改下Modbus通信地址可以跟其他Modbus设备进行通信
  20. 计算机资源管理相关试题答案,统考计算机模拟练习试题及答案操作系统应用

热门文章

  1. 约瑟夫环问题(带密码)
  2. 任意给4条边求形成四边形面积最大值
  3. 3.type关键字.rs
  4. 给网游写一个挂吧(四) – 调用游戏函数
  5. 进程间通信 - 命名管道实现
  6. 用 70 行代码给你自己写一个 strace
  7. 加入知识星球(永久免费)
  8. Java集合框架:LinkedHashMap
  9. 图解Go语言内存分配
  10. 动态规划套路:最大子数组和