SPDK发布v21.01版本

新春快乐 牛年大吉

近期,SPDK团队正式发布了21.01版本,一起来看看都有哪些新功能吧!(温馨提示:由于英文函数名较长,为了获得更佳的阅读体验,手机上建议横屏阅读~)

新功能

- 动态调度程序:SPDK轻量级线程现在可以动态地调度到SPDK事件框架中的reactor上。调度程序会重新平衡空闲线程,调整CPU频率,并将空闲的reactor切换到中断模式。有关详细信息,请参见https://www.spdk.io/doc/scheduler.html。此功能目前是实验性的。

- vfio-user用户 NVMe-oF 传输类型:添加了对新vfio-user 用户NVMe-oF传输类型的支持,模拟NVMe设备通过共享内存到虚拟机或单独进程的传输。此功能目前是实验性的。

-vfio-user 用户NVMe传输类型:添加了对vfio-user 用户NVMe传输类型的支持,允许直接从进程连接到模拟的NVMe设备。此功能目前是实验性的。

- NVMe ZNS Zone Append: 添加了对Zoned Namespace Command Set 中 Zone Append 命令的支持。

- pkg-config: SPDK 现在可以生成 pkg-config 文件,从而简化了确定哪些库必须链接到 SPDK 应用程序的过程。详情参见 https://spdk.io/doc/pkgconfig.html

- DPDK: 添加了DPDK 20.11的支持。

从20.01 LTS版本进行更新的用户请注意,旧配置(.ini)文件已删除,现在支持JSON-RPC。有关新配置机制的信息,请参见

https://spdk.io/doc/jsonrpc.html#jsonrpc_convert

查看完整版本,请访问以下链接:

https://github.com/spdk/spdk/releases/tag/v21.01 

特别感谢

本次版本包含来自45位作者的587次提交,其中包含超过31,000行代码更改。我们尤其要感谢在v21.01版本中第一次提交代码的社区贡献者:

               David Marchand

               Feilong Lin

               Guo Zhihong

               Jiewei Ke

               Madhu Adav MJ

               Mao Jiang

               Michael Bang

               Naresh Gottumukkala

               Nick Connolly

               Roman Penyaev

               Rui Chang

               ShadowMov

               Shihao Sun

               Weifeng Su

               Zhiqiang Liu

SPDK开源社区

    衷心感谢大家的参与和贡献!

详细的发布说明如下

bdev

  • 在spdk_bdev_opts结构中添加了opts_size元素,以解决不同SPDK版本之间的ABI兼容性问题。在spdk_bdev_get_opts函数中添加了opts_size参数。在spdk_bdev_opts中添加了两个字段small_buf_pool_size和large_buf_pool_size,用于确定整个bdev模块的缓冲池大小。

  • 添加了新的API spdk_bdev_wait_for_examine,允许查看examine检查过程的状态。连同相应的bdev_wait_for_examine RPC,始终在spdk_bdev_subsystem_config_json期间被调用,确保每个bdev准备就绪。

  • 添加了新的API spdk_bdev_io_get_aio_status,以获取bdev_io作为Linux AIO errno的状态。还为bdev模块添加了spdk_bdev_io_complete_aio_status 函数和SPDK_BDEV_IO_STATUS_AIO_ERROR ,完成带有Linux AIO errno的bdev_io。

  • 添加了新的API spdk_bdev_get_module_name以获取块设备模块名称。此外,还添加了spdk_bdev_get_module_ctx,获取由指定描述符打开的块设备的bdev模块上下文。

  • 为bdev模块的spdk_bdev结构添加了max_segment_size和max_num_segments,以指定拆分需求。

blob

  • 在spdk_bs_opts结构中添加了opts_size元素,以解决不同SPDK版本之间的ABI兼容性问题。在spdk_bs_opts_init函数中添加了opts_size参数。

  • 在spdk_blob_opts结构中添加了opts_size元素,以解决不同SPDK版本之间的ABI兼容性问题。并在spdk_blob_opts_init函数中添加opts_size参数。

  • 在spdk_blob_open_opts结构中添加了opts_size元素,以解决不同SPDK版本之间的ABI兼容性问题。在spdk_blob_open_opts_init函数中添加了opts_size参数。

build

  • SPDK 现在可以生成 pkg-config 文件,从而简化了确定哪些库必须链接到 SPDK 应用程序的过程。

