SPDK介绍(一)——用户态驱动

SPDK是一个由英特尔发起的软件加速库,专注于提升NVMeSSD的I/O性能,通过用户态、异步、轮询方式的NVMe驱动减少延迟并提高IOps。由于它不支持通用的文件系统,需要使用如blobfs的简单文件系统,并且需要应用进行代码移植。SPDK适用于块设备接口的应用,如iSCSITarget、NVMe-oFTarget和数据库存储引擎。UIO和VFIO是用户态访问硬件设备的两种方式,VFIO利用IOMMU提供更安全的用户态DMA。大页技术可以提升用户态对设备读/写操作的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

存储性能软件加速库(SPDK)

SPDK由英特尔发起,用于加速NVMe SSD作为后端存储的软件加速库。这个软件库的核心是用户态、异步、轮询方式的NVMe驱动。
相比内核的NVMe驱动,SPDK可以大幅降低NVMe command的延迟,提高单CPU核的IOps。
SPDK最早全称为DPDK for storage,DPDK作为SPDK默认的环境库。

目前而言,SPDK并非一个通用的适配解决方案。把内核驱动放到用户态,导致需要在用户态实施一套基于用户态软件驱动的完整I/O栈。文件系统是其中一个重要话题,内核常见的文件系统如ext4,Btrfs不能直接使用。目前SPDK提供了简单的文件系统blobfs/blostore,但不支持可移植操作系统接口,为此使用文件系统的应用需要将其直接迁移到SPDK的用户态“文件系统”上,同时需要做一些代码移植工作,如不使用可移植操作系统接口,而采用类似AIO的异步读/写方式。

目前SPDK比较好的应用场景有以下几种

  • 提供块设备接口的后端存储应用,如iSCSI Target 、NVMe-oF Target
  • 对虚拟机中I/O的加速,主要指Linux下QEMU/KVM作为Hypervisor管理虚拟机的场景,使用vhost交互协议,实现基于共享内存通道的高效vhost用户态Target。加速主要原理是减少了VM中断等事件的数目(如interrupt、VM_EXIT),并且缩短了host OS中的I/O栈。
  • SPDK加速数据库存储引擎,通过实现RocksDB中的抽象文件类,SPDK的blobfs/blobstore目前可以和RocksDB集成,用于加速在NVMe SSD上使用RocksDB引擎。其本质是bypass(旁路)kernel文件系统,完全使用基于SPDK的用户态I/O栈。

用户态驱动

内核驱动模块在内核加载成功后,会被标识为块设备或字符设备,同时定义相关的访问接口,包括管理接口、数据接口等。这些接口直接或间接和文件系统子系统结合,提供给用户态的程序,通过系统调用的方式发起控制和读/写操作。

用户态应用程序和内核驱动的交互离不开用户态和内核态的上下文切换以及系统调用的开销。
用户态驱动的出现就是为了减少软件本身的开销,包括上下文切换以及系统调用等。在用户态,目前可以通过UIO(Userspace I/O)或VFIO(Virtual Function I/O)两种方式对硬件固态硬盘设备进行访问。

(1)UIO

在用户态实现设备驱动,主要需要解决以下两个问题

  • 如何访问设备的内存:Linux通过映射设备的内存到用户态来提供访问 即 mmap()。但这种方法会引入安全性和可靠性的问题。UIO通过限制不相关的物理设备的映射改善了问题。
  • 如何处理设备产生的中断:中断本身需要在内核处理,针对这个限制,需要一个小的内核模块通过最基本的中端服务程序来处理。这个中断服务程序可以只是向操作系统确认中断,或者关闭中断等最基础的操作,剩下的具体操作可以在用户态处理。UIO架构如图,用户态驱动和UIO内核模块通过/dev/uioX设备来实现基本交互,同时通过sysfs来得到相关设备的内存映射、内核驱动等信息。
    UIO架构

(2)VFIO

相对于UIO,VFIO更多从安全角度考虑,把设备I/O、中断、DMA暴露到用户空间,从而可以在用户空间完成设备驱动的框架。难点在于如何防止设备写内存耶来发动DMA攻击。
**IOMMU(I/O Memory Management Unit)**的引入对设备进行了限制,设备I/O地址需要经过IOMMU重映射为内存物理地址。操作系统以互斥的方式管理MMU和IOMMU,这样物理设备将不能绕过或污染可配置的内存管理表项
在这里插入图片描述

(3)用户态DMA

基于UIO和VFIO,可以实现用户态驱动,把一个硬件设备分配给一个进程,允许该进程来操作和读/写该设备,不需要通过内核驱动产生额外的内存复制,可以直接从用户态发起对设备的DMA。如图,虚线代表设备通过DMA直接访问响应的内存页,实线代表CPU访问内存页的方式。用户态和内核态DMA
这里必须考虑3个问题。

  • 提供设备可以认知的内存地址(可以是物理地址,也可以是虚拟地址)。
  • 物理内存必须在位(考虑到虚拟内存可能被操作系统交换出去,产生却页)。
  • CPU对内存的更新必须对设备可见。
    其中第1个和第3个问题通过设备直接支持IOMMU,同时和CPU之间实现缓存一致性来解决。
    第2个问题,从用户态进程来看,如何保证在DMA过程中物理内存是在位的。
    Linux主流方法是人工把虚拟地址对应的物理内存Pin在位置上(即不会被换出)。VFIO本质上是通过Pin实现的暴露DMA。

