学习spdk

这篇具有很好参考价值的文章主要介绍了学习spdk。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

学习SPDK,可以按照以下步骤进行:

  1. 了解SPDK的基本概念和原理,包括SPDK的优势、设计思路、应用场景等。
  2. 学习SPDK的编程模型和API,了解SPDK的核心组件和应用接口,熟悉SPDK的编程规范和使用方法。
  3. 进行SPDK的实践和应用,可以通过编写简单的SPDK应用程序来熟悉SPDK的使用,也可以参与SPDK社区的开源项目,了解SPDK的实现细节和技术难点。
  4. 参与SPDK社区的交流和讨论,可以通过SPDK的邮件列表、论坛、社交媒体等渠道,与SPDK的开发者和用户进行交流和分享,了解SPDK的最新发展和应用案例。

总之,学习SPDK需要有一定的编程经验和相关知识,需要不断地实践和探索,也需要积极参与社区的开发和交流。

SPDK的优势

  • 零拷贝:SPDK可以避免数据从用户空间到内核空间的复制,直接在用户空间操作I/O数据,提高I/O操作效率。
  • 高性能:SPDK使用异步I/O操作和多线程技术,充分利用多核CPU的性能,提高I/O操作的吞吐量和响应速度。
  • 可扩展性:SPDK支持多种硬件加速技术,如RDMA、NVMe等,可以在不同的硬件平台上实现高性能的存储服务。
  • 开源:SPDK是一个开源项目,可以自由获取、使用和修改,有广泛的社区支持和应用案例。

SPDK的设计思路

  • 用户空间I/O:SPDK将I/O操作从内核空间转移到用户空间,避免了复杂的内核调度和同步机制,提高了I/O操作的效率。
  • 异步I/O:SPDK使用异步I/O操作,可以在I/O操作等待时执行其他任务,提高了系统的并发性和响应速度。
  • 多线程:SPDK采用多线程技术,充分利用多核CPU的性能,提高I/O操作的吞吐量和响应速度。
  • 零拷贝:SPDK可以避免数据从用户空间到内核空间的复制,直接在用户空间操作I/O数据,提高I/O操作效率。

SPDK的应用场景

  • 存储系统:SPDK可以支持高性能的存储系统,如块存储、文件存储、对象存储等。
  • 数据库系统:SPDK可以支持高性能的数据库系统,如NoSQL数据库、分布式数据库等。
  • 数据分析系统:SPDK可以支持高性能的数据分析系统,如Hadoop、Spark等。
  • 云计算平台:SPDK可以支持高性能的云计算平台,如OpenStack、Kubernetes等。

SPDK的编程模型和API

SPDK的编程模型基于异步I/O和事件驱动,开发者需要使用SPDK提供的异步I/O API来执行I/O操作,使用事件驱动机制来处理I/O完成事件。SPDK提供了一系列异步I/O API,包括I/O通道、I/O缓冲区、I/O队列、I/O完成事件等。开发者需要使用这些API来构建自己的存储服务或应用程序。

SPDK的核心组件和应用接口

SPDK的核心组件包括了多个模块,包括块设备模块、NVMe设备模块、事件模块、异步I/O模块、内存模块、日志模块等。SPDK还提供了多个应用接口,包括初始化接口、块设备接口、NVMe设备接口、I/O通道接口、I/O队列接口、异步I/O接口等。开发者可以使用这些接口来构建自己的存储服务或应用程序。

SPDK的编程规范和使用方法

为了保证代码质量和可维护性,SPDK社区制定了一系列编程规范和使用方法,包括代码风格、注释规范、函数命名规范、错误处理规范、内存管理规范等。开发者需要遵循这些规范和方法来进行开发工作,以便其他开发者或社区成员能够更好地理解和维护代码。
此外,为了让开发者更容易上手SPDK的开发工作,SPDK还提供了完整的文档和教程,包括API文档、用户指南、示例代码、视频教程等。开发者可以根据自己的需求选择合适的文档和教程来进行学习和实践。
以下是一些SPDK相关的详细链接,供参考:

