SPDK v21.10
本次发布新功能速览:
- DMA库:添加DMA库,为处理含有多个内存域的系统和设备提供必要基础架构,支持在域间执行DMA传输。
- 完全异步的NVMe驱动程序:在控制器初始化和重置过程中删除了NVMe驱动的inline轮询。因此可以在集群解决方案中使用SPDK。
- SPDK 容器脚本:添加了一组脚本作为将 SPDK 封装到 docker 容器镜像中的示例。详情请参见spdk/docker/README.md文件。
- API调度器和改进:用于实现调度器和管理器插件的API已经变成Public API。详情请参见include/spdk/scheduler.h文件。另外还改进了 dynamic_scheduler,在运行低负载多线程的情况下,优先考虑性能选项,而非省电选项。
- Trace解析库:添加了Trace解析库,用于解析SPDK应用程序记录的Trace。该功能会合并多个CPU核的Trace,按时间戳进行排序,然后构建跨越多个缓冲区的Trace条目。
- IDXD perf工具:添加了测量IDXD性能的独立工具。
请访问https://github.com/spdk/spdk/releases/tag/v21.10,查看本次发布的完整原文。
本次发布包括619次提交,38,000个行代码更改,由47位作者共同完成。
在此特别感谢首次提交代码的以下几位贡献者:
Andreas Economides
Denis Nagorny
Liu Qing
Sydney Vanda
Tan Long
Tomasz Bielecki
Tomasz Rochumski
Xin Huang
Zhao Shushu
SPDK开源社区衷心感谢大家的参与、贡献和努力!
详细的发布说明如下:
bdev
添加了新的API spdk_bdev_get_memory_domains,允许获取bdev使用的SPDK内存域。
添加了新的API函数spdk_bdev_readv_blocks_ext和spdk_bdev_writev_blocks_ext。
这些新函数接受spdk_bdev_ext_io_opts结构来扩展IO请求选项,例如DMA内存域,其描述的数据可能属于另一个内存域,不能直接访问。
添加了async_fini_start和新的 API spdk_bdev_module_fini_start_done,允许bdev模块异步完成fini_start。
API spdk_bdev_module_finish_done()已被弃用, 在发布SPDK 22.01 时会将其删除。bdev 相关模块应该使用 spdk_bdev_module_fini_done() 来作为替代。
ocssd bdev 已被删除。Zoned namespaces代替了Open Channel规范。移除的原因是考虑到即使已经上市的设备也只会实现少部分的Open Channel规范,因此没有必要继续对其添加支持。nvme驱动中的OCSSD支持将暂时保留。
dma
添加了新的lib/dma库,为处理含多个内存域的系统和设备提供了必备基础架构。例如,一个带有SoC的PCIe附加卡可能在SoC上运行SPDK,该SoC本身有本地内存,但SPDK可以控制设备,支持访问主机系统内存。该库提供了枚举内存域的基础架构,请求硬件在域间进行DMA传输。
dpdk
DPDK子模块更新至DPDK 21.08版本。
event
对spdk_app_opts结构添加了disable_signal_handlers标志。
idxd
添加了spdk_idxd_get_socket查询idxd设备所在的套接字。
json
添加了允许编写和解码新类型的API:
spdk_json_write_named_uint16
spdk_json_write_named_uint8
spdk_json_write_uint16
spdk_json_write_uint8
spdk_json_number_to_uint8
spdk_json_decode_uint8
log
添加了API spdk_log_to_syslog_level,在SPDK Log日志级别基础上返回syslog系统日志。
nvme
添加了新的spdk_nvme_zns_set_zone_desc_ext和spdk_nvme_zns_ext_report_zones函数,分别用于设置区域描述符扩展、获取已扩展区域报告。
添加了新的API spdk_nvme_ctrlr_get_memory_domains,允许获取nvme控制器使用的SPDK内存域。
添加了新的API功能spdk_nvme_ns_cmd_readv_ext和spdk_nvme_ns_cmd_writev_ext。该功能接受spdk_nvme_ns_cmd_ext_io_opts结构,来支持扩展的IO请求选项,例如DMA内存域,用于描述属于另一个内存域而无法直接识别的数据。
添加了新函数spdk_nvme_ctrlr_get_regs_bpinfo,用于获取控制器的启动分区信息。
添加了spdk_nvme_ctrlr_write_boot_partition,spdk_nvme_ctrlr_read_boot_partition_start和spdk_nvme_ctrlr_read_boot_partition_poll新函数,支持写入和读取控制器的启动分区。
Added spdk_nvme_ctrlr_get_opts to retrieve the current controller options.
添加了spdk_nvme_ctrlr_get_opts以获取当前控制器选项。
为spdk_nvme_io_qpair_opts添加了async_mode,以便能够异步创建提交和完成的队列。目前,PCIe层可支持这种模式,用状态机追踪qpair的创建并立即返回给用户。
设置默认模式为false,同步来创建io qpairs。
添加了spdk_nvme_ctrlr_get_regs_cc函数来获取NVMe控制器CC(配置)寄存器。
添加了spdk_nvme_ctrlr_prepare_for_reset函数,以通知驱动程序:应用程序正准备重置指定的NVMe控制器。此函数允许驱动程序在即将发生复位的情况下做决定。
nvmf
为spdk_nvmf_ctrlr_data结构添加了oncs,传输层能够决策是否支持RESERVATION功能。
在 spdk_nvmf_ns_opts 结构中加入了 opts_size 元素,以解决不同 SPDK 版本之间的 ABI 兼容性问题。在spdk_nvmf_ns_opts结构中加入了一个新的选项anagrpid。
在RPC nvmf_subsystem_add_ns中添加了新参数anagrpid。
在 RPC nvmf_subsystem_listener_set_ana_state 中添加了新参数anagrpid。目前spdk_nvmf_subsystem_destroy 支持异步,它接受回调和回调参数。
在nvmf_set_config RPC中添加了新参数poll_groups_mask,允许为nvmf轮询组指定某部分CPU核。这有助于避免在一些CPU核执行定期定时器任务时,频繁运行,导致不平衡。
在nvmf_bdev_ctrlr_end_zcopy中添加了新参数commit,允许指示是否应该提交缓冲区。
在 spdk_nvmf_transport_ops 添加了 listen_dump_opts,以便传输层能够显示监听操作。
在 bdev_nvme_attach_controller RPC 添加了 fabrics_connect_timeout_us,允许指定连接操作超时。
在bdev_nvme_attach_controller RPC中添加了multipath,允许指定多路径行为。在spdk_nvmf_target_opts 结构扩展了新成员 discovery_filter,允许指定在发现日志生成期间应用的过滤规则。更多信息请参考enum spdk_nvmf_tgt_discovery_filter文件。
scheduler
添加了新的API实现调度器和管理器功能。请访问include/spdk/scheduler.h查看细节。
scsi
添加了spdk_scsi_dev_get_first_lun和spdk_scsi_dev_get_next_lun两个新功能,支持SCSI设备的LUNs遍历。
目前,每个SCSI设备最多能支持256个LUN,删除了宏常数SPDK_SCSI_DEV_MAX_LUN。
trace_parser
添加了新的lib/trace_parser库。该库的功能支持解析SPDK应用程序记录的traces。具体能够合并源自多个CPU核的traces,按照时间戳排序,同时构建跨越多个缓冲区的traces条目。
util
目前spdk_fd_group_add API使用name参数。
本次发布包含以下两个资源文件:
•Source code (zip)
•Source code (tar.gz)
请访问release page(https://github.com/spdk/spdk/releases/tag/v21.10)进行下载。
转载须知
DPDK与SPDK开源社区
公众号文章转载声明
推荐阅读
SPDK发布v21.07版本
基于TADK的应用分类
基于TADK的SQLI检测
2021美国峰会系列三 | SPDK性能基准测试
SPDK动态负载均衡
点点“赞”和“在看”,给我充点儿电吧~