(4)大页(Hugepage)

虚拟地址映射到物理地址的主要工作是TLB(Transition Lookaside Buffers)与MMU一起完成的。虚拟地址寻址时,首先在TLB中查找,如果没有找到,则通过MMU加载的页表基地址进行多次寻表来找到对应的物理地址。如果找不到,则产生缺页,有相应的handler进行处理,填充页表和更新TLB。
通过页表查询而导致经常缺页带来的CPU开销是非常大的,TLB的出现可以很好地解决性能问题。但经常性的缺页是不可避免的,为此可以采用大页的方式。
通过Hugepage分配大页可以提高性能。因为页大小的增加,可以减少缺页异常
大页还有一个优势是预先分配的内存基本上不会被换出,当进行DMA的时候,所对应的虚拟地址永远有相对应的物理页。结合VFIO,可以显著并安全地提升用户态对设备的读/写操作效率。当然,大页也有缺点,比如它需要额外配置,需要应用程序事先预估使用多少内存,大页需要在进程启动之前实现启用和分配好内存

内容来自《Linux开源存储全栈详解 从Ceph到容器存储》p117-124

### SPDK相关的面试问题及准备材料 #### 软件定义存储与SPDK概述 SPDK(Software Defined Storage Development Kit)是个用于开发高性能数据平面应用程序的开源工具包。它通过利用现代硬件特性(如NVMe SSDs和RDMA网络),提供了高效的I/O处理能力[^1]。 以下是关于SPDK些常见面试问题及其解答: --- #### 常见面试问题及答案 1. **什么是SPDK?它的核心功能是什么?** - SPDK种软件定义存储开发套件,旨在优化基于PCIe设备的数据平面操作性能。其核心功能包括支持异步I/O模型、轮询模式驱动程序设计以及零拷贝内存管理等技术来减少CPU开销并提高吞吐量。 2. **如何初始化个简单的SPDK环境?** ```bash sudo modprobe uio_pci_generic ./scripts/setup.sh ``` 上述命令加载了通用UIO模块,并设置了必要的内核参数以便于后续运行SPDK应用实例时能够正确访问底层硬件资源。 3. **解释下SPDK中的poll mode driver (PMD)?** PMD是指种无需中断机制即可持续查询设备状态变化从而完成数据传输的方式,在这种架构下可以显著降低延迟时间因为避免了上下文中断切换带来的额外成本。 4. **谈谈你对DPDK vs SPDK的理解?** DPDK主要用于加速网络包处理而SPDK专注于提升块级存取效率;两者都采用了用户空间编程范式并通过旁路传统操作系统栈实现高效运作但是各自侧重点不同——前者偏向报文转发后者则更关注磁盘读写场景下的极致表现. 5. **描述SPDK的应用场景有哪些?** 主要应用于云服务提供商构建超大规模分布式文件系统或者对象存储解决方案当中比如Ceph RBD插件就集成了该框架以获得更好的随机小IO性能指标;另外还有数据库引擎层面上也可能引入此类库来进行定制化改造进而满足特定业务需求对于低延时高并发事务型负载尤为适用. 6. **列举几个重要的配置选项或API接口名称。** - `spdk_env_init`: 初始化整个执行环境。 - `spdk_bdev_register` : 注册个新的block device到全局列表里供其他组件发现使用。 - `spdk_poller_register`: 创建周期性回调函数用来定期触发某些逻辑流程例如健康监测统计上报等功能实现. 7. **如果遇到性能瓶颈应该怎样排查分析呢?** 可以借助perf top之类的Linux内置诊断工具观察热点函数调用链路找出潜在问题所在位置再针对性调整代码结构或是修改相关参数设置尝试缓解症状直至达到预期目标为止. 8. **请简单说明下SPDK中reactor的作用原理。** Reactors负责监听来自各个channel上的事件请求并将它们分发给对应的handler去实际处理具体任务每个core上都会启动独立线程作为单独worker instance相互之间不存在锁竞争关系因此具备良好的扩展性和可维护性特点. 9. **分享次你在项目实践中运用SPDK解决实际难题的经历吧!** 这类开放性题目可以根据个人经历灵活作答关键是突出自己对该领域知识掌握程度的同时展现出解决问题的能力水平比如说曾经针对某款新型SSD产品适配过程中发现了原生驱动存在兼容性缺陷于是深入研究内部源码最终成功修复漏洞贡献给了社区等等案例均能有效加分. --- #### 数据平面开发套件面试技巧 - 提前熟悉官方文档资料尤其是最新版本release notes部分往往包含了重要改动亮点介绍有助于快速把握趋势方向; - 多参与GitHub Issues讨论区互动不仅可以积累实战经验还能结识志同道合的朋友形成良好人脉圈; - 定期跟踪业界动态保持敏感度及时更新自己的技能树确保始终站在前沿阵地之上迎接挑战。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值