SPDK官网:https://spdk.io/
SPDK GitHub仓库:https://github.com/spdk/spdk
SPDK文档中心:https://spdk.io/doc/
SPDK社区邮件列表:https://lists.01.org/mailman/listinfo/spdk
SPDK社区论坛:https://forum.spdk.io/
SPDK社区Slack频道:https://spdk.slack.com/archives/C029VC7M8GP
SPDK社区YouTube频道:https://www.youtube.com/channel/UCbX9lJfY6b2cKQyj6hBgySw
SPDK社区Twitter账号:https://twitter.com/SPDK_IO
Intel官方SPDK介绍视频:https://www.youtube.com/watch?v=L2_6NnYrKbY&t=11s
SPDK学习视频教程(中文):https://www.bilibili.com/video/BV1p54y1v7zT
SPDK最佳实践视频教程(英文):https://www.youtube.com/watch?v=Zv3qP-qo5A0&t=1s
SPDK NVMe-oF视频教程(英文):https://www.youtube.com/watch?v=7VU4pNl8GvU
SPDK在云计算中的应用视频教程(英文):https://www.youtube.com/watch?v=3xLZzCJH9yk&t=1s

spdk关于nvme模块的helloword实例代码

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>
#include <pthread.h>
#include <fcntl.h>
#include <inttypes.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <rte_config.h>
#include <rte_eal.h>
#include <rte_pci.h>
#include <rte_bus_pci.h>
#include <rte_memory.h>
#include <spdk/nvme.h>
static bool g_shutdown = false;
static void sig_handler(int signum)
{
    if (signum == SIGINT || signum == SIGTERM) {
        g_shutdown = true;
    }
}
int main(int argc, char **argv)
{
    struct spdk_nvme_ctrlr *ctrlr;
    struct spdk_nvme_ns *ns;
    struct spdk_nvme_qpair *qpair;
    struct spdk_nvme_ctrlr_opts opts;
    struct spdk_pci_addr pci_addr;
    uint32_t nsid;
    int rc;
    signal(SIGINT, sig_handler);
    signal(SIGTERM, sig_handler);
    rc = rte_eal_init(argc, argv);
    if (rc < 0) {
        fprintf(stderr, "Failed to initialize EAL\n");
        return -1;
    }
    memset(&opts, 0, sizeof(opts));
    opts.num_io_queues = 4;
    ctrlr = spdk_nvme_connect(NULL, &opts, sizeof(opts));
    if (ctrlr == NULL) {
        fprintf(stderr, "Failed to connect to NVMe controller\n");
        return -1;
    }
    pci_addr = spdk_nvme_ctrlr_get_pci_controller(ctrlr)->addr;
    printf("Connected to NVMe controller at %!!(MISSING)x(MISSING):%!!(MISSING)x(MISSING):%!!(MISSING)x(MISSING).%!!(MISSING)x(MISSING)\n",
           pci_addr.domain, pci_addr.bus, pci_addr.devid, pci_addr.function);
    nsid = spdk_nvme_ctrlr_get_first_active_ns(ctrlr);
    if (nsid == 0xffffffff) {
        fprintf(stderr, "No active namespace found\n");
        spdk_nvme_detach(ctrlr);
        return -1;
    }
    ns = spdk_nvme_ctrlr_get_ns(ctrlr, nsid);
    if (ns == NULL) {
        fprintf(stderr, "Failed to get namespace %!!(MISSING)u(MISSING)\n", nsid);
        spdk_nvme_detach(ctrlr);
        return -1;
    }
    printf("Connected to NVMe namespace %!!(MISSING)u(MISSING)\n", nsid);
    qpair = spdk_nvme_ctrlr_alloc_io_qpair(ctrlr, NULL, 0);
    if (qpair == NULL) {
        fprintf(stderr, "Failed to allocate I/O queue pair\n");
        spdk_nvme_ns_detach(ns);
        spdk_nvme_detach(ctrlr);
        return -1;
    }
    while (!g_shutdown) {
        printf("Hello, World!\n");
        sleep(1);
    }
    spdk_nvme_ctrlr_free_io_qpair(qpair);
    spdk_nvme_ns_detach(ns);
    spdk_nvme_detach(ctrlr);
    return 0;
}

此示例程序将连接到系统中的第一个NVMe控制器,打开其第一个活动命名空间,并分配一个I/O队列对。然后在循环中打印“Hello, World!”,直到接收到SIGINT或SIGTERM信号时退出程序。

详细讲解