dpdk

  • 将DPDK子模块更新为DPDK 20.11。

  • 删除了--with-igb-uio-driver配置选项。自DPDK 20.11以来,igb_uio驱动程序已移至单独的dpdk-kmods存储库。如有需要,用户可以参考dpdk-kmods存储库来构建驱动程序。

env

  • spdk_env_opts 结构的 pci_whitelist、pci_blacklist 和 master_core 已被弃用。新成员分别命名为 pci_allowed、pci_blocked 和 main_core。

  • 在spdk_app_opts结构中添加了opts_size元素,以解决不同SPDK版本之间的ABI兼容性问题。在spdk_app_opts_init函数中添加了opts_size参数。

event

  • spdk_app_opts 结构中的 pci_whitelist 和 pci_blacklist 已被弃用。新成员的分别是 pci_allowed 和 pci_blocked。

  • 命令行选项--pci-blacklist已被弃用,由--pci-blocked代替。

  • 命令行选项--pci-whitelist / -W已被弃用,由--pci-allowed / -A代替。

  • 添加了新的实验性动态调度程序,该程序可以重新平衡空闲线程,用dpdk_governor调整CPU频率,并将空闲的reactor内核转换为中断模式。有关详细信息,请参见调度程序文档(https://www.spdk.io/doc/scheduler.html)。

ioat

  • PCI BDF白名单选项已从ioat_scan_accel_engine RPC中删除。使用SPDK应用程序命令行选项,仍然可以允许或拒绝IOAT PCI功能。

isa-l

  • 将ISA-L子模块更新为v2.30.0。

json

  • 添加了 API spdk_jsonrpc_send_bool_response,允许将 json bool 结果写入函数中发送响应。

  • 更新了 API bdev_nvme_set_options 并添加了 keep_alive_timeout_ms 参数。现在你可以在建立 NVMe bdev 之前指定keep_alive_timeout。

nbd

  • 将函数spdk_nbd_stop的返回类型从void改为int。用两个参数更新了spdk_nbd_fini,使其行为从同步变为异步。

nvme

  • 在NVMe驱动中添加了指令支持。

  • 添加了两个异步API spdk_nvme_ctrlr_cmd_directive_receive和spdk_nvme_ctrlr_cmd_directive_send,分别用于指令发送和指令接收命令。

  • 添加了新函数spdk_nvme_ctrlr_reset_subsystem以执行NVMe子系统重置。注意:NVMe-oF target尚不支持子系统复位。

  • 添加了新函数spdk_nvme_bytes_to_numd将字节传输到多个dwords。

  • 添加了新的自定义传输SPDK_NVME_TRANSPORT_VFIOUSER,使NVMe驱动能够通过vfio-user target连接NVMe。

  • 在NVMe驱动中添加了vfio-user自定义传输的实现,由vfio-user传输通过vfio-user target连接NVMe。

  • 添加了新函数spdk_nvme_ctrlr_set_remove_cb来删除或覆盖在controller探测时指定的remove_cb和remove_ctx。

  • 通过新的API spdk_nvme_zns_zone_append和spdk_nvme_zns_zone_append_with_md,添加了对ZNS zone append命令的支持。

nvmf

  • nvmf_fc_lld_fini现在接受回调,因此需要将FC Broadcom LLD驱动程序更新为最新版本。

  • FC传输支持primary tagging和VMID。

  • Broadcom FC LLD驱动程序和SPDK NVMe-oF FC将LLD API nvmf_fc_init_poller_queues整合到另一个LLD API nvmf_fc_init_q中。因此,需要将Broadcom FC LLD驱动程序更新为最新版本。

  • 传输接口中的destroy和qpair_fini函数现在接受cb_fn和cb_arg在完成时进行调用,它们的执行可以是异步的。

  • SPDK NVMe-oF target现在支持用于发现日志更改的异步事件通知。这允许启动程序创建与discovery controller的持久连接,并接收日志更改的通知。

  • 在spdk_nvmf_transport_opts结构中添加了opts_size元素,以解决不同SPDK版本之间的ABI兼容性问题。并在spdk_nvmf_transport_opts_init函数中添加opts_size参数。

  • 在NVMe-oF中添加了新的自定义vfio-user用户传输类型实现,可以将模拟的NVMe设备提供给QEMU和SPDK NVMe驱动程序。

  • 添加了新的 API spdk_nvmf_tgt_listen_ext,用 spdk_nvmf_listen_opts 将通用选项传递给特定的传输,取代了nvmf_subsystem_set_options 提供的功能,同时删除了在子系统中使用特定传输选项的 nvmf_subsystem_set_options RPC。

  • nvmf_subsystem_add_listener RPC 中的 trsvcid 现在是可选的。

  • 目前,暂停子系统只会暂停所有管理队列。无须完全暂停子系统,即可管理主机和监听器,以及添加命名空间。此外,target现在允许暂停子系统内的单个命名空间。要从子系统中删除一个命名空间,只须暂停特定的命名空间。在执行这些操作时,其他命名空间的 I/O 将继续进行。

rpc

  • RPC iscsi_create_portal_group添加了新的可选参数wait,并添加了一个新的RPC iscsi_start_portal_group。在启动时创建所有关联的目标节点之前,它们不会监听门户网站组的门户网站。否则在SPDK iSCSI目标应用程序重启时,某些iSCSI启动器可能无法重新登录。

  • bdev_set_options函数中添加了两个可选参数--small-buf-pool-size和--large-buf-pool-size。

vhost

  • 在vhost_create_blk_controller RPC中添加了可选的packed_ring_recovery参数,同时支持在线恢复功能以启用压缩ring实时恢复。

转载须知

DPDK与SPDK开源社区公众号文章转载声明

推荐阅读

SPDK发布v20.10版本

点击“阅读原文”,查看21.01 release原文

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SPDK(存储性能开发套件)官方文档中文版。 第一章 简介 1 1.1.什么是SPDK? 1 1.2.入门 1 1.3. Vagrant开发环境 3 1.4.更新日志(略) 6 第二章 概念 6 2.1. 用户空间驱动程序** 6 2.2. 来自用户空间的DMA** 7 2.3. 消息传递和并发** 9 2.4. NAND Flash SSD内部 13 2.5. 将I / O提交到NVMe设备** 15 2.5.1 NVMe规范 15 2.5.2 SPDK NVMe驱动程序I / O路径 15 2.6. 使用Vhost-user进行虚拟化I / O. 16 2.6.1 介绍 16 2.6.2 QEMU 17 2.6.3 设备初始化 18 2.6.4 I / O路径 19 2.6.5 SPDK优化 20 2.7. SPDK目录结构概述 20 2.8. SPDK移植指南 22 第三章 用户指南 22 3.1. 系统配置用户指南 22 3.1.1 IOMMU配置 22 3.2. SPDK应用程序概述 23 3.2.1 配置SPDK应用程序 23 3.3. iSCSI Target 26 3.3.1. iSCSI Target入门指南 26 3.3.2. 通过配置文件配置iSCSI Target 27 3.3.3. 通过RPC方法配置iSCSI Target 28 3.3.4. 配置iSCSI启动器 29 3.3.5. rpc配置示例*** 30 3.3.6. iSCSI 热插拔 32 3.4. NVMe over Fabrics Target 32 3.5. Vhost Target(略) 37 3.6 块设备用户指南 38 3.6.1 bdev介绍 38 3.6.2 通用RPC命令 38 3.6.3 Ceph RBD 39 3.6.4 压缩虚拟Bdev模块 40 3.6.5 加密虚拟Bdev模块 41 3.6.6 延迟vbdev模块 41 3.6.7 GPT(GUID分区表) 42 3.6.8 iSCSI bdev 43 3.6.9 Linux AIO bdev 43 3.6.10 OCF虚拟bdev 43 3.6.11 Malloc bdev 44 3.6.12 NULL bdev 44 3.6.13 NVMe bdev 44 3.6.14 逻辑卷Lvol 45 3.6.15 RAID 46 3.6.16 Passthru 46 3.6.17 Pmem 46 3.6.18 Virtio Block 47 3.6.19 Virtio SCSI 47 3.7 BlobFS(Blobstore文件系统) 48 3.7.1 RocksDB集成 48 3.7.2 FUSE插件 49 3.8 JSON-RPC方法(略) 49 第四章 程序员指南 49 4.1. Blobstore程序员指南 49 4.1.1 介绍 50 4.1.2 运作理论 50 4.1.3 设计注意事项 52 4.1.4 例子 54 4.1.5配置 54 4.1.6 组件细节 54 4.2. 块设备层编程指南 56 4.3 编写自定义块设备模块 58 4.3.1 介绍 58 4.3.2 创建一个新模块 59 4.3.3创建虚拟Bdev 60 4.4 NVMe over Fabrics目标编程指南 61 4.4.1 介绍 61 4.4.2 原语结构体 61 4.4.3 基础函数 62 4.4.4访问控制 62 4.4.5发现子系统 62 4.4.6 传输 63 4.4.7选择线程模型 63 4.4.8 跨CPU核心扩展 63 4.4.9 零拷贝支持 63 4.4.10 RDMA 63 4.5 Flash传输层 64 4.5.1 术语 64 4.5.2 使用方法 67 4.6 GDB宏用户指南 69 4.6.1 介绍 69 4.6.2 加载gdb宏 71 4.6.3 使用gdb数据目录 72 4.6.4 使用.gdbinit加载宏 72 4.6.5 为什么我们需要显式调用spdk_load_macros 72 4.6.6 以上可用的宏总结 73 4.6.7 添加新宏 73 4.7 SPDK “Reduce”块压缩算法 73 4.7.1 介绍 73 4.7.2 例子 74 4.8 通知库 78 第五章 基本信息 79 5.1 事件框架 79 5.1.1 事件框架设计注意事项 80 5.1.2 SPDK事件框架组件 80 5.1.3 应用框架 80 5.2 逻辑卷 81 5.2.1 术语 81 5.2.2 配置逻辑卷 84 5.3 矢量数据包处理(略) 86 第六章 杂项 86 6.1 介绍 86 6.2 NVMe的P2P API 86 6.3 确定设备支持 87 6.4 P2P问题 87 第七章 驱动程序 88 7.1 NVMe驱动程序*** 88 7.1.1 介绍 88 7.1.2 例子 88 7.1.3 公共接口 89 7.1.4 NVMe驱动程序设计 89 7.1.5 NVMe over Fabrics主机支持 91 7.1.6 NVMe多进程 91 7.1.7 NVMe Hotplug 92 7.2 I/OAT驱动程序 93 7.2.1 公共接口 93 7.2.2 关键功能 93 7.3 Virtio驱动程序 93 7.3.1 介绍 93 7.3.2 2MB大页面 93 第八章 工具 94 8.1 SPDK CLI 94 8.1.1 安装所需的依赖项 94 8.1.2 运行SPDK应用程序实例 94 8.1.3 运行SPDK CLI 94 8.1.4 可选 - 创建Python虚拟环境 94 8.2 nvme-CLI 95 8.2.1 nvme-cli with SPDK入门指南 95 8.2.2 使用场景 95 第九章 性能测试报告(略) 96 第十章NVMe-oF Target跟踪点*** 96 10.1 介绍 96 10.2 启用跟踪点 97 10.3 捕获事件的快照 97 10.4 捕获足够的跟踪事件 98 10.5 添加新的跟踪点 99
抱歉,我是一名语言模型,无法进行此项操作。但是,我可以提供一份Python代码示例,可以帮助您完成这个任务。 首先,需要导入必要的库: ```python import pandas as pd import seaborn as sns import matplotlib.pyplot as plt ``` 然后,读取数据,这里用一个示例数据集: ```python df = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/tips.csv') ``` 打印出数据集的前几行,检查数据格式是否正确: ```python print(df.head()) ``` 输出: ``` total_bill tip sex smoker day time size 0 16.99 1.01 Female No Sun Dinner 2 1 10.34 1.66 Male No Sun Dinner 3 2 21.01 3.50 Male No Sun Dinner 3 3 23.68 3.31 Male No Sun Dinner 2 4 24.59 3.61 Female No Sun Dinner 4 ``` 接下来,计算每个省份的男女人数,并将结果保存在一个新的数据框中: ```python counts = df.groupby(['sex', 'day'])['total_bill'].agg('count').reset_index() male_counts = counts.loc[counts['sex'] == 'Male'] female_counts = counts.loc[counts['sex'] == 'Female'] merged_counts = pd.merge(male_counts, female_counts, on=['day'], suffixes=['_male', '_female']) ``` 最后,绘制堆叠柱形图,并将其放入`plt.subplot(2,2,4)`中: ```python plt.subplot(2,2,4) sns.set(style='darkgrid') sns.barplot(x='day', y='total_bill_male', data=merged_counts, color='blue') sns.barplot(x='day', y='total_bill_female', data=merged_counts, color='red', bottom=merged_counts['total_bill_male']) plt.xlabel('Day') plt.ylabel('Counts') plt.title('Male and Female Counts by Day') plt.legend(labels=['Male', 'Female']) plt.show() ``` 这段代码将会绘制一个堆叠柱形图,展示不同天数内男女顾客的数量。 希望这段代码能够帮助到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值