daos 对 spdk 的使用

本文详细介绍了SPDK(存储性能开发工具包)的原理,包括用户空间驱动程序、中断处理、线程管理和DMA。此外,还讨论了SPDK如何利用DPDK进行内存管理,以及DAOS如何使用SPDK接口进行块设备访问和操作,如格式化、发现和更新。文章深入浅出地阐述了SPDK和DAOS在高性能存储系统中的关键作用。
摘要由CSDN通过智能技术生成

第一章 简介

什么是SPDK

存储性能开发工具包(SPDK)提供了一组工具和库,用于编写高性能,可伸缩的用户模式存储应用程序。它通过使用一些关键技术实现了高性能:

  • 将所有必需的驱动程序移动到用户空间,这样可以避免系统调用并启用应用程序的零拷贝访问。

  • 轮询硬件用于完成而不是依赖中断,这降低了总延迟和延迟差异。

  • 避免I / O路径中的所有锁,而是依赖于消息传递

第二章 概念

用户空间的驱动程序

通常,驱动程序在内核空间中运行。SPDK包含的驱动程序设计为在用户空间中运行,但它们仍然直接与它们控制的硬件设备连接。

为了让SPDK控制设备,它必须首先指示操作系统放弃控制。这通常被称为解除设备内核驱动程序的绑定,而Linux则通过写入sysfs中的文件来完成。然后,SPDK将驱动程序重新绑定到与Linux捆绑的两个特殊设备驱动程序之一 - uiovfio这两个驱动程序是“虚拟”驱动程序,因为它们主要向操作系统指示设备有绑定的驱动程序,因此它不会自动尝试重新绑定默认驱动程序。它们实际上并没有以任何方式初始化硬件,也不了解它是什么类型的设备。

中断

SPDK轮询设备以进行完成,而不是等待中断。

  1. 实际上,在用户空间进程中将中断路由到处理程序对于大多数硬件设计来说是不可行的

  2. 中断引入软件抖动并且由于强制上下文而具有显着的开销开关。SPDK中的操作几乎是普遍异步的,允许用户在完成时提供回调。

线程

nvme 设备暴露了多个队列用来向硬件提交请求,可以不需要调度而单独访问队列。因此软件可以从多个并行线程向设备发送请求而无需锁。但是内核驱动程序的设计必须为处理来自系统上不同进程的I/O,并且这些进程的线程会随时间变化。大多数内核驱动程序选择将硬件队列映射到CPU的cores,然后在提交请求时,它们会查找当前线程正在运行的核心的正确硬件队列,通常,他们会需要获取队列周围的锁或临时禁用中断以防止在同一核上运行的线程抢占,这个开销可能很大。

SPDK驱动程序选择将硬件队列直接暴露给应用程序,并要求一次只能从一个线程访问硬件队列。实际上,应用程序为每个线程分配一个硬件队列(而不是内核驱动程序中每个核心一个硬件队列)。这保证了线程可以提交请求,而不必与系统中的其他线程执行任何类型的协调(即锁定)。

来自用户空间的DMA

NVMe设备使用直接内存访问(DMA),将数据传输到系统内存,或从系统内存传输数据。

直接内存访问(DMA)方式是一种完全由硬件执行I/O交换的工作方式。DMA控制器从CPU完全接管对总线的控制。数据交换不经过CPU,而直接在内存和I/O设备之间进行。DMA控制器采用以下三种方式:

  1. 停止CPU访问内存:当外设要求传送一批数据时,由DMA控制器发一个信号给CPU。DMA控制器获得总线控制权后,开始进行数据传送。一批数据传送完毕后,DMA控制器通知CPU可以使用内存,并把总线控制权交还给CPU。

  2. 周期挪用:当I/O设备没有 DMA请求时,CPU按程序要求访问内存:一旦 I/O设备有DMA请求,则I/O设备挪用一个或几个周期。

  3. DMA与CPU交替访内:一个CPU周期可分为2个周期,一个专供DMA控制器访内,另一个专供CPU访内。不需要总线使用权的申请、建立和归还过程。

SPDK依靠DPDK来分配固定内存

以便知道物理地址

IOMMU支持

许多平台包含一个称为I / O内存管理单元(IOMMU)的额外硬件。IOMMU很像常规MMU,除了它为外围设备(即PCI总线)提供虚拟化地址空间。MMU了解系统上每个进程的虚拟到物理映射,因此IOMMU将特定设备与这些映射之一相关联,然后允许用户分配任意总线地址到他们的过程中的虚拟地址。然后,通过将总线地址转换为虚拟地址,然后将虚拟地址转换为物理地址。

消息传递和并发

SPDK的主要目标之一是通过添加硬件进行线性扩展。这可能意味着实践中的许多事情。例如,从一个SSD移动到两个SSD应该是每秒I / O数量的两倍。或者将CPU核心数量增加一倍应该可以使计算量增加一倍。或者甚至将NIC数量加倍也应该使网络吞吐量翻倍。为实现此目的,必须设计软件使得执行线程尽可能彼此独立。在实践中,这意味着避免软件锁甚至原子指令。

传统上,软件通过将一些共享数据放到堆上,用锁保护它,然后让所有执行线程仅在需要访问共享数据时获得锁来实现并发。这个模型有很多很棒的属性:

  • 将单线程程序转换为多线程程序相对容易,因为您不必从单线程版本更改数据模型。您只需在数据周围添加锁定即可。

  • 您可以将程序编写为从上到下阅读的同步,命令性语句列表。

  • 您的线程可以在后台由操作系统调度程序中断并进入休眠状态,从而实现CPU资源的高效时间共享。

不幸的是,随着线程数量的增加,对共享数据周围锁定的争用也会发生。更细粒度的锁定有所帮助,但也大大增加了程序的复杂性。即使这样,超过一定数量的高度争用的锁,线程将花费大部分时间来尝试获取锁,并且程序将不会受益于任何额外的CPU核。

消息传递

SPDK完全采用不同的方法。SPDK通常会将该数据分配给单个线程,而不是将共享数据放在所有线程获取锁定后访问的全

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值