首先,在main函数中,我们进行了一些初始化操作。首先,使用rte_eal_init函数对EAL(Environment Abstraction Layer)进行初始化,这是DPDK(Data Plane Development Kit)的一部分,用于抽象出底层平台的特定性,使得DPDK可以在不同的平台上运行。初始化后,我们使用memset函数将opts(struct spdk_nvme_ctrlr_opts结构体类型)的所有成员都初始化为0。然后,我们使用spdk_nvme_connect函数连接到系统中的第一个NVMe控制器,这个函数的第一个参数为NULL,表示使用默认的选项进行连接;第二个参数为opts,表示我们使用之前初始化的opts结构体作为选项;第三个参数是opts的大小。如果连接失败,我们会输出错误信息并直接退出程序。

    struct spdk_nvme_ctrlr *ctrlr;
    struct spdk_nvme_ns *ns;
    struct spdk_nvme_qpair *qpair;
    struct spdk_nvme_ctrlr_opts opts;
    struct spdk_pci_addr pci_addr;
    uint32_t nsid;
    int rc;
    signal(SIGINT, sig_handler);
    signal(SIGTERM, sig_handler);
    rc = rte_eal_init(argc, argv);
    if (rc < 0) {
        fprintf(stderr, "Failed to initialize EAL\n");
        return -1;
    }
    memset(&opts, 0, sizeof(opts));
    opts.num_io_queues = 4;
    ctrlr = spdk_nvme_connect(NULL, &opts, sizeof(opts));
    if (ctrlr == NULL) {
        fprintf(stderr, "Failed to connect to NVMe controller\n");
        return -1;
    }

接下来,我们获取连接上的NVMe控制器的PCI地址,并将其打印出来。

    pci_addr = spdk_nvme_ctrlr_get_pci_controller(ctrlr)->addr;
    printf("Connected to NVMe controller at %!!(MISSING)!(MISSING)x(MISSING):%!!(MISSING)!(MISSING)x(MISSING):%!!(MISSING)!(MISSING)x(MISSING).%!!(MISSING)!(MISSING)x(MISSING)\n",
           pci_addr.domain, pci_addr.bus, pci_addr.devid, pci_addr.function);

然后,我们打开第一个活动的命名空间(namespace)。

    nsid = spdk_nvme_ctrlr_get_first_active_ns(ctrlr);
    if (nsid == 0xffffffff) {
        fprintf(stderr, "No active namespace found\n");
        spdk_nvme_detach(ctrlr);
        return -1;
    }
    ns = spdk_nvme_ctrlr_get_ns(ctrlr, nsid);
    if (ns == NULL) {
        fprintf(stderr, "Failed to get namespace %!!(MISSING)!(MISSING)u(MISSING)\n", nsid);
        spdk_nvme_detach(ctrlr);
        return -1;
    }
    printf("Connected to NVMe namespace %!!(MISSING)!(MISSING)u(MISSING)\n", nsid);

最后,我们分配一个I/O队列对,并在循环中打印“Hello, World!”,直到接收到SIGINT或SIGTERM信号时退出程序。需要注意的是,这里我们使用了spdk_nvme_ctrlr_alloc_io_qpair函数来分配I/O队列对,而不是使用spdk_nvme_ctrlr_get_default_io_qpair函数,是因为前者可以为I/O队列对设置一些选项,而后者则不能。

    qpair = spdk_nvme_ctrlr_alloc_io_qpair(ctrlr, NULL, 0);
    if (qpair == NULL) {
        fprintf(stderr, "Failed to allocate I/O queue pair\n");
        spdk_nvme_ns_detach(ns);
        spdk_nvme_detach(ctrlr);
        return -1;
    }
    while (!g_shutdown) {
        printf("Hello, World!\n");
        sleep(1);
    }
    spdk_nvme_ctrlr_free_io_qpair(qpair);
    spdk_nvme_ns_detach(ns);
    spdk_nvme_detach(ctrlr);

当程序退出时,我们需要使用spdk_nvme_ctrlr_free_io_qpair函数释放I/O队列对,然后分别使用spdk_nvme_ns_detach和spdk_nvme_detach函数分离命名空间和控制器。

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习文章来源地址https://www.toymoban.com/news/detail-765651.html

到了这里,关于学习spdk的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • jsp 网络社区便利店系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

    一、源码特点      JSP 网络社区便利店系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0,使用java语言开发。 jsp 网络社区便利店系统M

    2024年02月12日
    浏览(51)
  • 鹏云网络分布式块存储社区版问世,首发开源存储解决方案

          2023年1月,南京鹏云网络科技有限公司(简称:鹏云网络)正式宣布开源ZettaStor DBS分布式块存储系统,开放了自研10余年的分布式块存储技术,自此踏上了“自研”与“开源”一体并行的生态闭环之路。 研发十年,挑战块存技术上限       成本、效率、高可用,一直

    2024年02月11日
    浏览(39)
  • linux存储技术学习资料

    https://www.cnblogs.com/pengdonglin137/p/16525428.html Linux内核的I/O栈大图 知乎Linux I/O专栏1 Linux 块设备之Block Layer层架构演变 Linux VFS机制简析(一) Linux VFS机制简析(二) Linux Kernel文件系统写I/O流程代码分析(一) Linux Kernel文件系统写I/O流程代码分析(二)bdi_writeback linux问题调查工具

    2024年02月06日
    浏览(73)
  • Kafka 社区KIP-405中文译文(分层存储)

    原文链接: https://cwiki.apache.org/confluence/display/KAFKA/KIP-405%3A+Kafka+Tiered+Storage 译者:Kafka KIP-405是一篇非常优秀的多层存储的设计稿,不过此设计稿涉及内容很多,文章量大、严谨、知识点诸多。我们国内还没有对其有相对完整的译文,面对如此上乘的文章,译者想降低其门槛,

    2024年01月19日
    浏览(40)
  • 计算机毕设之基于数据可视化的智慧社区内网平台python+django+mysql(含开题+源码+部署教程)

    系统阐述的是一款基于数据可视化的智慧社区内网平台的设计与实现,对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计,描述,实现和分析与测试方面来表明开发的过程。开发中使用了 django框架和MySql数据库技术搭建系统的整体架构。利用这些技

    2024年02月10日
    浏览(52)
  • 《深入理解计算机系统(CSAPP)》第6章 存储器层次结构 - 学习笔记

    写在前面的话:此系列文章为笔者学习CSAPP时的个人笔记,分享出来与大家学习交流,目录大体与《深入理解计算机系统》书本一致。因是初次预习时写的笔记,在复习回看时发现部分内容存在一些小问题,因时间紧张来不及再次整理总结,希望读者理解。 《深入理解计算机

    2024年02月06日
    浏览(49)
  • 数据在计算机中的存储——【C语言】

    在前面的博客中,我们已经学习了C语言的数据类型,先让我们回顾一下C语言中有哪些数据类型。 目录 C语言的基本内置类型 类型的基本归类 整型在内存中的存储 原码、反码、补码 存储中的大小端 练习   浮点型在内存中的存储  浮点数的存储规则 对引例问题的深度分析

    2024年02月13日
    浏览(37)
  • 深入学习 Linux 操作系统的存储 IO 堆栈

    当使用 read() 和 write() 系统调用向内核提交读写 I/O 请求操作时需要经历的步骤: 1)首先,请求经过虚拟文件系统,虚拟文件系统提供了统一的文件和文件系统的相关接口,屏蔽了不同文件系统的差异和操作细节; 2)其次,适配当前磁盘分区的文件系统,常见文件系统有

    2024年02月08日
    浏览(39)
  • 云计算:从基础架构原理到最佳实践之:云计算大数据处理与存储

    作者:禅与计算机程序设计艺术 云计算(Cloud Computing)是一种新的计算模型、服务方式、资源体系结构和应用策略,它将计算、存储和网络服务从中心机房扩展至“无限”的分布式地点,通过对计算机集群进行动态分配资源的方式提高资源利用率和可靠性。其核心特征包括按

    2024年02月07日
    浏览(44)
  • 云上攻防--云服务&&对象存储(域名接管)&&弹性计算(元数据泄露)

    各个厂商对于对象存储的叫法不同,但是除了叫法基本没有其他区别。 对象存储各大云名词: 阿里云:OSS 腾讯云:COS 华为云:OBS 谷歌云:GCS 微软云:Blob 亚马逊云:S3 对于对象存储的漏洞或者说错误配置点如下 权限Bucket授权策略:设置ListObject显示完整结构(类似于目录遍

    2024年02月04日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包